コンテンツにスキップ

トラフィックフロー

ヘルス監視は「このリンクの使用率は 80% です」と教えてくれます。フロー監視が教えてくれるのは、 そこに何が流れているのかです。

Yagra は、機器がもともとエクスポートできるフローのレコードを集めます。そしてそれを、トップ トーカー、会話、ポートとプロトコルの内訳、AS 単位のビューに変えます。

これらは、すでにお使いのメトリクスやアラートと並べて見られます。ただし動作は完全に独立して います。フローを無効のままにしておけば、他には何も変わりません。

Yagra は主要なフローエクスポートプロトコルを解釈します。

  • NetFlow v5 と NetFlow v9
  • IPFIX
  • sFlow v5

ルータ、ファイアウォール、スイッチのフローエクスポートをポーラーへ向けてください。すると Yagra は、 フローのデータだからこそ答えられる問いに答えます。誰が誰と通信しているのか。どのホストとポートが トラフィックを担っているのか。プロトコルの内訳はどうなっているのか。そして AS 補完を使えば、自分の トラフィックがどの自律システムへ広がっているのか。

フローのレコードは、専用の ClickHouse ストアに保存します。メトリクスの TSDB とも、メタデータの データベースとも別です。

これはこの機能の必須条件です。有効にするには YAGRA_CLICKHOUSE_URL を設定します。設定しない場合、 フロー収集は無効になり、フローの API は理由の分かる 503 を返します。ですから WebUI は、空のグラフ を見せる代わりに「未設定」と表示できます。

単一ノードの compose スタックには、URL を設定済みの ClickHouse サービスが最初から入っています。 ですからそこではフローがそのまま動きます。自分で組んだデプロイでは、このストアは自分で有効に します。

設定 ▸ Yagra ヘルスは、フローストアを他のバックエンドストアと並べて表示します。ですから ClickHouse の障害が、「なぜかフロービューが空」という形ではなく、一目で分かります。

フローのリスナーはポーラー上にあり、他のパッシブリスナーと同じくオプトインです。各リスナーは、 対応するバインド変数が設定されている間だけ存在します。

Terminal window
YAGRA_FLOW_BIND=0.0.0.0:2055 # NetFlow v5/v9 + IPFIX — set by default in compose
YAGRA_SFLOW_BIND=0.0.0.0:6343 # sFlow v5 — off by default
リスナー 変数 ポート compose 既定
NetFlow v5/v9 / IPFIX YAGRA_FLOW_BIND 2055/udp 有効
sFlow v5 YAGRA_SFLOW_BIND 6343/udp 無効(ホスト側のポートマッピングは存在しますが、バインドを設定するまで何も待ち受けません)

compose では、ホスト側のポートを YAGRA_FLOW_PORT(既定 2055)と YAGRA_SFLOW_PORT(既定 6343)で割り当てます。syslog やトラップと違い、これらはもともと 1024 以上のポートです。ですから ホストとコンテナのポートは同じで、転送ルールも要りません。

機器側では、フローエクスポートの送信先を <poller-host>:2055 に設定します(sFlow なら :6343)。 この機能の呼び名はベンダーによって違い、NetFlow export、NetStream、IPFIX export、sFlow エージェント などと呼ばれます。

最初のエクスポートが届いてから 1〜2 分すると、ノードの Flow タブに最初のデータが出ます。レコードは 60 秒ごとのまとまりに畳み込むので、画面はそのまとまり単位で埋まっていきます。

sFlow は、間引いて送るプロトコルです。1 つのサンプルが N パケットぶんを代表します。ですから Yagra は、バイト数とパケット数をそのサンプルの間引き率で割り戻し、実際のトラフィックを推定します。

sFlow の数値は「精度の高い推定値」であって、正確なカウンタではないと考えてください。これはプロト コルの性質であって、Yagra の制限ではありません。間引いて送られる NetFlow v5(エクスポートの ヘッダーに間引きの間隔が入っているもの)も、同じやり方で割り戻します。

フローも、syslog やトラップと同じくポーラーが受け取ります。ですから追加の配線なしで、リモート拠点 でも動きます。詳しくは後述のリモート拠点での収集にあります。

