デフォルトの冗長経路切り替わり時間
BGP の経路切り替わりはデフォルトでは以下のタイミングで発生します。
- BGP ピア接続の送信元 IP のインタフェースがダウンしたとき
- 最後に相手の Keepalive を受信してから Hold Time が経過したとき
以下の構成での切替の例を示します。RT1 と RT2 は2つの経路それぞれで BGP ピア (ネイバー) を確立し、RT1 は 1.1.1.0/24 を広報、RT2 は 2.2.2.0/24 を広報しています。
RT1 の gi 0/0 がダウンしたときを考えます。
RT1 側では gi 0/0 へのルートが断たれたことがすぐに分かるため、RT2 から受信したルート 2.2.2.0/24 のうち、Switch1 の経路を削除します。
ところが RT2 側ではインタフェースのダウンは発生しませんので Hold Time が Expire するのを待つことになります。
Cisco のデフォルトでは Hold Time は 180 秒なので、相手からの最後の Keepalive を受信してから 180 秒後に BGP ピア (ネイバー) をダウンとし、1.1.1.0/24 のうち、Switch1 の経路のルートを削除します。
RT1 は切り替わったが RT2 が切り替わっていない状態だと、1.1.1.1 から 2.2.2.2 への通信は Switch2 経由で可能ですが、2.2.2.2 から 1.1.1.1 への通信は Swtich1 に向かおうとしてしまうため不可となります。
つまり往復の通信が成立しませんので、1.1.1.1 と 2.2.2.2 の間での TCP 3way Handshake や Ping は、どちらが起点となっても成功しません。(RT2 が切り替わった後に可能となります。)
BGPタイマー (Keepalive Interval, Hold Time)
BGP タイマーの変更
Hold Time を短くすることで、経路切替時間を短縮することができます。
Cisco では "timers bgp" コマンドによって Keepalive インターバルと Hold Time を変更できます。以下の例では Keepalive を 3 秒間隔に送信し、Hold Time を 9 秒に設定します。
RT2(config)# router bgp 20 RT2(config-router)# timers bgp 3 9 % Warning: A hold time of less than 20 seconds increases the chances of peer flapping
警告が出ましたが設定変更は成功した状態です。(Hold Time を 20 秒未満にすることは推奨されていないようです。)
Timers 不一致の場合の挙動
Keepalive インターバルと Hold Time は OPEN メッセージ交換のときにピア間でネゴシエーションされ、短い方に揃えられます。なので片方だけでこの設定をすれば、もう片方では設定せずとも Keepalive = 3 秒、Hold Time=9 秒になります。
さらに補足ですが、keepalive を Hold Time の 1/3 に設定するのは RFC4271 Section 4.4で以下のように推奨されています。
A reasonable maximum time between KEEPALIVE messages would be one third of the Hold Time interval.
fall-over BFD による即時の障害検知&経路切替
BFD とは Bi-directional Forwarding Detection の略で、RFC5880 で規格化されている、ピア間での短期間での障害検知を実現する手法です。
その中でも Cisco の BGP の BFD については RFC7881 にて規格化されている [ Simple BFD (S-BFD) ] が使われます。
コントロールパケット (UDP/3784) と障害検知用パケット (UDP/3785) が使われます。なのでファイアウォール等で許可しておく必要があります。
以下に、Cisco での送信間隔 100 msec、受信受け入れ最小間隔 50 msec、5 回連続受信失敗した際に経路切替を行うようにする設定例を示します。
[RT1 config]
RT1(config)# interface gi 0/0 RT1(config-if)# bfd interval 100 min_rx 50 multiplier 5 RT1(config)# interface gi 0/1 RT1(config-if)# bfd interval 100 min_rx 50 multiplier 5 RT1(config)# router bgp 10 RT1(config-router)# neighbor 10.1.121.2 fall-over bfd RT1(config-router)# neighbor 10.1.122.2 fall-over bfd
[RT2 config]
RT2(config)# interface gi 0/0 RT2(config-if)# bfd interval 100 min_rx 50 multiplier 5 RT2(config)# interface gi 0/1 RT2(config-if)# bfd interval 100 min_rx 50 multiplier 5 RT2(config)# router bgp 20 RT2(config-router)# neighbor 10.1.121.1 fall-over bfd RT2(config-router)# neighbor 10.1.122.1 fall-over bfd
コメント