LGTM

Looks Good To Me

MRAI とBGP Withdrawn とパケットロス

BGP には,無駄な経路計算を減らすためのMRAI Minimum Route Avertisement Interval) というしくみがあります.BGP Update を送信する前に一定時間待ち,経路変化をバッファリングできる機能です.バッファ中にさらに経路変化があった場合,BGP Update を二度送信しなくてすみます.

(MRAI の概要については前のエントリーをご覧ください)

codeout.hatenablog.com

一方で,MRAI の実装によりリスクも存在します.経路変化を下手にバッファすることで,たとえばルーティングループが発生し,パケットロスする可能性があります.本エントリーでは どのような場合にパケットロスが発生しうるか,さらにそれを緩和するために何ができるかについて考えてみます.

十分に検討できてないかもですし,いろいろご意見いただるとうれしいです.

目次

経路を加えるBGP Update と経路を消すBGP Update

タイトルには便宜的にBGP Withdrawn と書いてしまいましたが,「経路を消すためのBGP Update メッセージ」の意味で使っています.経路を加える場合も消す場合もBGP Update メッセージをつかいますが,ここでは次のように呼び分けることにします.

  • BGP Update
    • 経路の増加や変更を伝えるためにつかう.NLRI フィールドやPath Attributes フィールドをつけて送る
  • BGP Withdrawn
    • 経路の削除を伝えるためにつかう.Withdrawn Routes Length フィールドやWithdrawn Routes フィールドをつけて送る

対称的な2 つのUpdate メッセージですが,BGP Withdrawn については注意して送信しないとマズい場合があります.

BGP Withdrawn に注目するのはなぜか

BGP Withdrawn はループの原因になりえるから

BGP での経路コンバージェンスを考えるとき,BGP Withdrawn はBGP Update より弱い側面があります.BGP のしくみ上,BGP Withdrawn をトリガーにルーティングループが起こる可能性があるからです.

なるべくシンプルな例で説明しますが,たとえば 4x ルーターが次のように接続されていて BGP ピアが張られているとします.

初期状態:

  • 右のほうで10.0.0.0/20 がオリジネートされていて
  • 左のほうで10.0.0.0/24 がオリジネートされている

10.0.0.0/24(左) の経路が消えるとどうなるか.

  1. 左からBGP Withdrawn が伝搬し,10.0.0.1 のNextHop が右向きに切り替わる (page 3)
  2. さらにBGP Withdrawn が伝搬し,次のルーターでもNextHop 右向きに切り替わる (page 4)

page 3 でNextHop が互いに向かい合っている = パケットはループ(ピンポン) する ことに注意してください.BGP のしくみ上これを避けることが難しいため,なるべくこの期間を短くして

  • 一旦パケットロスするが,TCP で再送されるまでにループが解消されている
  • あるいは IP TTL が0 になるまでにループが解消されている

ようにすることが理想的です.

一方 BGP Update の場合はこのようなループが発生する可能性が少ないと考えられます.

初期状態:

  • 右のほうで10.0.0.0/20 がオリジネートされている

10.0.0.0/24(左) の経路が出現するとどうなるか.

  1. 左からBGP Update が伝搬し,10.0.0.1 のNextHop が左向きに切り替わる (page 7)
  2. さらにBGP Update が伝搬し,次のルーターでもNextHop 左向きに切り替わる (page 8)

どの状態においてもBGP Withdrawn の時のようなループは発生しません.Best Path (パケット転送に使われる最も強い経路) だけを伝搬させるBGP のしくみ上 このような動きになります.

もちろん,さらに複雑な構成でBGP Update をトリガーとしてループが起こることはありますが,Indirect Nexthop がループしていたり,経路フィルターなど他の要因とのコンボであることがほとんどです.

BGP Withdrawn は伝搬に時間がかかるから

BGP Withdrawn を送信する際には「過渡期 = BGP コンバージェンスタイム を短くする必要がある」という話をしました.しかしながら,BGP Update と比較してかなり長いことが分かっています.

一例として,JANOG38 で@maz_zzz さんがおもしろいデータを紹介していました.

f:id:codeout:20160810014452p:plain
色々なトラヒック制御の利点と欠点

