Bidirectional Forwarding Detection
BFD のきほんと雑多なメモです。
BFD とは
Section titled “BFD とは”BFD (Bidirectional Forwarding Detection) は、2機器間で定期的に双方向で UDP のパケットを送り合い、リンクの断を検知する機構です。 RFC 5880 (BFD), RFC 5881 (IPv4/IPv6 Single Hop), RFC 5883 (IPv4/IPv6 Multihop) (Juniper, 2010/06) により標準化されていて、現代の NOS であれば基本的に実装されています。 機器間に中継ノード (メディコンなど) がいてリンクダウンにより断を検知できない状況や、BGP 等のルーティングプロトコルと組み合わせてそのプロトコル自身の機構より高速な断の検知を行いたい場合に利用します。
BGP との関係
Section titled “BGP との関係”BFD の典型的な利用方法として、BGP と組み合わせての利用が挙げられます。 (ちなみに BFD は BGP だけでなく OSPF や static route と組み合わせることもできます) BGP はその仕様上 Hold Time を 3 秒未満にすることができず、リンクダウン等のイベントがなければ最大で 3 秒の間は断を検知できません。 これより短い期間で断を検知する必要がある場合、BFD が利用されます。 BFD が断を検知し down になると、その情報が BGP 側に通知され、Hold Timer Expired を待たずに即座に neighbor down になる挙動となります。
BGP/BFD のタイマーに関する運用上の考慮
Section titled “BGP/BFD のタイマーに関する運用上の考慮”運用上の議論として、 BGP Hold Time を 3 秒に設定すると短すぎて C-Plane が処理できず BGP ピアが不安定になるのでそもそも避けるべきというものがあります。 一方、現代のデータセンタネットワークのスイッチでは 3 秒が当たり前に利用されていて実績があり、また CPU 性能も昔より向上しているため、その議論が盛んだった頃よりは問題が少なくなっています。 ただ、C-Plane での極端に短い Keepalive は CPU に負荷を与えるだけでなく、負荷が高く処理しきれない場合にピアを不安定にさせる恐れがあり、適切にタイマーをチューニングする必要があります。 特に、BFD が C-Plane で処理される実装の場合は注意が必要で、BFD の Hello Packet のやりとりがチップ側 (D-Plane) にオフロードされているかどうか確認すべきです。 また、断時間を短くすることが適切かどうかはアプリケーションの特性によります。 (TCP セッションが切れない程度でよければ 3s/9s のタイマーでも特に問題ない)
BFD のパラメータ
Section titled “BFD のパラメータ”Discriminator (自動で設定) (自動で設定) システム上で自動的に生成される BFD セッションごとの識別子 Desired Min TX Interval minimum-interval (transmit-interval minimum-interval) Default: 1000 (ms) interval Default: 300 (ms) 自身の側が送信する BFD 制御パケットの最小送信間隔 (usec) Required Min RX Interval minimum-interval (minimum-receive-interval) Default: 1000 (ms) min-rx Default: 300 (ms) 自身の側が処理可能な BFD 制御パケットの最小受信間隔 (usec) Detection time multiplier multiplier Default: 3 multiplier Default: 3 折衝した BFD 制御パケットの送信間隔とこの値を乗じたものが該当 BFD セッションの検知時間になる。
Required Min Echo RX Intreval echo minimum-interval echo-lite minimum-interval Default: ? bfd slow-timer Default: 2000 (ms) BFD Echo を利用する場合のみ利用。 Arista では slow-timer の設定はシステムに対して適用。I/F に対して bfd echo を入れると有効になる。
Juniper の場合、 minimum-interval を設定すると Min TX/RX 両方に作用する。個別にも設定可。デフォルト 1,000ms。
ハードウェアオフロード
Section titled “ハードウェアオフロード”Arista
Section titled “Arista”対応しているプラットフォームでは利用可 (TX のみ) show bfd hardware acceleration を確認して “Hardware acceleration is not supported” とでなければ対応 ASIC あたり 200 が上限 BGP では対応、一部非対応プロトコルあり
Juniper
Section titled “Juniper”Distributed BFD という BFD の session type であれば FPC にオフロードされる 結構複雑なのでこちらを参照: https://www.juniper.net/documentation/us/en/software/junos/high-availability/topics/topic-map/bfd.html show ppm adjacencies detail を見るとプロトコルごとに offload 状況が分かる
BFD Echo
Section titled “BFD Echo”BFD では Echo という機能を有効にすることができます。(single-hop BFD セッションでのみ可能) これは、対向の機器に対して BFD echo packet を送信すると、対向側では C-Plane を介さずに D-Plane が直接そのパケットをループバックするというものです。 一定時間対向から echo packet が返ってこない場合は断とみなします。
(参考) YJ Peering Router の Holdtime
Section titled “(参考) YJ Peering Router の Holdtime”2024/6/20 現在。 iBGP や社外 AS 宛は基本的に hold-time 30 を設定しているが、一部 IX は 90、相手により 9 など設定している。 DCNW 内と Inter AS ではタイマー値の考え方が異なるので DCNW では参考程度に。
| N | HoldTime (s) | Ratio | Rank |
|---|---|---|---|
| 4 | 9 | 0.7% | 4 |
| 1 | 15 | 0.2% | 6 |
| 1 | 21 | 0.2% | 6 |
| 514 | 30 | 85.7% | 1 |
| 4 | 40 | 0.7% | 4 |
| 5 | 60 | 0.8% | 3 |
| 71 | 90 | 11.8% | 2 |
https://www.arista.com/en/um-eos/eos-bidirectional-forwarding-detection https://www.juniper.net/documentation/us/en/software/junos/bgp/topics/topic-map/bfd-for-bgp-session.html https://www.juniper.net/documentation/us/en/software/junos/high-availability/topics/topic-map/bfd-configuring.html https://www.juniper.net/documentation/us/en/software/junos/high-availability/topics/topic-map/bfd.html https://netcraftsmen.com/clarifying-bfd-and-bfd-echo/