← 記事一覧

ホップバイホップの真実

あなたのパスツールは回廊を描きます。ルーターはホップごとに転送します。そのずれを 4,032 ペアで測りました。

Michel Wijnberg

私が使ってきたネットワークパスツールのほぼすべて(つい最近までは私のものも含めて) は、次のように動きます。

  1. 送信元ルーターを取る。
  2. トポロジー上で Dijkstra を走らせる。
  3. 出てきた最短経路を描く。

これは送信元を根とする回廊であり、IP 転送のモデルとしては微妙に間違っています。実 際の転送に回廊はありません。すべてのルーターが独立に、宛先アドレス自分自身の ルーティングテーブルと突き合わせ、ネクストホップを選びます。2 つの答えが一致するのは、 途中のすべてのルーターの判断ルールと入力集合が送信元のそれと一致しているあいだだけです。

OSPF では、日常的に一致しません。


決して届かない 1 つのパケット

これは私のラボの実例です。関係するすべてのルーター上で show ip route を使って計測した もので、モデル化ではなく実機から読み取った値です。

ルーター宛先についての言い分転送先
dfw1-gw2metric 20031, type inter areadfw1-cr1
dfw1-cr1metric 30001, type intra areaord1-cr1dfw2-cr1 ではない
ord1-cr1metric 20001, type intra areajfk1-cr1
jfk1-cr1metric 10001, type intra arealhr1-cr1
lhr1-cr1metric 1, connected到達

送信元を根とする回廊はこう描きました。

dfw1-gw2 → dfw1-cr1 → dfw2-cr1 → iad2-cr1 → ams1-cr1 → lhr1-cr1

パケットは dfw2-cr1 に決して届きません。回廊のほうが確かにコストは安い。ただ、どのルー ターも組み立てない経路だというだけです。RFC 2328 の独立した 2 つのルールが、dfw1-cr1 にそれを拒ませます。

§16 ステップ (3) / §16.2 第 1 段落:バックボーンのゲート。複数のエリアに接続するルー ターは、バックボーンの summary-LSA だけを検査します。dfw2-cr1 のコスト 20011 という 安いほうの summary は、確かに dfw1-cr1 のエリア 4.6.23.0 のデータベースに存在します (show ip ospf database summary で確認しました)。しかしそれは候補ではありませんdfw1-cr1 が ABR であり、その summary がエリア 0 経由で届いたものではないからです。 RFC 3509 §2.1/§2.2(これらの実機で実際に動いている Cisco の ABR 挙動)は、これをアクティ ブなバックボーン接続があることに条件づけており、dfw1-cr1 はそれを持っています。

§16.2 ステップ (6):エリア内がエリア間に勝つ、以上。 “If the paths present in the table are intra-area paths, do nothing with the LSA (intra-area paths are always preferred).” dfw1-cr1 はすでにメトリック 30001 のエリア内経路を持っています。20011 の summary はそれに負けます。メトリックは関係ありません。これは経路の種別について のルールであり、コスト比較はそもそも行われません。

どちらか一方のルールだけでもこの回廊は死にます。送信元から SPF を 1 回だけ走らせるツール は、そのどちらも見ることができません。dfw1-cr1 が何を考えているかを、一度も尋ねないか らです。


これは実際どのくらいの頻度で問題になるのか

私が気にしているのはここです。「あなたのモデルは理論的に不正確だ」は、数字よりはるかに弱 い主張だからです。

そこで AS 200 の 64 台すべてのルーターから OSPF ルーティングテーブル全体を読み出し、 4,032 の順序付き送信元/宛先ペアをひとつ残らず比較しました。

計測結果
どのルーターも通らないホップを回廊が 1 つ以上描いたエリア間ペア2,839 中 360(12.68%)
同じ欠陥を持つエリア内ペア1,193 中 0
全体4,032 中 360(8.93%)

エリア内がゼロなのが健全性チェックです。単一のエリア内ではすべてのルーターが同一の LSDB 上で SPF を走らせ、最短経路はその途中のどの地点から見ても最短のままなので、2 つのモデル が一致しない理由はありません。重要なのは、それを仮定したのではなく一致することを計測した という点です。1,193 ペア、不一致ゼロ。ところが ABR と summary-LSA が絡んだ瞬間、8 本に 1 本の経路が作り話になります。

「わずかに最適でない」ではありません。作り話です。パケットが証明可能に一度も訪れないルー ターを含んでいます。その経路を使ってメンテナンス窓を計画したり障害を説明したりしているな ら、存在しない経路について推論していることになります。


直し方:すべてのルーターに尋ねる

Osprey は今、チェーンをたどります。各ホップで、そのルーター自身が宛先アドレスに向けて インストールしている経路を、そのルーター自身の LSDB、自身のエリア所属、自身の ABR 状態、 自身のアドミニストレーティブディスタンスの組み合わせを使って評価し、そのルーターが実際に 選んだネクストホップをたどり、これを繰り返します。

同じ 4,032 ペアで検証しました。

チェック結果
ルーター自身のメトリックを正確に再現4,032 / 4,032
経路種別(エリア内 / エリア間 / 外部)が完全一致4,032 / 4,032
インストール済み ECMP ネクストホップの集合全体が同一4,032 / 4,032
要求した宛先でチェーンが delivered で終了4,032 / 4,032

「近い」ではありません。すべてのペアで同一であり、任意に選んだ 1 メンバーではなく等コスト ネクストホップの完全な集合を含めて同一です。

キャンバス上ではこう見えます。順方向のパスがオレンジ、逆方向が青、パス上にないものはすべ て暗く落として回廊にしています。

トポロジー上に描かれた OSPF パス。順方向と逆方向のオーバーレイと 4 本の等コストパス
トポロジー上に描かれた OSPF パス。順方向と逆方向のオーバーレイと 4 本の等コストパス

4 equal-cost paths セレクタと per-flow hash のラベルに注目してください。Osprey は ECMP の集合を完全に列挙します。1 メンバーを選んでそれをそのパスとして提示することはし ません。トラフィックは 4 本すべてにハッシュで分散されており、そのうち 1 本だけを調べるト ラブルシューティングは、4 回のうち 3 回は何も異常を見つけられないからです。

そして同じパスを開いたものがこちらです。

10 ホップの OSPF パス。ホップごとの表、ABR バッジ、入出ポート、番号付きの説明
10 ホップの OSPF パス。ホップごとの表、ABR バッジ、入出ポート、番号付きの説明

各ホップには、判断を下したルーター、判断が行われたエリア、入出の物理インターフェースとそ のアドレス、そしてコストが載ります。ABR バッジはホスト名ではなく LSDB から導いたもので す。下のエリアリボンは、パスが 12.1.24.00.0.0.06.18.1.0 と横切っていることを 示しており、これはエリア間トラフィックに対して RFC 2328 が要求するバックボーン経由です。

そして表示されている合計コスト 30061 は、送信元自身がインストールしているメトリックで す。文字どおり lax1-gw1 上で show ip route が印字する数字であり、スタブのコストも含ま れています。Osprey が気に入ったリンクを足し上げて作った合計ではありません。

説明文は生成されたものであり、飾りではありません。

  1. Route type: O IA (inter-area): Source 172.16.2.33 and destination 172.16.5.23 have no shared area, routing via backbone (area 0.0.0.0)
  2. Path traverses: area 12.1.24.0 (cost 10) → area 0.0.0.0 (cost 30040) → area 6.18.1.0 (cost 10)
  3. Total cost: 30061 via 10 hops
  4. ECMP: 4 equal-cost paths available

AS 境界を越えて

ひとつの IGP の内側なら、LSDB が完全なのでチェーンは計算できます。AS 境界を越えると、何ひ とつ完全ではありません。共有データベースもなく、共有メトリック空間もなく、共有のアドミニ ストレーティブディスタンス方針もありません。

正直な答えはあきらめることではありませんし、メトリックが合成できるふりをすることでは断じ てありません。根拠をつなぎ合わせることです。

AS 200 から AS 300 へ渡る 15 ホップのパス。セグメントごとのコストと eBGP トランジション付き
AS 200 から AS 300 へ渡る 15 ホップのパス。セグメントごとのコストと eBGP トランジション付き

AS 200(テナント Harrier-Broadband、OSPF)の lax1-gw1 から AS 300(テナント Merlin-Carrier、IS-IS)の i-sin1-gw1 まで 15 ホップ。何をしているか読んでみてください。

  • ホップ 8jfk1-gw1 には BGP バッジが付いています。ここで IGP が止まり、BGP の 判断が引き継ぎます。
  • ホップ 9i-jfk1-gw1 には IS-IS バッジが付いています。まったく別のプロトコル、 別のアドレス設計、別のテナントです。
  • フッターには “Per-segment costs (never summed) | 15 hops” とあります。OSPF のコスト 20051 と IS-IS のコスト 1320 は、互いに無関係なメトリック空間の数字です。足せば 21371 になりますが、それは存在しない量です。Osprey はそれを印字することを拒みます。

生成された説明は、各ステップで自分の根拠を名指しします。

  1. BGP border selection: jfk1-gw1 holds 10.66.0.0/15 for 10.66.15.3 (AS path: 300)
  2. AS 200: IGP segment: lax1-gw1jfk1-gw1, cost 20051
  3. eBGP transition 200 → 300: jfk1-gw1 Et1/1 → i-jfk1-gw1 Et1/2 (bmp-peer+l2; ip-bound)
  4. AS 300: IGP segment: i-jfk1-gw1i-sin1-gw1, cost 1320

ステップ 3 は、この製品で私がいちばん気に入っている行です。「この 2 台のルーターはたぶん何 らかの形でつながっている」とは言いません。両端の物理ポートを名指しし、そのうえで括弧の 中で自分の作業を見せます。

  • bmp-peer:両者のあいだに確立された eBGP セッションがあり、BMP 経由で観測された
  • +l2:対向側は、境界ルーター同士の LLDP/CDP 隣接を通じて突き合わせた
  • ip-bound:両方のセッションアドレスが、機器の IP-MIB のバインディングを通じてその特定の ポートに解決された

独立した 3 つの根拠が一致しています。一致しない場合、製品はそう述べます。それが 次の記事の主題そのものです。


機能よりもこちらを気にする理由

パスの図は、あなたのネットワークがパケットをどう扱うかについての主張です。その主張が 8 回 に 1 回間違っていて、しかも画面上で間違いと正解を見分けるものが何もないなら、その図は役に 立たないより悪い。自信たっぷりに役に立たず、しかも間違いが高くつくまさにその瞬間に信 じられてしまいます。

「もっともらしい」から「64 台すべてのルーティングテーブルを正確に再現、4,032 分の 4,032」 まで到達するには、検証用のハーネスと、正解を読み出せるラボと、自分のツールが 360 回も作り 話を描いていたと知る覚悟が必要でした。

ラボはそのためにあります。


次回は同じコインの裏側です。Osprey が答えを計算できず、そう述べる場面について: Osprey が推測を拒むこと

Osprey は自社運用型のネットワーク可視化・エンジニアリング基盤です。32 台まで無料でお試しいただけます。他の記事を読むこともできます。