ネットワーク遅延の原因を推測するのはもうやめよう:AkvoradoとClickHouseによるリアルタイム・トラフィック分析

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

午前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を好んで使用するが、トラフィックの増加に合わせてコンポーネントを複数のサーバーに分散させることも可能だ。

  1. エクスポーター: NetFlow (UDP 2055) または sFlow (UDP 6343) を送信するように設定されたCisco、MikroTik、Juniperなどのハードウェア。
  2. Akvorado Ingester: UDPパケットを受信し、バイナリデータをデコードし、GeoIP/BGPコンテキストを付与して、ClickHouseに書き込む。
  3. ClickHouse: レコードを保存する分析用エンジン。
  4. 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分の診断作業に変わるのだ。

Share: