ネットワークが自分自身と食い違うとき
6 つの真実の源、ひとつの答え、そしてそれらが矛盾したときにどうするか
Michel Wijnberg
Osprey は 6 つの場所からネットワークについて学びます。
| 情報源 | 分かること |
|---|---|
| OSPF / IS-IS の LSDB | 各プロトコルがトポロジーをどう信じているか |
| SNMP のルーティングテーブル | ルーターが実際に何をインストールしたか |
| BMP の Adj-RIB-In | 各 BGP ピアがこのルーターに何を、誰から広告したか |
| LLDP / CDP | 物理的に何が何とつながっているか |
| IP-MIB | どのアドレスがどのポートに載っているか |
| BGP セッションテーブル | 誰と誰がピアを張っているか |
どれも何かについては権威です。すべてについて権威であるものはひとつもありません。そして 常に一致するわけでもありません。
素朴な答えは、全体でひとつの勝者を決めて(「トポロジーは LLDP を信じ、BGP は BMP を信じ る」)先へ進むことです。それは、リンクの片側で LLDP が古びている最初のネットワークで、あ るいは直結だと信じている 2 台のルーターのあいだにブリッジが挟まっている最初のネットワーク で破綻します。
私が行き着いた答えはもっと地味で、そして機能します。主張ごとに根拠を順位づけ、各主張が どこから来たかを記録する。
ポート:4 つの状況、4 つの異なる答え
この問題のいちばん鋭い形は、eBGP のトランジションに物理ポートを注記することです。異なる 自律システムの 2 台のルーターがセッションを張っています。それはどのケーブルを通るのか。
Osprey は 4 つのケースを区別し、それぞれに異なる種類の答えを与えます。
**リンクペアがひとつ、ファブリックの代替なし。**ポートを事実として記述します。
jfk1-gw1 Et1/1 → i-jfk1-gw1 Et1/2
**並列リンク。**どのペアかは確定しないので、ひとつを主張しません。
3 parallel L2 links: Gi2↔Et1/0, … (session link undetermined)
**両端の境界が共有ブリッジ上にあり、直結リンクはない。**接続ポートを添えてブリッジの 存在を報告します。そこを通る経路が存在するという記述であって、このセッションがそこを 通るという主張では決してありません。
shared L2 fabric: ix-sw (wn-edge Et0/3 ↔ ix-sw Et0/1; ix-sw Et0/2 ↔ nn-edge Et0/3) (session path unconfirmed)
**直結リンクと共有ファブリックの両方。**曖昧さを明示的に名指しし、どちらも選びません。
この 4 番目のケースこそ、この設計を価値あるものにしています。エクスチェンジポイントでは本 当によくあり、L2 だけでは本当に決定不能で、そして自信ありげに見せたいツールが直結リンクを 選んで静かに間違える、まさにその場所です。
推測を事実に変える段
抜け道はひとつだけあり、それはヒューリスティックではありません。BGP セッションの両方のアド レスが、機器の IP-MIB のバインディングを通じて特定のポートに解決されるなら、そのポート はもはや推論ではありません。どのインターフェースがそのアドレスを持っているかを、ルーター自 身が教えてくれたことになります。この根拠は曖昧さのゲートを上書きします。
eBGP transition 200 → 300 jfk1-gw1 Et1/1 → i-jfk1-gw1 Et1/2 (bmp-peer+l2; ip-bound)
この括弧は証拠の管理連鎖として読んでください。
bmp-peer:両者のあいだに確立された eBGP セッションがあり、BMP 経由で観測された+l2:対向側は、境界ルーター同士の LLDP/CDP 隣接を通じて突き合わせたip-bound:両方のセッションアドレスが IP-MIB 経由でその正確なポートに解決された
独立した 3 つの情報源が一致しています。主張の強さは、それが乗っている最も弱いものと同じであ り、この記法はそれが何なのかを述べています。
鮮度も根拠の一部です
L2 のデータは古びます。そして古びた L2 データは、何もないより悪い。新鮮な L2 データと見分け がつかないからです。そこで、裏づけに使う行にはルールが付いています。
- ポートの主張を支えるには、行が 13 時間より新しい必要がある
- 6 時間を超えると経過時間を開示する
- 解決済みの機器同一性ではなく sysname だけで一致したブリッジは、ポートの主張に拒否権 を行使する。しかもそれ自体が事実として表示されることは決してない
最後のものは微妙で、私は気に入っています。弱い根拠には確信を壊すことは許されますが、確信 を作ることは許されません。半分しか特定できていないブリッジは、直結ポートペアの主張をやめ る理由としては十分であり、そのブリッジを主張する理由としてはまるで足りません。
出所:同じ表、2 つの異なる血統
第 2 回で BGP ピアの表をお見せしました。57 ピアにまたがる 378 セッシ ョンです。そのスクリーンショットが示していないのは、それらがすべて同じ経路で届いたわけではな い、ということです。
| 情報源 | セッション数 |
|---|---|
| BMP:ルーターが自分の Adj-RIB-In をプッシュ(RFC 7854) | 24 |
| SNMP:ポーリング時点での BGP4-MIB ウォーク | 354 |
どちらも真です。同じだけ良いわけではありません。BMP はピアが広告したすべての経路を、ルーター から見た Peer Up と Peer Down とともにリアルタイムで運びます。SNMP ウォークは最後のポーリング 時点でのセッション表を与えるだけで、そのあいだに何が起きたかについては何も語りません。
どの RIB なのかは正確に述べる価値があります。それが「何を主張してよいか」を決めるからです。 RFC 7854 が監視するのは Adj-RIB-In で、各ピアから到着したもの、このルーターが何かを選ぶ前 のものです。ルーター自身が選んだ表である Loc-RIB は、後から定義された別の拡張(RFC 9069)で、 ここのエクスポーターは送りません。ですからこのラボは「ピア X が私にこの経路を提示した」をルー ターの権威をもって言える一方、「これはルーターがインストールした経路だ」は、それらの候補に対 する Osprey 自身の計算です。これらは別の主張であり、別のラベルが付きます。
そこで各行は、それがどちらなのかを source 列に記録します。この値は飾りではなく荷重を支えま
す。Osprey が AS をまたぐパスをつなぎ合わせ、ドメイン間のホップを必要とするとき、eBGP セッシ
ョンは出所を添えて根拠として数えられます。bmp-peer と snmp-peer ははしごの別の段であ
り、パスの注記はどちらの段に立っていたかを述べます。
パスエンジンの奥に埋まっている、私の好きな関連ルールがあります。BGP 経路を内部か外部かに分類
するとき、当たり前のヒューリスティックは AS_PATH を見ることです。要素がひとつなら iBGP、という
わけです。Osprey はまずそれをしません。まず経路を、セッションテーブルにある実際のピア種別
(ライブなら bgp_peer、時刻 T 時点なら bgp_peer_history)に結び付け、送信元ピアが解決でき
なかったときにだけ AS_PATH ヒューリスティックへフォールバックします。あのヒューリスティックは
ほとんどいつも正しい。その「ほとんどいつも」こそ、このシリーズ全体が扱っている障害モードです。
何も一致しないとき:そう言う
情報源は、単に食い違うだけでなく、尽きることもあります。ドメイン間のパスのつなぎ合わせは、厳格 なはしごで各セグメントを格付けします。
| 段 | 根拠 | 確信度 |
|---|---|---|
| a | 境界にある、宛先をカバーする RIB の行 | resolved |
| a2 | 自身の BMP RIB が次の AS 経由でそれをカバーしているルートサーバー | inferred(bmp-rib-rs) |
| b | 次の AS へ向けた確立済み eBGP セッション | inferred |
| c | 何もなし | opaque:注記付きのセグメント、ホップは描かない |
しかも格付けはパス単位ではなくセグメント単位です。ある AS では確実でも、次の AS では当て推 量になりうるからです。だからこそ、上のドメイン間のスクリーンショットは、同じ答えの 2 つの半分に 異なるバッジを付けています。
(a2) の段が存在するのには、名指しする価値のある理由がひとつあります。透過的なルートサーバーは AS_PATH に決して現れません。ルートサーバー自身の RIB を読まない限り、IX を経由した迂回はそもそ も見えません。実際には直結でないのに、パスは直結に見えてしまいます。実在するインターネットトポ ロジーのまるごと一クラスが、それを隠しているものを探しに行かない限り不可視のままなのです。
ルール
2 つの情報源が食い違ったとき、できることは 3 つあります。
- **ひとつを選ぶ。**速く、決断力があるように見え、いつとも知れないタイミングで静かに間違える。
- **平均を取る。**存在しないものを記述する数字ができあがる。
- 順位づけし、どれを使ったかを述べる。
Osprey はどこでも 3 番目をします。私が、先週の火曜にネットワークがどう見えていたかという自分の 記憶よりも、その出力を信用している理由がそれです。
代償は、インターフェースが競合より多くの語を背負わなければならないことです。resolved、
inferred、opaque、ip-bound、session link undetermined、bmp-peer と snmp-peer。その
どれもが、もっと見栄えのする製品なら 1 本のきれいな線を描いていた場所です。
きれいな線は主張です。裏づけられないなら、描かないことです。
次回は、この哲学が書き手自身に向く回です。自分のツールが作り話を描いていたと知った日: トポロジーに嘘をつかれた日。