Linux環境でntopngとDPIを用いたLayer 7リアルタイムネットワークトラフィック解析を構築する

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

ネットワークトラフィック監視:アプローチの比較

標準的なインターフェースカウンターやSNMPグラフは、帯域がどれだけ使われているかを示してくれますが、何が帯域を消費しているかまではわかりません。深夜2時にアップリンク回線が逼迫した際、エンジニアチームは通常、以下の3つの可視化アプローチのいずれかに頼ることになります。

  • Layer 3/4フローアナライザー(NetFlow / sFlow / IPFIX):40Gbps以上のリンクを処理するコアルーターに最適です。ルーターがパケットヘッダーをサンプリング(多くの場合1,000パケットに1パケット)し、IPアドレスとポート番号ごとに接続を集約します。しかし問題は、ポート番号がもはや実際の通信内容を反映していない点にあります。想定外の80GBのバックアップ処理、Zoomのビデオ通話、正当なデータベースレプリケーションがすべてポート443上で動作する可能性があり、フローサンプリングではこれらを同一のものとして扱ってしまいます。
  • 生パケットキャプチャ(tcpdump / Wireshark):回線を通過するすべてのバイトをそのままキャプチャします。微細なプロトコルバグを徹底解析するためのゴールドスタンダードです。ただし、1Gbpsの逼迫したアップリンクをキャプチャすると、1時間あたり約450GBの生PCAPデータが生成されます。インシデント対応の現場で、それほどのデータ量を保存・インデックス化・クエリ処理するのは現実的ではありません。
  • リアルタイムディープパケットインスペクション(ntopng + nDPI):フロートラッキングの高速性とプロトコル解析を兼ね備えています。各セッションの最初の10〜15パケットのみを解析することで、組み込みのnDPIライブラリがTLS SNIヘッダー、DNSクエリ、HTTPメタデータを検査します。全ペイロードを保存することなくトラフィックを分類できるため、CPUやディスク使用量を最小限に抑えられます。

ntopngによるLayer 7 DPIのメリットとデメリット

どのような監視アーキテクチャにもトレードオフが存在します。環境にntopngを導入する前に検討すべきポイントは以下のとおりです。

メリット

  • 高精度なプロトコル検出:ポート番号ではなく、振る舞いやハンドシェイクのメタデータに基づいてトラフィックを識別します。標準ポートに隠蔽されている場合でも、BitTorrent、Zoom、GitHub API呼び出し、データベーストラフィックなどを確実に検出します。
  • リアルタイムなTCPヘルス指標:ホストごとのラウンドトリップタイム(RTT)、パケット再送率、順序乱れパケット(Out-of-order)をリアルタイムで追跡します。
  • 最小限のディスクI/O:巨大なPCAPファイルをディスクに書き込む必要がありません。アクティブなフロー状態はメモリおよびローカルのRedisキー上に保持され、長期トレンド分析用には軽量な集計データのみが書き出されます。
  • エージェントレス監視:ネットワークTAPやスイッチのミラーポート(SPAN)を使用して完全にアウトオブバンドで動作します。本番サーバーに手を加えたりエージェントをインストールしたりする必要はありません。

デメリット

  • メモリ要件のサイジング:ステートフルな追跡には専用のRAMが必要です。アクティブな同時接続フロー10万件あたり、およそ1GB〜2GBのメモリを見積もる必要があります。突発的なSYNフラッド攻撃によってステートテーブルが枯渇した場合、ntopngは新しいフローレコードをドロップします。
  • 高速リンクにおけるカーネルオーバーヘッド:標準のLinuxソケットキャプチャでは、トラフィックが3Gbps〜5Gbpsを超えるとパケットドロップが発生し始めます。帯域が逼迫した10Gbps以上のアップリンクには、PF_RING ZCやAF_XDPなどのゼロコピー型カーネルバイパスドライバーが必要です。
  • ペイロードの復号は不可:nDPIが解析するのはTLS Client Helloに含まれる初期ハンドシェイク、暗号スイートのネゴシエーション、ドメイン名などです。暗号化されたリクエストボディやアプリケーションデータの中身までは検査できません。

推奨される本番アーキテクチャ

専用のタッピングインスタンスを用意することで、大量のダンプファイルに追われることなく、帯域インシデント発生時に迅速な状況把握が可能になります。

1Gbps〜10Gbpsリンクで安定したキャプチャを行うには、2つの物理ネットワークインターフェースを備えた専用のLinuxサーバーをセットアップします。

  • eth0:管理用インターフェース。SSHアクセスおよびWeb UI用に、隔離された内部IPアドレスを割り当てます。
  • eth1:専用のキャプチャインターフェース。IPアドレスを割り当てずにプロミスキャスモードで動作させ、ネットワークTAPまたはスイッチのSPANポートに直接接続します。
  • Redis:高速なインメモリフローカウンターおよびホストテーブルを保持するため、ローカルの127.0.0.1:6379にバインドします。

ステップ別導入ガイド

本導入ガイドでは、最新のプロトコルシグネチャを利用するために公式ntopリポジトリのビルドを使用し、Ubuntu 22.04およびDebian 12 LTSを対象としています。

ステップ 1:Redisおよび基本依存関係のインストール

前提パッケージをインストールし、Redisを起動します。

sudo apt update && sudo apt install -y software-properties-common wget curl lsb-release gnupg redis-server

# Redisの有効化と稼働確認
sudo systemctl enable --now redis-server
sudo redis-cli ping
# 期待される出力: PONG

公式のntopリポジトリパッケージを追加します。

# リポジトリ定義のダウンロードとインストール
wget https://packages.ntop.org/apt/22.04/all/apt-ntop.deb
sudo dpkg -i apt-ntop.deb

# リポジトリメタデータの更新
sudo apt update

ステップ 2:ntopngとnDPIのインストール

ntopngとあわせて、nDPIプロトコルライブラリおよびオプションのPF_RINGカーネルモジュールサポートをインストールします。

sudo apt install -y ntopng pfring-dkms

ステップ 3:ntopngの設定

ntopngは起動フラグを/etc/ntopng/ntopng.confから読み込みます。設定ファイルを開きます。

sudo nano /etc/ntopng/ntopng.conf

ファイルの内容を以下の設定に置き換えます。eth1をご利用のキャプチャインターフェースに合わせて変更し、サブネットCIDRを環境に合わせて調整してください。

# プロセスデーモンのPIDファイル
-G=/var/run/ntopng.pid

# HTTP待受ポート
-w=3000

# 専用キャプチャインターフェース(プロミスキャス、IPなし)
-i=eth1

# 内部・外部トラフィックのルーティング判定用ローカルサブネット定義
-m=192.168.1.0/24,10.0.0.0/8

# Redisインスタンスのエンドポイント
-r=127.0.0.1:6379

# 高トラフィック時のCPU負荷を低減するためアクティブなDNS名前解決を無効化
-n=1

# コミュニティライセンスモード
--community

ステップ 4:キャプチャインターフェースの設定

自身のMACアドレス宛ではないフレームをキャプチャするため、監視インターフェースをプロミスキャスモードで動作させる必要があります。

sudo ip link set dev eth1 promisc on
sudo ip link set dev eth1 up

再起動後もプロミスキャスモードを維持するためにsystemdユニットを作成します。

sudo tee /etc/systemd/system/promisc-interface.service << 'EOF'
[Unit]
Description=キャプチャインターフェースのプロミスキャスモード有効化
After=network.target

[Service]
Type=oneshot
ExecStart=/sbin/ip link set dev eth1 promisc on
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable promisc-interface.service

ステップ 5:ntopngの起動とログイン

サービスを起動し、初期化エラーがないかsystemdのジャーナルログを確認します。

sudo systemctl restart ntopng
sudo systemctl enable ntopng
sudo journalctl -u ntopng -f

ブラウザで http://<server-management-ip>:3000 にアクセスします。

  • デフォルトユーザー名:admin
  • デフォルトパスワード:admin

ダッシュボードへアクセスする前に、デフォルトパスワードの変更画面が自動的に表示されます。

ステップ 6:実践的なトラブルシューティング手順

キャプチャインターフェースにトラフィックが流入したら、以下の画面を活用して運用の問題を診断します。

  1. 帯域を大量消費している通信の特定:Flows > Active Flows に移動し、Throughput(スループット)でソートします。Application 列を確認し、帯域急増の原因がデータベースの同期トラフィック(PostgreSQL)、クラウドアタッチストレージへの一括転送(AmazonAWS.S3)、あるいはバックグラウンドでのシステムアップデートなのかを判別します。
  2. パケット損失とネットワーク遅延の診断:Hosts > Local Hosts に移動して対象サーバーを選択し、TCP / Metrics を開きます。TCP再送率が1.5%を超えている場合や、クライアント・サーバー間のRTTが100msを超えている場合は、LANケーブルの不良、デュプレックスの不一致、スイッチバッファの輻輳などが疑われます。
  3. 不審な外部向け通信の検知:Alerts パネルを開いてリアルタイムのセキュリティ警告を確認します。秒間DNSクエリ数の異常な急増、Webサーバーからの予期しない外部SSH接続、信頼できないIPアドレス帯への不審なTLSハンドシェイクなどを検知・調査します。
Share: