セッションは上がったまま、IGP も安定しているのに、四つのプロバイダーエッジのうち二つで一部の L2VPN ルートが現れない。このパターンはトランスポートの問題ではなくリフレクションの問題だ。セッションが壊れれば全体が落ちるが、再利用されたリフレクション境界は選択的に落ちる。物理リングは無関係で、これらのルートが止まったのは論理的な配布グラフのほうだ。その地点を見つけるのにコントロールプレーンを作り直す必要はない。

欠落が選択的であることが探索範囲を狭める

物理リング上の四つのプロバイダーエッジがフルメッシュを組むには六本の論理セッションが必要になる。各ルーターが他の三台とペアになるからだ。これらのセッションはルーティングされたトランスポート上を流れるので、ケーブルを見ても隣接がいくつあるか、どの隣接がリフレクトするかは分からない。二つのエッジだけが特定のプレフィックス群を取りこぼし、ほかがすべて収束しているなら、ケーブルは容疑者ではない。

選択的な欠落はループ防止、ポリシー、関係の向きを示す。ルートによっては境界を越え、別のルートは途中で捨てられる。全体的な欠落はセッションかアドレスファミリーを示す。このどちらを見ているかを決めるのが最初の有効な一歩で、コマンド一つで足りる。

リフレクションが実際に変えるもの

ルートリフレクションは、iBGP スピーカーが別の iBGP スピーカーから学んだルートを再広告してはならないという規則を緩める。RFC 4456 は、スピーカーとルートの出所の関係によって例外を表し、その関係の向きは多くの要約が示唆する以上に重要だ。クライアントから学んだルートは他のクライアントと非クライアントへリフレクトでき、非クライアントから学んだルートはクライアントにしかリフレクトできない。この非対称性を二度読むべきだ。クライアント関係を足すことが設計上の誤りを隠す仕組みを説明している。トポロジーが意図しなかった経路を開いてしまうのだ。

CLUSTER_LIST 属性はリフレクションの履歴を記録し、その一覧に自分のクラスタ ID を見つけたリフレクターは広告を無視しなければならない。これがループ防止であり、識別子が誤って再利用されたときにルートを削除する仕組みでもある。ORIGINATOR_ID は関連する役割を果たし、最初にルートを広告したルーターを名指しする。

クラスタ ID の再利用がルート消失の原因になる

小さなネットワークは近道を誘う。各ルーターに loopback と同じクラスタ ID を与え、後からリフレクターをもう一台足し、手軽だからという理由で既存の loopback を使い回す。その識別子が二つの独立したリフレクション段に現れると、二段目は CLUSTER_LIST に自分の ID を見つけてルートを破棄する。何もエラーを記録しないのは、破棄がループに対する正しい応答だからだ。

一つのクラスタを担う冗長なリフレクターは正当な例外で、同じクライアントをどちらでも扱えるように意図的に ID を共有する。識別子は筐体名を区別するためではなく、リフレクション設計に合わせるべきだ。

設定に触れる前に、意図するグラフを描く。誰がプレフィックスを生成するか、どのクライアント関係が最初のリフレクションを許すか、どのリフレクターが次の段へ運ぶか、最後のクライアントはどこにいるか。そのグラフの各ホップは、識別子の再利用、クライアント関係の欠落、ポリシーフィルターがルートを止めうる場所だ。グラフを描いておけば、欠けているルートには謎ではなく場所がある。

すべての隣接をクライアントにしたくなる衝動を抑える

欠けたルートへの早道は、すべての隣接をすべてのリフレクターのクライアントにすることだ。伝播は戻るが、設計は何も語らなくなる。各スピーカーが運ぶルートを増やし、どの関係がその仕事を担うはずだったのかを隠してしまう。

小さなネットワークは通常二つの形のどちらかを必要とする。フル iBGP メッシュは 四台のルーターに六本のセッションでリフレクションはまったく使わない。残りのエッジを担う専用のリフレクター二台という形もある。どちらも、すべてのルーターが少しずつリフレクトする部分メッシュより考えやすい。形はケーブル図ではなく、規模と障害時の振る舞いで選ぶ。

リフレクションを疑う前にアドレスファミリーを確認する

ポート 179 の TCP セッションは二つのスピーカーが話せることを証明するだけで、VPN アドレスファミリーがルートを一本でも交換したかは何も語らない。まずセッション状態、次にファミリー、最後に個々のプレフィックスを確認する。

vtysh -c "show bgp summary"
vtysh -c "show bgp l2vpn evpn summary"
vtysh -c "show bgp l2vpn evpn"

この三つの出力は、隣接の問題、交換の問題、プレフィックス欠落の問題を切り分ける。ファミリーにプレフィックスがまったく出ないなら、リフレクションを見る前に隣接のアクティブ状態とエクスポートポリシーを調べる。プレフィックスが一方のエッジに出て他方に出ないなら、受信側でクラスタリストと originator を比較し、前節のグラフをたどる。

次ホップの到達性と転送状態はこの確認の外に置く。到達不能な次ホップを持つリフレクトされたルートは存在するが使えず、次ホップの列を見るまではリフレクション障害のように見える。次ホップを解決し、転送エントリを確認し、そのうえで配布グラフに別のリフレクターが必要かを決める。

関連記事