要約

  • BGP Confederationは複数のMember-ASを一つのAS Confederation Identifierとして外部に示す。内部ではAS_CONFED_SEQUENCEとAS_CONFED_SETが経路履歴を保持するが、真の外部peerへ送る前に必ず取り除かれる。
  • この削除はinteroperabilityのための境界であり、内部が一枚岩である証明ではない。LOCAL_PREF、MED、NEXT_HOP、candidate visibility、member identity、route reflectionは、公開AS_PATHが不変でも到達性を変え得る。
  • Leadershipが承認すべきなのは、sanitisation前のpath ledger、各boundaryのowner、RIB/FIBとpacketの証明、そしてMember-AS migrationを旧状態まで戻せる手順が揃った場合だけである。

午前1時40分、内部再編の最後の作業が始まる。Border router DeltaをMember-AS 65021から65031へ移す。どちらもConfederation AS 64500に属する。外部のtransitやcustomerにとっては何も変わらないはずだ。組織内部の区分変更のために、世界中のpeering policyを更新させる必要はない。

Automationは新しい設定を適用済みと報告する。Deltaのexternal sessionsは緑色で、public collectorも64500を示す。Public origin authorizationも同じだ。Change dashboardは成功と判定する。

しかしNeighbor Echoの定義は古い。Deltaは65031としてOPENを送り、Echoは65021のconfederation peerを待つ。あるimplementationではadjacencyが成立しない。別の場所ではbackup routeが残るものの、65031側のIGPでは解決できないNEXT_HOPを保持している。MEDを比較するcandidate setも変わる。Customer sessionは生きているのに、使えるrouteはFIBから消える。

これはsynthetic incidentである。Protocol boundaryは実在する。External AS_PATHが原因を記録し損ねたのではない。RFC 5065がMember-AS historyの削除を要求している。Confederationは外部への約束を守った。一方、運用側が抽象化の手前で証拠を残さなければ、公開情報は内部の責任を説明できない。

外向きの名前と内向きの名前

AS Confederation Identifierは、Confederation全体が非memberのBGP speakerに対して使うASNである。Member-ASはその内部にあるrouting/policy domainで、Member-AS Numberによって他のmemberから識別される。

外部とのOPENとAS_PATHにはConfederation Identifierを使う。Member-AS間では各member numberを使う。Member間のsessionはEBGPとして確立されるが、path selectionの重要な部分では同じConfederationの内部routeとして扱われる。

目的の一つはscalingである。巨大な一つのASでfull mesh IBGPを維持する代わりに、複数memberへ分割し、member間を相互接続する。ただし各Member-ASの内部では、route reflectionなど別の仕組みを使わなければfull meshの問題は残る。MemberごとにIGP、RR topology、policy owner、failure domainが異なることもある。

したがって公開identifierが証明するのは限定的だ。外部には「AS 64500がこの経路を提示した」と伝える。どのmemberが受信したか、どのteamがLOCAL_PREFを変えたか、どのnext hopが解決されたか、どのhardwareがpacketを運んだかまでは伝えない。Identityはcoordinationに必要だが、内部authorityを自動的に作らない。

内部履歴は境界で消える

AS_CONFED_SEQUENCEは、UPDATEが通過したMember-ASの順序を保持する。AS_CONFED_SETはaggregationに関係する順序なしの集合である。Routeを別のMember-ASへadvertiseするとき、speakerは自分のnumberをsequenceの先頭へ加える。Sequenceがなければ新しく作る。

これはloop detectionに使われる。受信したconfederation segmentに自分のMember-AS Numberがあれば、普通のAS_PATHに自ASがある場合と同じように扱う。Local Confederation Identifierが外部pathに現れた場合も、同じ全体identityへ戻ったloopとして扱う。

外部exportでは逆の処理をする。AS_CONFED_SEQUENCEとAS_CONFED_SETをすべて削除し、残ったAS_PATHにConfederation Identifierを通常のAS_SEQUENCEとしてprependする。RFC 6793はAS4_PATHにもconfederation segmentsを含めてはならないと定め、four-octet transitionから内部履歴が漏れる経路を閉じている。

Public collectorが見る64500は正しい。ただし圧縮された正しさである。内部で65021、65017、65009を通ったとしても復元できない。これは外部peerに不要なtopologyを負担させないための設計であり、collectorの欠陥ではない。

問題は、その圧縮されたrecordを内部incidentの完全な証拠として使うことだ。消去前のpathをoperatorが保存しなければ、後から外部観測を増やしても失われたmember sequenceは戻らない。

Membershipは両端で実行される

Architecture diagramの枠線はadjacencyを作らない。両neighborがlocal AS、peer AS、Confederation membershipを一致して設定する必要がある。Juniperの現行documentationも、あるadjacencyがConfederation内かどうかについて二者が一致しなければ形成されないと明記する。

Pathにも規則がある。別Member-ASから受けるUPDATEは先頭にAS_CONFED_SEQUENCEを持つべきである。外部neighborからconfederation segmentを受けるのはmalformed AS_PATHであり、内部speakerが外へ送ることも禁止される。全memberはextensionを理解しなければならないが、外部speakerは削除後のpathだけを見るので対応不要である。

RFC 7606によるrevised error handlingでは、malformed AS_PATHは一般にtreat-as-withdrawとなる。Session全体をresetする代わりに、対象routeをwithdrawnとして扱う。Damage scopeは狭くなるが、service healthとsession healthが分離する。EstablishedのままNLRIが消え、内部の各routerが異なるstateを持てばunreachabilityやforwarding loopも起こり得る。