忙しい機器から出る生のフローエクスポートは、量が膨大です。しかもその大半は、細かいノイズです。 そこで Yagra は、バスに何かが流れる前に、拠点側のポーラー上でまとめます。

  • レコードを 60 秒ごとのまとまりに畳み込みます(YAGRA_FLOW_BUCKET_SECS)。

  • そのまとまりの中で、ポーラーはエクスポーターごとにバイト数の多い上位 500 フローだけを残し ます(YAGRA_FLOW_TOP_N)。

    これが、実質的な量の制御です。機器がどれだけエクスポートしても費用に上限を設けつつ、「この リンクに何が流れているのか」に答える重いフローは残します。

  • まとめたバッチはバスに乗ってコアへ届き、コアがそれを ClickHouse へ書き込みます。

この割り切りは意図的です。リンクを占有する重いフローは、そのまま正確に残ります。上位だけを残す 処理が落とすのは、ごく小さなフローの集まりです。

「何がこのリンクを埋めているのか」「誰が誰と通信しているのか」を知りたいのなら、生のデータ量の ごく一部で、これが正しい答えを出せるデータになります。

保存される 1 件のレコードには、会話の送信元と宛先のアドレスとポート、プロトコル、AS 番号、そして そのまとまりでのバイト数とパケット数が入ります。報告したエクスポーターにも紐づきます。

保持期間は ClickHouse の TTL で決まります。既定は 30 日で、YAGRA_FLOW_RETENTION_DAYS により 1〜3650 日の範囲で設定できます。

フローストアは、意図的に失われることを許しています。これはトラフィックを分析するためのデータ であって、課金の記録ではありません。失っても、監視やアラートには一切影響しません。

フローの画面は、自律システムの単位でまとめたり絞り込んだりできます。「203.0.113.7 宛の トラフィック」が、「AS15169 宛のトラフィック」になります。

AS 番号は、次の 2 か所から、この順で得ます。

  1. エクスポーター自身。 BGP を話す機器は、フローのレコードに送信元と宛先の AS を入れて送って きます。その値が常に優先されます。
  2. オフラインの IP→ASN データセット。 BGP を話さない機器の多くは、AS 0 を送ってきます。 YAGRA_IPASN_DB を iptoasn.com の TSV データセットに向けてください。 Yagra が書き込むときに、欠けている AS 番号を補います。設定しなければ補完は行われず、 エクスポーターが送ってきた AS の値だけが出ます。
Terminal window
YAGRA_IPASN_DB=/path/to/ip2asn-combined.tsv
YAGRA_IPASN_RELOAD_SECS=21600 # re-read the file every 6 h; 0 = load once at startup

compose ファイルは、スタック全体にインターネット接続を与えずに、このデータセットを最新に保ちます。

やり方はこうです。ipasn-updater サイドカーが、決まった間隔(既定は週 1 回、 YAGRA_IPASN_REFRESH_SECS)でデータセットを共有ボリュームへ取ってきます。この機能で外向きの通信 をするのは、このコンテナだけです。コアはそのファイルを定期的に(YAGRA_IPASN_RELOAD_SECS) 動いたまま読み直します。再起動は要りません。

AS の名前は、保存するレコードには書き込みません。読むときに解決します。ですからデータセットが 名前を更新すれば、過去の履歴にも今の名前が出ます。

すべてのノードの詳細ページに Flow タブが付きます。

  • トップトーカー、トップポート、トッププロトコル — そのノードのトラフィックのランキング カード。
  • Top AS — トラフィックの背後にある自律システム。ドリルダウンできます。
  • 会話 — 誰が誰と通信しているかの表と、同じ会話の Sankey 図。アドレスと並べて送信元・ 宛先の AS も表示されます。

これらのビューはインタラクティブです。任意のトーカー、ポート、プロトコル、AS をクリックすると タブ全体をそれで絞り込めますし、プロトコル・ポート・ピア・AS のフィルタを組み合わせて特定の 問いを追いかけられます。

