午前2時の帯域スパイクを解決する:NetFlowとntopngによる実践的なトラフィック分析

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

午前2時の帯域スパイク:ログだけでは不十分な理由

先月、午前2時14分に本番クラスターの1つで850 Mbpsの帯域スパイクが発生しました。AWSからの課金アラートは、標準のモニタリングダッシュボードが反応する前に届きました。私は1時間かけてログを調査し、さまざまなインターフェースで<a href="https://itnotes.dev/ja/tcpdump-linux%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%83%a9%e3%82%a4%e3%83%b3%e3%81%8b%e3%82%89%e3%81%ae%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%af%e3%83%91%e3%82%b1%e3%83%83%e3%83%88/">tcpdump</a>を実行しようとしましたが、結局、数百万ものパケットの山から針を探しているようなものだと気づきました。topvnstatのような標準ツールは、インターフェースが飽和していることは教えてくれますが、*誰が*それを行っているのか、トラフィックが*どこへ*向かっているのかまでは教えてくれませんでした。

ここでフローベースの分析が真価を発揮します。10Gbps以上のリンクでは計算負荷が高くスケールが不可能な全パケットの調査の代わりに、メタデータに注目します。このアプローチにより、単一の画面からインフラ全体の「全体像」を把握できるようになります。

アプローチの比較:パケットキャプチャ vs フロー分析

他のエンジニアとネットワークの可視性について話すと、Wiresharktcpdumpのようなパケットキャプチャツールを真っ先に思い浮かべることが多いです. これらはプロトコルエラーのデバッグには不可欠ですが、高トラフィック環境を長期間監視する場合には適していません。

パケットキャプチャ(ディープパケットインスペクション)

パケットキャプチャは、郵便局にあるすべての封筒を開けて中の手紙を読むようなものだと考えてください。ペイロード(中身)を含む100%の可視性が得られます。しかし、1秒間に10万通の封筒が届くなら、それを読むために軍隊が必要になります。また、保存するためのスペースもすぐになくなってしまいます。10Gbpsのリンクがフル稼働している場合、毎秒約1.2 GBのデータをディスクに書き込むことになります。これは、たった1つのインターフェースだけで1時間あたり4 TB以上のデータになります。

フロー分析(メタデータインスペクション)

フロー分析は、封筒の外側を見るようなものです。送信者の住所、受信者の住所、タイムスタンプ、そし​​て重さを記録します。手紙の内容はわかりませんが、誰が誰と話し、どれだけのデータがやり取りされているかは正確に把握できます。これがNetFlowやsFlowの仕組みです。パケットを「フロー」として集約し、5つの要素(送信元IP、宛先IP、送信元ポート、宛先ポート、プロトコル)に基づいて管理します。

このスキルを習得することは不可欠です。これにより、モニタリング用のハードウェアに多額の費用をかけることなく、安定したハイパフォーマンスなインフラを維持できるようになります。

メリットとデメリット:NetFlow、sFlow、IPFIX

適切なプロトコルの選択は、使用しているハードウェアに大きく依存します。私は本番環境でこれら3つすべてを扱ってきました。それぞれの特徴は以下の通りです。

  • NetFlow (v5/v9): もともとはCisco独自のプロトコルでしたが、現在は広くサポートされています。NetFlowはステートフルです。ルーターはアクティブなフローのキャッシュを保持し、有効期限が切れるとそれらをエクスポートします。
    • メリット: 非常に詳細で、セキュリティ監査に最適。
    • デメリット: リソース消費量が多い。負荷の高いルーターでは、10万件のアクティブエントリを持つフローテーブルが簡単に200MB以上のRAMを消費します。
  • sFlow (Sampled Flow): マルチベンダー標準。NetFlowとは異なり、sFlowはステートレスです。N個のパケットにつき1つ(例:2,048個に1つ)をサンプリングし、ヘッダーをコレクターに送信します。
    • メリット: スイッチへの負荷がほぼゼロ。40Gや100Gのバックボーンリンクに最適です。
    • デメリット: 統計的な近似値であること。単一パケットの「Ping of Death」や、非常に小さく短期間のフローを見逃す可能性があります。
  • IPFIX (IP Flow Information Export): NetFlow v9に基づいたIETF標準。NetFlowの現代的でベンダーニュートラルなバージョンです。
    • メリット: 拡張性が高い。非IPデータや、HTTP URL、TCPウィンドウサイズなどのカスタムフィールドをエクスポートできます。
    • デメリット: サポート状況が異なる。古いレガシーハードウェアでは対応していないことがあります。