必要なproof chainは、configured identity、observed OPEN、segment class、policy result、Adj-RIB-In、Loc-RIB、next-hop recursion、FIB、packetである。Peerがupだという事実は、その一番手前しか証明しない。

WireはEBGP、意味は内部

Member-AS間のsessionを単にEBGPと呼ぶと、重要な例外が落ちる。同一Confederationのmemberから学んだrouteは、IBGP対EBGPのselection stepではinternalとして扱う。CONFED_SEQUENCEとCONFED_SETはAS_PATH lengthに数えない。

LOCAL_PREFはmember boundaryを越えて伝播できる。NEXT_HOPとMEDも変更せず渡せる。これにより複数memberは共通policy systemのように動けるが、隠れた依存も運ぶ。

全memberが共通IGPを持つなら、unchanged NEXT_HOPは全域でreachableかもしれない。独立IGPなら到達できないことがあり、RFC 5065はpolicyによるNEXT_HOP変更が必要になり得ると述べる。BGP tableにrouteがあってもrecursive resolutionが失敗し、FIBへ入らない。

MED comparisonはconfederation segmentsを飛ばし、最初の通常AS_SEQUENCEを基準にする。Implementationがmember間の追加比較optionを持つ場合もある。Migrationでcandidate setが変われば、同じMED値でも勝者が変わる。Public AS_PATH lengthが変わらないことは内部decisionの不変を意味しない。

Runbookにはsession typeだけでなく、AFI/SAFIごとのattribute treatment、next-hop scope、MED comparison、candidate source、policy ownerを記載する必要がある。

外から見えないpersistent oscillation

RFC 5065は、misconfigurationがduplicate advertisements、resource waste、route flap、convergence delayを引き起こすと警告する。またRFC 3345が扱うpersistent route oscillationは、Confederationやroute reflectorによってdecision pointごとのcandidate setが異なるときに発生し得る。

あるnodeの選択が別候補のadvertisementを止め、その欠如が次のnodeの選択を変え、さらに元の候補を復活させる。MEDの比較範囲が絡むと、各nodeがlocal ruleに従っても全体が収束しない場合がある。

外部にはsanitisation後のwinnerだけが見える。Internal losing candidateやconfederation pathは消えている。Public graphが安定していても、内部ではbest pathが循環している可能性がある。

Topologyに沿ったIGP metric、consistent tie-break、duplicate filter、reflector間のcandidate visibility改善は特定条件で有効だが、万能なcertificateではない。各decision pointの全候補、比較対象MED、reject reason、topology epochを保存しなければ、再現可能な分析はできない。

Private ASNにも衝突がある

RFC 6996は64512–65534と4200000000–4294967294をprivate useとして予約する。External borderでMember-AS segmentsが消えるため、この範囲を内部numberに使うのは一般的である。ただしRFC 5065はprivate ASNの使用を必須にしていない。

Privateはglobal uniqueではない。別々の企業が65021を使っていても、接続されるまでは問題にならない。Mergerやtemporary interconnectでscopeが重なると、同じnumberが二つのowner、IGP、policyを指す。Loop detectionやAS-path filter、loggingが曖昧になる。

Member-AS registryにはnumber、owner、region、IGP domain、RR cluster、AFI/SAFI、four-octet capability、retirement planを持たせる。Network due diligenceではpublic ASNだけでなく、このprivate inventoryを接続前に比較する。

remove-privateは別のcontrolである。Juniper documentationでは、private-AS removalはconfederation member segmentsがすでに除去された後に動く。External pathがcleanでも、どちらの処理が正しかったかは個別に検証しなければならない。

Sanitisation前にledgerを置く

AdjacencyとAFI/SAFIごとに、local member、expected peer member、confederation identifier、OPEN identity、negotiated capability、raw segment types、policy version、LOCAL_PREF、MED、NEXT_HOP、best-path reason、error actionを保存する。

Stageも分ける。Receiving memberのpre/post-policy Adj-RIB-In、Loc-RIB candidates、次member向けのpre/post-policy Adj-RIB-Out、そしてinternal segments削除後のexternal Adj-RIB-Outを連結する。Topologyとpolicyのhashが、routeを実際に判断したepochへ結び付ける。

次にrecursion、FIB/ASIC、packetを確認する。正しいAS_CONFED_SEQUENCEはnext hopをreachableにしない。FIB entryは想定egressを保証しない。Public collectorは最後のstatementの証人であり、内部decisionの独立証拠ではない。

Alertはdownだけでなくdivergenceを見る。ConfigとOPENのmember不一致、externalからのconfed segment、member間でのsegment欠落、private collision、session維持中のtreat-as-withdraw、公開path不変のbest change、同一MED candidatesの反復cycleを検知する。

Member-AS変更はprotocol migration

Number変更はpath prepend、loop identity、policy match、telemetry label、RR scope、peer classificationを変える。単なるinventory editではない。

Old-to-new mapにはrouter、neighbor、policy、community、collector、alert、ownerを含める。移行中に接続し得る全scopeでnumber uniqueを証明し、confederationとfour-octet supportを確認する。

Canaryはredundant boundary一つ、AFI/SAFI一つ、controlled prefixesに絞る。変更前後で双方向のOPEN、segments、candidates、selection、recursion、FIB、packetsを比較する。MED cycleやdelayed RR effectが現れる時間も確保する。

Rollbackはold numberだけでなくmembership list、peer type、policy、reflection relationship、labels、route stateを戻す。Stale routeのclear条件も決める。Configuration fileだけを戻してforwardingを証明しない手順はrollbackではない。