これはRIPE のRIS Routing Beacon を日本のISP で観測したデータですが,BGP Update(左) の伝搬時間に対し,BGP Withdrawn(右) はおよそ3 倍も長くなっています.

BGP 運用者にとって,これは感覚的に納得できるデータです.というのは「BGP Withdrawn ってそんなもん」だからですね.*1

シンプルな例で説明してみます.

  • AS65000~AS65005 が上のようにBGP ピアを張っている
  • 各AS の関係は ピア / トランジットが入り混じっている
  • AS65004(左下) の経路がAS65003(右中) でどのように見えるかを考える

AS = 通信事業者と考えてください.AS 間の関係については@yuyarin さんのスライド(page 21~31 あたり) が分かりやすいです.

AS65004(左下) が持つ経路は,矢印の流れに沿ったBGP Update によって伝搬し,AS65003(右中) では3 Path から聞こえてきます.BGP では複数Path の経路をまとめて1 つとして扱うため,3 Path 中1 つでもBGP Update を受信すれば「伝搬した」と考えることができます.

一方 BGP Withdrawn の場合も同じ矢印の流れに沿って伝搬しますが,

「経路が消える」とは3 Path すべてが消えることを意味するため,BGP Withdrawn の伝搬時間は「最も伝搬時間の遅いPath」に律速されてしまいます.

こうしてみると,BGP Update に比べてWithdrawn の伝搬に時間がかかることが原理的に理解できると思います.

メモ: BGP Update のコンバージェンスタイム

一般に BGP コンバージェンスタイム は「定常状態に落ち着くまでの時間」を指すので,上記のような最短の1 Path のBGP Update 伝搬時間とは異なります.しかしながら最強のPath が最速で伝搬することが少なくないため,やはりBGP コンバージェンスタイムもBGP Withdrawn >> BGP Update になりがちです.

MRAI + BGP Withdrawn の危険性

さて,すでに長くなりましたがBGP Withdrawn に注目する理由について説明しました.

  1. BGP Withdrawn トリガーでルーティングループが発生することを,原理上避けられない場合がある
  2. 時間にして100s のオーダーになる可能性がある

という2点です.特に2 . について,MRAI は不安定な時間が長くなる原因のひとつなのでは? と考えています.

前のエントリー で調査した Juniper vSRX / Cisco IOS-XRv / Quagga の例でいえばvSRX パターンのMRAI 実装(out-delay) がまずいです.BGP Withdrawn とのコンボにより「RIB からすでに消えているのに,N 秒間 (= MRAI タイマー値) はBGP Withdrawn を出さない」という動きをするからです.ちょうど「N 秒間は経路オリジネート = discard し続ける」ような動作です.

BGP Neighbor ルーターではRIB から消えず,上のようなルーティングループ状態を維持してしまう.運悪くMRAI ルーターが直列する場合,N 秒は積算されます.実際のインターネットでは 5.5万AS が網状に接続されており,周辺パケットを吸い込んで捨てるブラックホールが点々と動き回るように見えるはずです.

実際のインターネットで起こりうるか

単純なモデルではMRAI + BGP Withdrawn がパケットロスの原因になりそうですが,実際のインターネットで起こりうるかについて,いくつかの例で考えてみましょう.

未使用の/24 を一時的に広告し BGPlay などで観測すると良いかもしれません.なにが起こるか推測しやすくなります.

例1: DDoS 対策サービスを使っている

BGP でトラフィックを引き込むタイプのDDoS 対策サービスを使っている場合.

DDoS トラフィックを一旦べつのAS に引き込んでおいて,DDoS だけをフィルターしてオリジンAS に戻します.引き込む際にはBGP で細かい経路が広告されますが,IPv4 の慣例的では インターネットに伝搬する最小サイズ = /24 であるため,DDoS 被害ホストを含む/24 を広告することが多いです.

さて,DDoS 自体が止まって トラフィックを引き込んでいた/24 広告を止めるとどうなるか.

実線の矢印 → (青/赤) はNextHop = パケット転送の向きと思ってください.さらに「どの経路をもとにパケット転送するか」を矢印の色で表現します.矢印(青) は10.0.0.0/24 がBest Path であり,その方向にパケット転送することを示します.

