決してパケットを運んではならないルーター
三つのリンクステートプロトコル、ネットワークに加わりながら意図的に役立たずでいるための三通りのやり方
Michel Wijnberg
第 2 回は、Osprey はあなたのネットワークに触らないと論じました。この シリーズはその主張の一段下の層です。各プロトコルにどうやって実際に加わるのか、それぞれが何を 渡すことを拒むのか、そして礼儀正しい客であることが聞こえるより難しいのはどこか。
いちばん厳しい要求から始めます。ほかのすべてはそこから出てくるからです。
リンクステートデータベースを読むには、その なか にいなければなりません。隣にいるのでも、 問い合わせるのでもありません。本物の隣接を張り、本物の LSA を交換し、他の全員のデータベースに ルーターとして現れることです。OSPF にも IS-IS にも観測者モードはありません。加わるか、何も 得られないかです。
そして加わった瞬間、そのエリアのすべてのルーターが、いまやあなたを含むグラフの上で最短経路を 計算します。トラフィックが欲しいかどうか、誰も尋ねてくれません。
だから要求はこうなります。
完全に準拠したルーターであれ。決して経路として選ばれるな。
この二つは設計上そもそも緊張関係にあり、三つのプロトコルはそれぞれ別のやり方で解きます。
OSPFv2: 最大コスト
RFC 2328 は、OSPFv2 ルーターが参加する各エリアについて Router-LSA を起点することを要求します。 観測専用の隣接という逃げ道はありません。参加するとは記述されることです。そこでレコーダーは 一つ起点し、その唯一のポイントツーポイントリンクを コスト 65535、すなわち 16 ビットの メトリックが収めうる最大値で広告します。
エリアの他のすべてのルーターは、そのリンクを含めて律儀に Dijkstra を回し、どんな代替経路も 勝ちます。レコーダーはグラフのなかにいて、可視で、準拠しており、そしてネットワークに本当に 他が何もない場合を除けば決して最短経路に乗りません。その場合はあなたの監視より大きな問題を 抱えています。
OSPFv2 における仕組みはこれで全部で、これが 何でないか に注目する価値があります。「私を使う な」というフラグではありません。答えが通常のアルゴリズムから自然に落ちてくるほど高く設定された 普通のメトリックです。準拠ルーターに特別扱いは要りません。特別なことは何も起きていないからです。
もう半分あり、それを学ぶには障害が一件必要でした。そしてそちらのほうが興味深いのです。レコーダー はポイントツーポイントリンクを広告し、それ以外は何も 広告しません。とりわけ GRE トンネル 自身の内側サブネットのスタブネットワークを広告しません。それを広告すると、最大コストであっても、 他のすべてのルーターがトンネルのプレフィックスに対する経路をインストールします。その経路は やがてトンネル自身の外側パケットを誘導しうるので、観測を運んでいた隣接を殺します。監視が、監視 するために必要なものを壊すのです。第 7 回に、私がそれを痛い 目で知った版の話があります。
最大コストはあなたを最短経路から遠ざけます。ルーティングテーブルの外に置いてはくれません。 この二つは別の問題です。
OSPFv3: 同じもの、プラスそれを明言するビット
OSPFv3 はメトリックの技を受け継ぎ、そのうえで OSPFv2 に相当物のないものを足します。
OSPFv3 は Router-LSA のオプションに R ビット を持ちます (RFC 5340)。このビットがクリア のとき、広告元ルーターはトランジットトラフィックを転送する能力があるとはみなされません。 トポロジ配布には引き続き参加します。単にトランジットノードとしての資格がないだけです。
これはメトリックではありません。宣言です。だからレコーダーは R ビットを クリアのまま にし、 準拠した OSPFv3 ルーターは単に順位を最下位にするのではなく、トランジット計算から完全に除外します。
この違いは見た目以上に効きます。最大メトリックは、たまたま決定的になる選好についての言明です。 クリアされた R ビットは能力についての言明であり、他のすべての経路がもっと悪いようなトポロジ によって覆されることがありません。
読む側でも輪が閉じます。Osprey 自身の SPF も、エリアごとのノートランジットフラグを通じて同じ ビットを尊重します。したがってレコーダーは、準拠ルーターからも Osprey 自身の経路計算からも、 同じ明示された理由でトランジットから除外されます。二つの実装、一つのビット、どちらにも特別扱い なし。
OSPFv2 にはその一文を書く場所が単にありません。オプションフィールドに相当物がないので、v2 は メトリックだけを得ます。この非対称性は、かけた労力ではなく プロトコルの性質です。
IS-IS: 二つの扉と一本の閂
IS-IS は単体として最も強い仕組みを持ち、この実装ではその周りにいちばん多くの二重防御を敷いて います。
自己起点の LSP は オーバーロードビット を立てます。ISO 10589 はその意味について明快です。 他のルーターはこのシステムに到達してよいが、これを 通る 経路を計算してはならない。OSPFv3 の R ビットと同じ種類の言明であり、しかもずっと前からあります。
さらに二つ。そしてこの二つは同じ種類のものではありません。
| フィールド | 値 | 何を止めるか |
|---|---|---|
| OL ビット | セット | トランジットノードとして計算されること |
| ATT ビット | 0000 | デフォルトゲートウェイとして設置されること |
| TLV 22 のメトリック | 0xFFFFFF | OL ビットを助言扱いする実装すべて |
ATT の行がその場所に値するのは、別の 扉を閉じるからです。オーバーロードビットは経路計算の 話です。アタッチビットはデフォルトルーティングの話で、L1L2 ルーターがエリア外へ到達できると レベル 1 のルーターに伝えるために立て、それを見たルーターはデフォルト経路をそちらへ向けます。 これはレコーダーを通る経路が計算されるのではなく、より良い一致のないパケットがすべてそこへ送ら れることであり、より悪く、しかも最初の仕組みが覆っていない経路で到来します。
メトリックの行は純粋な防御です。24 ビットで 16,777,215 というメトリックは、本来それを不要に するはずの仕組みの下で OSPFv2 の技をやっているだけであり、どこかにオーバーロードビットを助言 扱いする実装があるという前提に立っています。
(LSP はパーティション修復ビットもクリアします。これは本当に些末で、なぜそこにあるのかと誰かに 悩ませないためだけに触れておきます。)
この表がそのまま論拠のすべてです。レコーダーはデータベースのなかにあり、独自の LSA と 独自のシーケンス番号を持ち、ほかのルーターとまったく同じ扱いを受けます。リンクは一本ずつ、 フラグはなし、再配布するものもありません。安全設計はレコーダーを外に締め出すためのものでは なく、なかにいることを無害にするためのものです。
タイトルが主張していないこと
先に切り分けておきます。機械についての言明として読むと、タイトルは言い過ぎだからです。
上のどれも、ホストを物理的に転送不能にはしません。ラボのレコーダーではたまたま不能です。
net.ipv4.ip_forward が 0 で、IPv6 側も同様だからです。しかしそれは ホストの設定 です。
誰かが一つのコマンドで変えられますし、プロトコル層は何も気づきません。
したがって要求は「この箱はパケットを転送できない」ではありません。こうです。
ネットワークのどこのルーティング計算も、この箱をトランジットノードとして選べない。
違いは、保証がどこに宿るかです。もしレコーダーの無害さが sysctl に依存していたなら、これを
配備するすべての運用者は sysctl -w 一つで監視ホストを転送経路に置ける状態にあり、ネットワーク
はそれを知りません。代わりにトポロジに依存しているので、カーネルが転送したかどうかにかかわらず、
ネットワーク自身の最短経路計算がレコーダー経由でのルーティングを拒みます。
sysctl は良いベルトです。ただこの記事でいちばん弱いものであり、次節はまさにその勾配の話です。
不変条件ではなく既定値であるもの
三つのレコーダーはいずれも DR 選出のプライオリティ 0 で動くので、セグメントの指名ルーターに なることは決してありません。DR 選出に勝ったレコーダーは、そのセグメントの他のすべてのルーター がフラッディングを頼る存在になってしまい、前提そのものの正反対です。
プライオリティ 0 は既定値であり、それがどんな種類の保護なのかは正確に言っておきたいところです。 これは 設定フィールド です。コードのどこも、より高い値を拒みません。設定すれば、レコーダーは 他のどのルーターとも同じように選出を争います。
これは記事の残りから切り分ける価値があります。上に書いたものはすべてコード中の定数だからです。
オーバーロードビットは起点の時点で OLBit: true であり、設定で外す手段はありません。OSPFv2 の
メトリックは LSA ビルダーで 65535 です。R ビットは決してセットされません。これらは不変条件
です。DR プライオリティは既定値であり、既定値というのは、誰も YAML ファイルを編集しないあいだ
だけ生き延びる種類の安全策です。
間違いを利用不能にする
そこで、私が本当に気にかけている部分に来ます。
トランジットを防ぐのは選好の問題です。注入 を防ぐのは正しさの問題であり、こちらのほうが ずっと悪い。故障モードが最適でない経路ではないからです。それは、他人のテーブルに現れる、何にも 対応していない経路です。
そこで自己起点の IS-IS LSP は、IP 到達性をいっさい運びません。TLV 128、130、135、236 のいずれも なし。レコーダーを TE データベースに入れてしまう TLV 134 のトラフィックエンジニアリング ルーター ID もなし。TLV 222 も TLV 242 もなし。
それがどう強制されているかが肝心です。起点ルーチンは、レベル、システム ID、エリアアドレス、 ピアのシステム ID、シーケンス番号、インタフェースアドレス、そして任意の認証子を保持する小さな 設定構造体から入力を取ります。そこにプレフィックスを入れられるフィールドは存在しません。 呼び出し側は経路を渡せません。渡す場所がないからです。
その限界については正確でありたい。もっと大きく主張したくなるからです。組み立てられる LSP は 汎用の TLV リストを持ち、ルーチンはそこに追加します。そのルーチンを編集する人は到達性 TLV を 追加できてしまいますし、型システムは反対しません。設計が取り除いているのは可能性ではなく 事故 です。どんな設定も、どんな呼び出し側も、どんな設定の組み合わせも、経路を持ち込めません。 注入するには、存在理由である不変条件をドキュメントブロックに列挙している関数を編集する必要が あります。
この区別こそ、この記事の前半と後半のすべての違いであり、いまや四つの段が出そろっています。 ホスト設定は、運用者がそれが何を守っていたか知らないまま変えられるもの。実行時チェックは、 書き忘れうるもの。既定値は、気づかずに上書きできるもの。間違いを置く場所がない入力面は、 わざわざ回り道しないと破れないものであり、その回り道は差分に見えます。
どれも絶対ではありません。ただ「うっかり度」がまるで違うだけであり、やる価値のあるエンジニア リングとは、上にチェックをもう一つ足すことではなく、保証をこのリストの下へ移すことです。
要点
三つのプロトコル、三つの仕組み、一つの要求。そして仕組みは互換ではありません。OSPFv2 は「高い」 としか表現できません。OSPFv3 と IS-IS は「トランジットルーターではない」と表現でき、それはより 強くより誠実な言明であり、しかもこの話のすべてより何十年も前からあるビットで表現しています。
面白いエンジニアリングはドレインを書くことではありませんでした。最大コストはルーティング テーブルの外に置いてはくれないと気づくこと、既定値は不変条件ではないと気づくこと、そして規則を 置くいちばん安全な場所は、その規則を誤って表現できない場所だと気づくことでした。
次回は、去ること。再起動したレコーダーは、ネットワークがより高いシーケンス番号で以前の自分を まだ保持しているのを見つけます。それを直すメッセージは、シャットダウン中に送るものです。 取り消せない LSA。