Oracle Linuxサーバーで、どこへ、どのような通信が、どれくらい流れているのかを見たくなりました。
これまではZabbixで稼働状況を監視し、Grafanaで送受信量や接続数を表示していました。今回はそこから一歩進めて、通信先やアプリケーション別の内訳を確認できる ntopng Community版を導入しました。
構成は Oracle Linux 10.2+Podman+ntopng+Redis。操作画面は、同じLANにあるMac miniのブラウザから開きます。
この記事では、実際に使用した構成と設定をまとめます。構築スクリプトはGitHubで公開し、データの永続保存とOS起動時の自動起動まで設定できるようにしました。
- 今回の環境
- ntopngとRedisの構成
- 1. ポートとリソースを確認する
- 2. ntopng公式イメージを取得する
- 3. コンテナ内の実行ユーザーを確認する
- 4. 構築スクリプトを実行する
- 5. 起動設定のポイント
- 6. Macからの接続だけを許可する
- 7. OS起動時に自動起動する
- 8. ブラウザからログインする
- 9. 実際に見えた通信
- 10. 運用時の確認コマンド
- 構築時に気を付けたこと
- おわりに
- 参考資料
今回の環境
【ここに環境構成図を挿入】
| 項目 | 構成 |
|---|---|
| 観測サーバー | Oracle Linux Server 10.2/x86_64 |
| Podman | 5.8.2(構築時) |
| サーバーのメモリ | 約7.1GiB |
| 観測インターフェース | wlan0 |
| OracleのIPv4アドレス | 192.168.3.200/24 |
| 閲覧用端末 | Mac mini |
| MacのIPv4アドレス | 192.168.3.10 |
| ntopngの画面 | http://192.168.3.200:3001/ |
| ファイアウォール | firewalld/wlan0はpublicゾーン |
| SELinux | Enforcingを維持 |
IPアドレスとインターフェース名は、この環境で使用した例です。別の環境では読み替えてください。
すでにGrafanaがTCP/3000を使用していたため、ntopngのHTTP画面には TCP/3001を使います。既存のSSH、Zabbix Agent、Grafanaの設定は変更しません。
観測できる範囲
最初に押さえておきたいのは、今回観測するのは Oracle Linux自身のwlan0を通る通信という点です。
Oracleに届くping、MacからOracleへのSSH、Oracleから外部への通信などは観測できます。一方、Macが別のWebサイトへアクセスした通信など、Oracleを通らないユニキャスト通信まで一括で見られる構成ではありません。
家庭内LAN全体や、ルーターで遮断されたWAN側の通信を観測するには、別途ミラーリングなどの観測経路が必要です。
ntopngとRedisの構成
ntopngは通信を解析し、Web画面へ表示します。Redisはユーザー設定や各種状態の保存などに使われます。
今回作成したコンテナは次の2つです。
| コンテナ | 役割 | ネットワーク |
|---|---|---|
oracle-ntopng |
wlan0の通信取得・解析・画面表示 |
ホストネットワークを使用 |
oracle-ntopng-redis |
ntopng専用のRedis | --network=none |
2つのコンテナ間は、共有ボリューム内の Unixドメインソケットで接続します。RedisのTCPポートは無効にしているため、6379番をLANへ公開する必要はありません。
公式イメージの起動スクリプトはRedisとntopngをまとめて起動する形ですが、今回はそれぞれの実行ファイルを直接起動し、コンテナを分けました。
どちらも同じntopng公式イメージを使っています。このイメージにRedisの実行ファイルも含まれていることを確認したうえで再利用しています。
1. ポートとリソースを確認する
以下の操作は、特に記載がない限りOracle Linux側で実行します。
ip -br addr show wlan0 sudo ss -lntup '( sport = :3001 or sport = :6379 )' free -h df -h /var
構築時は3001番・6379番とも未使用で、利用可能メモリは約5.5GiB、/varを含むファイルシステムには約66GBの空きがありました。
Podmanと通信確認用のtcpdumpが未導入なら、先にインストールします。
sudo dnf install podman tcpdump
短時間のパケット取得を確認するには、次のコマンドを使えます。
sudo timeout 10 tcpdump -p -i wlan0 -nn -c 5
これは最大10秒、または5パケットを取得するまで動きます。-pでプロミスキャスモードを使わず、-nnでIPアドレスやポートの名前解決を省略しています。
このtcpdumpは事前確認用で、ntopngの常時観測とは独立したものです。
2. ntopng公式イメージを取得する
ntopngの公式イメージを取得します。
sudo podman pull docker.io/ntop/ntopng:latest
今回のntopngはホストのインターフェースを観測するため、rootfulのPodmanで動かします。以後、この構成を操作するときはsudo podmanを使います。
一般ユーザーのpodmanとはコンテナやイメージの保存先が異なります。既存のrootlessコンテナ一覧にntopngが表示されなくても、異常ではありません。
取得したイメージは次で確認できます。
sudo podman image inspect docker.io/ntop/ntopng:latest \
--format 'User={{.Config.User}} Entrypoint={{json .Config.Entrypoint}} Digests={{json .RepoDigests}}'
今回取得したダイジェストは次のとおりです。
docker.io/ntop/ntopng@sha256:ff10ac189bf3deaf47f8b6916ecd4992964cae0263062ab79c5775a1a132e879
構築スクリプトではこのダイジェストを指定し、--pull=neverで意図しないイメージ変更を避けています。将来別バージョンへ更新する際は、そのイメージで設定や実行ユーザーを再確認します。
3. コンテナ内の実行ユーザーを確認する
今回のイメージでは、次のユーザーを確認できました。
| ユーザー | UID | GID |
|---|---|---|
| ntopng | 999 | 995 |
| redis | 101 | 102 |
確認には、ネットワークを持たない一時コンテナを使います。
sudo podman run --rm \ --network=none \ --cap-drop=ALL \ --security-opt=no-new-privileges \ --read-only \ --entrypoint=/bin/sh \ docker.io/ntop/ntopng@sha256:ff10ac189bf3deaf47f8b6916ecd4992964cae0263062ab79c5775a1a132e879 \ -c 'id ntopng; id redis; command -v ntopng; command -v redis-server'
UID/GIDは、別のイメージでも同じとは限りません。GitHubで公開したスクリプトの所有者設定は、このダイジェストのイメージに合わせたものです。
4. 構築スクリプトを実行する
手順が長くなるため、コンテナ作成、保存先の準備、firewalld、systemdの登録をスクリプトにまとめました。
構築スクリプトは次のGitHubリポジトリに掲載しています。
oracle-linux-ntopng:構築スクリプトとREADME
リポジトリからinstall-ntopng-monitor.shを保存し、READMEとスクリプトの内容を確認します。
このスクリプトは、今回の環境を前提にしています。別の環境へ導入する際は、少なくとも次を変更してください。
| 設定 | 今回の値 |
|---|---|
| 観測インターフェース | wlan0 |
| サーバーのアドレス | 192.168.3.200 |
| 閲覧を許可する端末 | 192.168.3.10/32 |
| ローカルネットワーク | 192.168.3.0/24 |
| インターフェースのfirewalldゾーン | public |
スクリプト内の事前確認条件と起動引数の両方を合わせます。条件が一致しない場合は、設定変更前に停止します。なお、既存コンテナは再作成しないため、引数を変更して再実行するだけでは設定は反映されません。初回構築の手順として使用します。
Macから転送する場合は、まずOracle側に作業ディレクトリを用意します。ユーザー名takaraは適宜読み替えてください。
# Mac側で実行 ssh takara@192.168.3.200 'mkdir -p ~/ntopng-setup' scp install-ntopng-monitor.sh takara@192.168.3.200:/home/takara/ntopng-setup/
Oracle側で内容を確認してから実行します。
sudo bash /home/takara/ntopng-setup/install-ntopng-monitor.sh
スクリプトは専用コンテナとサービスを作成し、HTTP画面が応答するかを確認します。これは既存のイメージを使う構成なので、先にイメージを取得しておく必要があります。
5. 起動設定のポイント
ntopngはホストネットワークで観測する
oracle-ntopngには--network=hostを指定し、ホストのwlan0を観測させます。
通常の独立したコンテナネットワーク内では、そのコンテナからホストのwlan0をそのまま観測できないためです。
パケット取得権限を持つ構成なので、rootlessと同等の隔離とは考えません。--privilegedは使用せず、全Capabilityをいったん落として、起動処理に使用するものを明示しています。
NET_RAW SETUID SETGID CHOWN DAC_OVERRIDE
NET_RAWはパケット取得、その他はユーザー切り替えやファイル操作に関わる権限です。ntopngはrootで起動し、--user=ntopngで実行ユーザーを切り替える設定にしています。
また、--no-promiscを指定し、プロミスキャスモードへの変更は行いません。SELinuxも無効化していません。
Web画面のアドレスとポートを固定する
主なntopngの引数は次のとおりです。
--community --interface=wlan0 --no-promisc --http-port=192.168.3.200:3001 --https-port=0 --redis=/run/ntop-redis/redis.sock --user=ntopng --data-dir=/var/lib/ntopng --local-networks=192.168.3.0/24 --dns-mode=2 --offline --max-num-flows=16384 --max-num-hosts=2048
HTTPはIPv4の指定アドレスだけにバインドし、HTTPSの待ち受けは無効にしています。ホストネットワークを使うので、-pによるポート公開ではなく、ntopng側の待ち受け設定が重要です。
--offlineはntopngから外部サイトなどへの問い合わせを抑える設定です。ホストやコンテナの発信をファイアウォールで遮断する設定ではありません。 また、観測対象の通信そのものを停止するものでもありません。
各引数の意味は公式のコマンドラインオプションで確認できます。
Redisにはネットワークを与えない
RedisはUID/GIDを101:102に指定し、--network=none、--cap-drop=ALLで起動します。
TCPを無効にして、次のUnixドメインソケットを使用します。
--port 0 --unixsocket /run/ntop-redis/redis.sock --unixsocketperm 666
RedisとntopngのUIDが異なるため、ソケットは双方が接続できるパーミッションにしています。ソケット用ボリュームを渡すのはこの2コンテナだけとし、一般ユーザー向けの共用ディレクトリには配置していません。
ntopng側ではソケット用ボリュームを読み取り専用でマウントします。ただし、読み取り専用マウントでもRedisへのコマンド送信は可能であり、データベースを読み取り専用にする意味ではありません。
データを保存する
次の3つの名前付きボリュームを作成します。
| ボリューム | 用途 |
|---|---|
oracle-ntopng-data |
ntopngのデータ |
oracle-ntopng-redis-data |
Redisの永続データ |
oracle-ntopng-redis-socket |
コンテナ間接続用ソケット |
初期化用の一時コンテナで、これらの専用ボリュームの所有者を各プロセスに合わせます。
SELinuxラベルは、単独使用するデータ用ボリュームに:Z、共有ソケット用ボリュームに:zを指定しています。
RedisはAOFを有効にし、appendfsync everysecで保存します。これは障害時のデータ損失をゼロにする設定ではなく、バックアップの代わりでもありません。
なお、この構成は全パケットをPCAPで保存したり、全フローを長期間アーカイブしたりする設定ではありません。
リソース使用量を制限する
| 対象 | メモリ上限 | CPU上限 | プロセス数上限 |
|---|---|---|---|
| ntopng | 1GiB | 1 CPU相当 | 128 |
| Redis | 512MiB | 0.5 CPU相当 | 64 |
Redisには別途256MiBのmaxmemoryを設定しています。ポリシーはnoevictionなので、上限に達すると書き込みエラーになる場合があります。
コンテナの標準出力・標準エラーのログには、それぞれ10MBの上限を指定しています。ただし、永続ボリューム全体にディスク容量制限を設定したわけではありません。 稼働後は使用量も確認します。
6. Macからの接続だけを許可する
firewalldには、MacのIPv4アドレスから3001番への接続を許可するrich ruleを追加します。
sudo firewall-cmd --zone=public \ --add-rich-rule='rule family="ipv4" source address="192.168.3.10/32" port port="3001" protocol="tcp" accept' sudo firewall-cmd --permanent --zone=public \ --add-rich-rule='rule family="ipv4" source address="192.168.3.10/32" port port="3001" protocol="tcp" accept'
GitHubで公開したスクリプトも同じルールを追加します。すでに実行済みなら、改めて追加する必要はありません。
今回のpublicゾーンでは、3001番を全端末へ許可するルールはありません。他の許可ルールやゾーンがある環境では、合わせて確認します。
送信元をIPアドレスで絞る設定は、MacのIPが変わると接続できなくなるため、DHCP予約などでアドレスを安定させておくと運用しやすくなります。
今回は信頼するLAN内でHTTPを使用しています。送信元IPを制限しても、HTTPのログイン通信自体が暗号化されるわけではありません。 共有ネットワークや外部から利用する場合は、HTTPSやSSHトンネルなどを別途検討します。
7. OS起動時に自動起動する
今回は既存コンテナを起動するsystemdサービスを、システム側に登録しました。
/etc/systemd/system/oracle-ntopng-redis.service /etc/systemd/system/oracle-ntopng.service
rootfulのシステムサービスなので、takaraのSSHログインやユーザーサービスの起動を待つ構成ではありません。
ntopng側はRedisとネットワークの起動後に開始し、起動前にRedisへPINGを送って接続を確認します。起動失敗時は10秒後に再試行します。
重要な部分を抜き出すと、次のような設定です。
[Unit] Wants=network-online.target oracle-ntopng-redis.service After=network-online.target oracle-ntopng-redis.service StartLimitIntervalSec=0 [Service] Type=simple ExecStartPre=/usr/bin/podman exec oracle-ntopng-redis /usr/bin/redis-cli -s /run/ntop-redis/redis.sock ping ExecStart=/usr/bin/podman start --attach --sig-proxy=false oracle-ntopng ExecStop=/usr/bin/podman stop --ignore --time 30 oracle-ntopng Restart=always RestartSec=10 TimeoutStopSec=60 [Install] WantedBy=multi-user.target
実際のファイルでは、インストーラーが検出したPodmanの絶対パスを使用します。
登録状態と稼働状態を確認します。
sudo systemctl is-enabled oracle-ntopng-redis.service oracle-ntopng.service sudo systemctl is-active oracle-ntopng-redis.service oracle-ntopng.service
enabledは自動起動の登録状態、activeは現在の稼働状態です。登録だけで満足せず、実際のOS再起動後にも確認します。
8. ブラウザからログインする
Macのブラウザで、次のアドレスを開きます。
http://192.168.3.200:3001/
初期ログイン情報は次のとおりです。
ユーザー名:admin パスワード:admin
ログイン後にパスワードを変更しました。実際のパスワードは記事や構成ファイルへ掲載しません。
今回、ログインとパスワード変更ができ、wlan0のダッシュボードを開けることを確認しました。
9. 実際に見えた通信
【ここにntopngダッシュボードの画像を挿入】
画面には、MacとOracle間の通信が表示されました。アプリケーション別の表示には、Zabbix、ntop、ICMPv6、JSON、Unknownなどが並んでいます。
ここで面白かったのは、監視ツール自身の通信も見えることです。
- Zabbixによる監視通信
- Macのブラウザでntopng画面を見る通信
- 既存のGrafana画面を表示・更新する通信
「自分は何もしていない」と思っていても、監視や画面更新の通信は発生しています。
また、Unknownは分類できなかった通信であり、それだけで不正な通信と判断するものではありません。グラフの色だけで安全・危険を決めず、接続先やフロー詳細を確認します。
Community版の画面では、Top Talkers、Hosts、Applications、Classificationなどを確認できます。機能や画面はエディションによって異なります。公式のダッシュボード説明
pingで通信を発生させる
観測を試す方法として、MacからOracleへpingを送れます。
# Mac側で実行 ping -c 30 -s 1400 192.168.3.200
ntopngのフロー一覧で、MacとOracle間のICMP通信やパケット数の変化を確認します。
pingはICMPなので、TCP接続数やUDPソケット数とは別です。以前作成したソケット一覧の監視と、パケットを観測するntopngの違いを試す題材になります。
HTTPSの通信を観測する
外部への通信を試す場合は、Oracle側で実行します。
curl -I https://example.com
外部IPへの443番通信や、TLS系の分類を確認する実験です。分類結果は通信内容や取得できる情報によって変わります。
HTTPSの本文が読めるわけではありません。ntopngでは、取得できた通信メタデータやプロトコル情報を基に観測します。
10. 運用時の確認コマンド
コンテナの状態
sudo podman ps -a --filter label=io.codex.oracle-ntopng=1
ntopngのログ
sudo podman logs --tail=50 oracle-ntopng
Redisのログ
sudo podman logs --tail=30 oracle-ntopng-redis
HTTPと待ち受けの確認
curl --max-time 5 -I http://192.168.3.200:3001/ sudo ss -lntp '( sport = :3001 or sport = :6379 )'
この構成ではHTTPの3001番を使用し、Redisの6379番は使用しません。
サービスの再起動
sudo systemctl restart oracle-ntopng.service
ntopngだけの設定変更なら、通常はOracle Linux本体を再起動する必要はありません。
OS再起動後の確認
再起動によるSSH切断やサービス停止を許容できるタイミングで、別途検証します。
sudo reboot
再起動後、次を確認します。
sudo systemctl is-active oracle-ntopng-redis.service oracle-ntopng.service sudo podman ps -a --filter label=io.codex.oracle-ntopng=1
Macから画面を開き、wlan0の通信カウンターやフローが更新されるところまで確認します。この記事で確認済みなのは導入後の画面表示と通信分類で、自動起動の登録と実際の再起動試験は区別しています。
構築時に気を付けたこと
Redisの設定ファイルをそのまま読めるとは限らない
確認用コンテナでCapabilityをすべて落とした状態では、/etc/redis/redis.confの読み取りがPermission deniedになりました。
そのため、既存のRedis設定ファイルに依存せず、実行引数でUnixソケットや保存先を指定する構成にしました。確認コマンドでの読み取り失敗だけを根拠に、SELinuxやホスト全体の保護を解除することはしていません。
ブラウザが開けることと、通信取得できることは別
HTTP画面が応答していても、観測インターフェースや取得権限に問題があれば、期待する通信は表示されません。
画面表示に加え、インターフェースがwlan0になっていること、実際の通信でカウンターが進むことを確認します。
アクティブモニタリングは別機能
「アクティブモニタリングが無効」と表示されても、通常の通信観測が停止している意味ではありません。
アクティブモニタリングはntopng自身から定期的に通信を送り、到達性や応答時間などを調べる機能です。今回のパッシブな通信観測とは分けて扱います。
おわりに
Oracle Linuxにntopngを追加することで、送受信量のグラフだけでは分かりにくかった、通信相手やアプリケーション別の内訳を確認できるようになりました。
特に、Zabbixやntopng自身の通信が見えるため、普段使っている監視の仕組みも通信として観察できるのが面白いところです。
今後は、フロー詳細の確認、観測データの保存量の管理、必要に応じた観測範囲の拡張を試していきたいと思います。











