午前2時のネットワーク障害にSNMPが役立たない理由
午前2時、ナイトテーブルの上でスマートフォンが激しく振動している。コア・アップリンクが悲鳴を上げているのだ。ZabbixでSNMPグラフを確認すると、10Gbpsで頭打ちの直線を描いており、危機的状況であることは間違いない。しかし、SNMPは「大まかな」道具だ。帯域がどれだけ使われているかは教えてくれるが、「誰が」使っているかは沈黙したままだ。バックアップ処理が予定時間を過ぎたのか?大規模なDDoS攻撃か?それとも、エンジニアがセグメント間で5TBのデータベースを移動させているだけなのか?
以前なら、個別のルーターにログインして手動でパケットキャプチャを実行したり、NATテーブルをスクレイピングしたりして解決していた。それは遅く、退屈で、後手に回る作業だった。これを解決するには、すべての接続のメタデータである「フローデータ」を取り込み、数秒で検索可能にするシステムが必要だ。私はこのスタックを、秒間5万フローを超える環境にデプロイしてきた。これは単に動作するだけでなく、ネットワークが最悪の状態にあるときでも安定して機能する。
選択肢:NetFlow vs. sFlow vs. パケットキャプチャ
スタックを構築する前に、データソースを選択する必要がある。ルーターやスイッチは、CPUに過度な負荷がかかるため、通常パケット全体をコレクターにミラーリングすることはない。代わりに、「フロー」と呼ばれるサマリー(要約)を送信する。
- NetFlow/IPFIX (ステートフル): ルーターがすべての接続をキャッシュする。セッション終了時に、送信元IP、送信先IP、ポート、総バイト数を含むサマリーをエクスポートする。課金用としては非常に正確だが、古いハードウェアではCPU負荷が高くなる可能性がある。
- sFlow (サンプリング): ハードウェアがN個のパケットにつき1個(例:2048個に1個)のスナップショットを取得する。スイッチングASICで処理されるため、CPUオーバーヘッドは事実上ゼロだ。これは100Gbpsクラスの高速バックボーンにおけるゴールドスタンダードである。
- パケットキャプチャ (フル):
tcpdumpやWiresharkをイメージしてほしい。アプリケーションのハンドシェイクのデバッグには最適だが、10Gbpsリンクの全キャプチャを保存しようとすれば、ペタバイト級のストレージが必要になる。
スタック構成:なぜAkvoradoとClickHouseなのか?
過去10年間、フロー分析の標準はELKスタック(Elasticsearch, Logstash, Kibana)だった。しかし、Elasticsearchは大量のRAMを消費し、高カーディナリティのログデータの扱いに苦労することで知られている。Akvoradoは、エンジンとしてClickHouseを採用することで、その常識を覆した。
ClickHouseは、速度を重視して設計された列指向データベースだ。従来のデータベースと比較してフローログを10分の1に圧縮でき、数十億行のクエリを1秒未満で処理できる。私の経験では、1台のClickHouseノードで、5台構成のElasticsearchクラスターと同等の働きをこなす。
Akvoradoエコシステムのメリットとデメリット
メリット
- 効率性: 控えめなハードウェアでも高速なデータ取り込みが可能。トラフィックスパイクを確認するためだけに128GBのRAMを用意する必要はない。
- オールインワン: Akvoradoには、インジェスター(取り込み器)、洗練されたWeb UI、スキーママネージャーが1つのパッケージにまとめられている。
- 自動エンリッチメント: フローをASNやGeoIPデータに自動的にマッピングする。トラフィックが地元のISPに向かっているのか、フランクフルトのデータセンターに向かっているのかを即座に把握できる。
トレードオフ
- ディスク使用量: 優れた圧縮性能があっても、トラフィックの多いネットワークで90日分のフローデータを保持するには、最終的に数テラバイトの高速なNVMeまたはSSDストレージが必要になる。
- 初期設定: 数台以上のデバイスを対象にスケールさせる場合は、ClickHouseのパーティション設定に慣れる必要がある。
推奨セットアップ構成
小規模な導入にはDocker Composeを好んで使用するが、トラフィックの増加に合わせてコンポーネントを複数のサーバーに分散させることも可能だ。
- エクスポーター: NetFlow (UDP 2055) または sFlow (UDP 6343) を送信するように設定されたCisco、MikroTik、Juniperなどのハードウェア。
- Akvorado Ingester: UDPパケットを受信し、バイナリデータをデコードし、GeoIP/BGPコンテキストを付与して、ClickHouseに書き込む。
- ClickHouse: レコードを保存する分析用エンジン。
- Akvorado Console: 実際にクエリを実行するダッシュボード。
実装ガイド
1. スタックのデプロイ
スタック用のディレクトリを作成し、以下の最適化された設定を使用する。nofileの制限に注意してほしい。ClickHouseが数千のデータパートを同時に扱うために必要だ。
# docker-compose.yml
version: '3.8'
services:
clickhouse:
image: clickhouse/clickhouse-server:latest
container_name: akvorado-clickhouse
volumes:
- ./ch-data:/var/lib/clickhouse
ulimits:
nofile:
soft: 262144
hard: 262144
akvorado:
image: akvorado/akvorado:latest
container_name: akvorado-orchestrator
ports:
- "2055:2055/udp" # NetFlow受信用
- "6343:6343/udp" # sFlow受信用
- "8080:8080" # Web UI用
environment:
- AKVORADO_CLICKHOUSE_SERVERS=clickhouse:9000
- AKVORADO_INGESTER_LISTEN_NETFLOW=0.0.0.0:2055
- AKVORADO_INGESTER_LISTEN_SFLOW=0.0.0.0:6343
depends_on:
- clickhouse
2. ハードウェアの設定
デバイスの送信先を新しいコレクターに設定する。代表的な2つのプラットフォームでの設定例を以下に示す。
MikroTik (Traffic Flow)
/ip traffic-flow
set enabled=yes interfaces=ether1 cache-entries=128k
/ip traffic-flow target
add dst-address=192.168.1.50 port=2055 version=9
Cisco (NetFlow v9)
interface GigabitEthernet0/1
ip flow ingress
ip flow egress
!
ip flow-export destination 192.168.1.50 2055
ip flow-export version 9
ip flow-cache timeout active 1
3. 結果の分析
http://<server-ip>:8080でUIを起動する。パケットがサーバーに届いていれば、60秒以内にグラフが表示される。まず最初に行うべきは「Top Talkers」の確認だ。SrcIPでグループ化し、Bytesでソートすれば、帯域を占有している犯人がすぐに判明する。社内のワークステーションがポート443経由で海外の見知らぬIPと通信している場合、特定のタイムスタンプを掘り下げて、それがデータ漏洩なのか、単なるWindows Updateなのかを確認できる。
大規模な本番環境からの教訓
複数の40Gbpsリンクを持つ本番環境に導入した際、いくつかのボトルネックに遭遇した。それを回避する方法を以下に記す。
- カーネルのチューニング: インジェスターがビジー状態になると、LinuxカーネルはUDPパケットをドロップする。
sysctl -w net.core.rmem_max=26214400を実行して、システムに25MBেরバッファを確保しよう。 - 積極的なサンプリング: 10Gbpsリンクで1:1のサンプリングを行おうとしてはいけない。1:2000や1:4000を使用する。Akvoradoは自動的に数値をスケールアップするため、合計値の正確性は保たれる。
- 保存ポリシーの設定: ClickHouseはハードドライブを使い果たすまでデータを保存し続ける。Akvoradoの
retentionを14日または30日に設定し、古いデータを自動的に削除するようにしよう。
可視化はすべてを変える。ネットワークがなぜ遅いのかを推測する代わりに、問題を解決するために必要な証拠を手にすることができる。午前2時の悪夢が、わずか5分の診断作業に変わるのだ。