仮にAS65000 にout-delay 的MRAI が設定されているとすると

  1. AS65001(DDoS 対策サービスプロバイダー) からBGP Withdrawn が伝搬し,AS65000 RIB から/24 が消える → NextHop が下向きに切り替わる (page 11)
  2. ループした状態で N 秒(= MRAI タイマー値) 維持 (page 12)

例2: 経路広告によるトラフィックエンジニアリング

2事業者からトランジットを買っているAS65004 が,トラフィックエンジニアリングのため細かい経路を片方に広告する場合.

重要経路を片寄せしたいとか,エンドユーザーの意向でAS65003 には広告したくない などの想定.仮にAS65001 にout-delay 的MRAI が設定されているとします.

ここから,/24 の経路広告が止まるとどうなるか.

  1. AS65004からBGP Withdrawn が伝搬し,AS65002 RIB から/24 が消える → が,NextHop は変化なし (page 22)
  2. さらにBGP Withdrawn が伝搬し,AS65003 のみNexthop が上向きに切り替わる (page 23)
  3. さらにBGP Withdrawn が伝搬し,AS65001 でNexthop が下向きに切り替わる (page 24)
  4. ループした状態で N 秒(= MRAI タイマー値) 維持 (page 25)

AS65002-AS65004 間リンクが切れた場合でも似たような動きになるはずです.

でも,BGP Withdrawn 自体レアなのでは?

はい.正常時あまりBGP Withdrawn を送ることがないかもしれません.日本で観測されるBGP メッセージのうち,Withdrawn は10% に満たない程度です.短期間で経路広告/停止しない場合はさほど気にする必要ないはずです.

いっぽう短期間に経路広告/停止する場合,

  • 絶妙な位置にMRAI ルーターがあると,最大数分間通信が止まる
  • 遠くにあるMRAI ルーターでも,その周辺の通信を止めている (遠いので影響が見えにくいだけ)

という可能性を念頭に置いておくと良いでしょう.

パケットロスを緩和するために

例1: BGP Withdrawn の影響をあらかじめキャンセルする

/24 からトラフィックを抜くのは厳しいので,基本的にはルーティングループを発生させずにBGP Withdrawn を伝搬させる戦略になります.

場合により有効な手段があります.たとえば例1: DDoS 対策サービスを使っている ケースでは

  1. トラフィックを引き込んでいる/24 より強い/24 をオリジンAS から広告する (page 15)
  2. DDoS 対策サービスを止める → 経路を上書きしているためループは発生しない (page 16)
  3. 上書きしていた/24 も止める → オリジンが同じためループは発生しない (page 17~18)

のように,BGP Withdrawn の悪影響をあらかじめキャンセルすることができます.ただし,DDoS 対策サービスが,トラフィックを引き込む/24 をあらかじめ弱めに広告できる ことが前提です.

例2: BGP Withdrawn の影響を局所化する

「このあたりでいつもループする」という事実を把握していない限り,多くの場合は対策が困難です.しかしながらBGP Withdrawn がルーティングループを生んでいると考えられるなら,それを局所化することは可能です.

Withdraw するべき経路のBGP Update を,あらかじめ日本国内 / アジア圏内 / 特定AS内に制限しておけばよい.たとえばオリジンAS が海外拠点を持たない場合は,DDoS 対策やトラフィックエンジニアリング向け経路は日本だけで十分です.

ただし,経路の伝搬範囲を制御するオプションを,トランジットISP が提供している ことが前提です.多くないと思いますが,そのようなISP は国内にもいます.今後増えていくことを期待しています.

まとめ

いくつかのMRAI 実装のうち,JUNOS のout-delay 的な実装とBGP Withdrawn の相性が悪く ルーティングループを生む場合があることを説明しました.経験的には,このようなループは30秒~数分間の通信断の原因になることがあります.

トランジットISP がMRAI を設定する際には 思わぬ悪影響がないかを検討してもらいたいですし,ユーザー側としては「MRAI ルーターがインターネット上にある」前提に立って,ルーティングループを検知し,キャンセルする策について検討しておくとよいでしょう.

*1:AS接続構成に依存するので常に3 倍とは限らないが,だいたい数倍遅い