ノードごとのタブ以外にも次があります。

  • ダッシュボードにはフリート全体のトラフィックフローウィジェットのセクションがあります — トップトーカー、Top AS、トップポート、プロトコルの内訳、会話 Sankey、トラフィックのトレンド — 1 ノードずつではなくすべてのエクスポーターを横断して読み取ります。
  • Troubleshoot 画面にはフローに基づく分析(トラフィック異常、トーカーの変化、新規宛先、スキャン 検知)と、メトリクス・イベント・フローをまとめて読むクロスシグナルの分析が含まれます。
  • AI クライアントは MCP ツール top_flows と flow_fanout から同じデータを取得できます。

拠点から中央の ClickHouse へトンネルを掘る必要はありません。拠点の機器を、その拠点のポーラーへ 向けてください。

ポーラーがその場でエクスポートを受け取り、まとめます。まとめたフローは、1 本の外向き TLS バス接続 に乗って本社へ届きます。ポーリングのジョブと結果を、すでに運んでいるのと同じ接続です。

ですから拠点側に内向きのポートは要りません。中央のファイアウォールにも、新しい穴は要りません。

ただしフローは、リモートポーラーにとって実際の WAN トラフィックを増やします。ポーラーが元の データグラムもそのまま運ぶからです。それがあるおかげで、転送が バイト単位で正確にできます。

量の目安は、1,000 flows/s あたり 0.4〜1.0 Mbit/s です。エクスポーターがどれだけ密にデータ グラムを詰めるかによって変わります。帯域の見積りは ポートとファイアウォールで詳しく扱っています。

フローの受信には、syslog やトラップとは別の枠があります。数える単位はデータグラムです。レコード 単位ではありません。1 つの NetFlow データグラムは、数十のレコードを運べるからです。

制限 既定 変数
送信元(エクスポーター)ごと 1000 データグラム/秒 YAGRA_FLOW_RATE_PER_SOURCE
グローバル(全エクスポーター) 20000 データグラム/秒 YAGRA_FLOW_RATE_GLOBAL

どちらも、持続レートの 2 倍までの一時的な増加を許します。上限を超えたデータグラムは、リスナー で捨てます。

こうして拠点側でバスとストアを守るので、暴走した 1 台のエクスポーターが他を締め出すことはありま せん。もともと統計的なデータですから、いちばん声の大きい送信元のサンプルを落とすのが、いちばん ましな壊れ方です。

フロー関連のつまみの一覧です。

変数 既定 制御対象
YAGRA_CLICKHOUSE_URL 未設定(フロー無効) ClickHouse のフローストア — 必須
YAGRA_FLOW_BIND compose で設定(0.0.0.0:2055) NetFlow/IPFIX リスナー
YAGRA_SFLOW_BIND 未設定(無効) sFlow リスナー
YAGRA_FLOW_BUCKET_SECS 60 集約バケットの幅(秒)
YAGRA_FLOW_TOP_N 500 エクスポーターごと・バケットごとに保持するフロー数
YAGRA_FLOW_RATE_PER_SOURCE 1000 エクスポーターごとのデータグラムレート上限
YAGRA_FLOW_RATE_GLOBAL 20000 グローバルのデータグラムレート上限
YAGRA_FLOW_RETENTION_DAYS 30 ClickHouse の保持期間(1–3650)
YAGRA_IPASN_DB 未設定(補完無効) IP→ASN データセットのパス
YAGRA_IPASN_RELOAD_SECS 0(起動時に 1 回) データセットのホットリロード間隔

量が非常に多い拠点では、リスナー共通の設定を上げることもできます。YAGRA_LISTENER_WORKERS は、 リスナーごとに並列で読むソケットの数です(既定はホストの並列度で、上限は 4)。 YAGRA_LISTENER_RCVBUF_BYTES は、ソケットごとの受信バッファです(既定 4 MiB)。

これらはフローだけでなく、すべてのパッシブリスナーに効きます。

詳細と compose 側のポート変数は設定リファレンスにあります。

  • 転送 — 受信したフローデータグラムを原本のまま外部コレクタへ 中継する、あるいはレコード単位の行を BigQuery へストリーミングする。
  • パッシブイベント — パッシブ受信のうち syslog / トラップ / Webhook 側。
  • ポートとファイアウォール — フローリスナーのポートと、リモート拠点 の帯域見積り。