セットアップ:ntopng、nProbe、softflowd

堅牢なオープンソーススタックとして、ntopngnProbeまたはsoftflowdの組み合わせをお勧めします。ntopngが可視化を担当し、他のコンポーネントがエクスポートまたは収集を行います。高価なCiscoスイッチは必要ありません。Linuxゲートウェイにソフトウェアエクスポーターをインストールして、フローレポートノードに変えることができます。

アーキテクチャ

  1. エクスポーター: softflowdを実行しているルーターやLinuxサーバー。トラフィックを監視し、フローレコードをコレクターに送信します。
  2. コレクター/アナライザー: ntopng。これらのレコードを受信し、ClickHouseなどのデータベースに保存します。その後、ウェブインターフェースを提供します。

実装:Ubuntuでのntopngのセットアップ

Ubuntuシステムでこれを動かしてみましょう。ダッシュボードにはntopngを使用し、エクスポーターとしてsoftflowdを使用します。

1. ntopngのインストール

最新の安定版を入手するために、公式のntopリポジトリを追加します。デフォルトのUbuntuリポジトリにあるバージョンは避けてください。それらは多くの場合3年前のもので、現代的な機能が不足しています。

# ntopリポジトリの追加
wget http://apt.ntop.org/$(lsb_release -sc)/all/apt-ntop.deb
sudo dpkg -i apt-ntop.deb

# アップデートとインストール
sudo apt update
sudo apt install ntopng nprobe

2. ntopngの設定

設定ファイルを編集します。ntopngを単なるローカルインターフェースのスニッフィングではなく、コレクターとして動作させたいと考えています。

sudo nano /etc/ntopng/ntopng.conf

ZeroMQ経由でポート5555でデータを収集するために、以下の行を追加します:

-i=view:all
-i=tcp://127.0.0.1:5555
-w=3000
-d=/var/lib/ntopng

3. softflowdのセットアップ

ルーターがNetFlowをサポートしていない場合は、サーバー自体でsoftflowdを使用します。このツールにより、LinuxマシンをNetFlow対応デバイスに変えることができます。

sudo apt install softflowd

# eth0のトラフィックをポート2055のコレクターにエクスポートする
sudo softflowd -i eth0 -n 127.0.0.1:2055 -v 9

4. nProbeによるブリッジング

ntopngはしばしばnProbeをプロキシとして使用します。nProbeは生のNetFlow(ポート2055)を収集し、ntopngが完全に理解できる形式でntopng(ポート5555)に転送します。

# 2055でNetFlowを収集し、5555のntopngに転送する
sudo nprobe --zmq "tcp://*:5555" -i none -n none --collector-port 2055

実世界でのトラブルシューティング

http://your-server-ip:3000のダッシュボードにログインすると、豊富なデータが表示されます。問題が発生した際の私の活用法を紹介します:

  • 「Top Talkers(主要な通信者)」を見つける: *Hosts*セクションをスループットでソートします。以前、この方法でビジネスのピーク時に1.5 TBのデータを同期しようとしていた設定ミスのバックアップスクリプトを見つけました。特定にかかった時間はわずか30秒でした。
  • DDoSの検知: *Flows*タブを確認します。一意の外部IPから1つの内部IPに対して、すべて少量のバイト数のフローが5万件も発生している場合、SYNフラッド攻撃を受けています。
  • アプリケーションの可視化: ntopngはnDPIを使用してアプリケーションを推測します。その暗号化されたトラフィックがAWS S3へのアップロードなのか、単にオフィスで誰かがNetflixを見ているだけなのかを判別できます。

「フローの有効期限(Flow Expiration)」設定に注意してください。フローの期限が早すぎるとグラフがガタガタになり、長すぎると「リアルタイム」データに遅延が生じます。最適なバランスとして、アクティブなフローが60秒ごとに期限切れになるように設定してください。

フローベースのモニタリングに移行することで、現代のネットワークに必要なハイレベルな可視性が得られます。パケットキャプチャが「どのように(How)」を説明するのに対し、NetFlowは「誰が、何を、どこで(Who, What, Where)」を教えてくれます。両方をツールキットに加えることで、次のスパイクが発生したときに盲目状態で対応することを防げます。

Share: