コンテンツにスキップ

Runbook: BGP Graceful Restart のネゴシエーションに失敗する

HLD-only

本ページは HLD と FRR の一般動作から再構成した運用ノートで、実コード追跡は一部に留まる。SHA は参考。

実行前提

clear ip bgp * / systemctl restart bgp は全 neighbor を一旦切る。GR の検証時は片方向ずつ行い、ECMP の他経路で fail-over できることを確認してから実行する。

症状

  • bgp container を systemctl restart bgp で再起動した瞬間に traffic が落ちる(GR が効いていない)
  • show bgp neighbor <peer>Graceful Restart Capability: none または対向が Restart Time: 0
  • syslog に bgpd: ... End-of-RIB ... not received が出て、stale path が消えてしまう

切り分けフロー

flowchart TD
    A[GR が効いていない] --> B{自分側の GR 有効?}
    B -- No --> C[bgp graceful-restart を有効化]
    B -- Yes --> D{対向が GR capability を送るか}
    D -- No --> E[対向側設定を確認 / vendor 制限]
    D -- Yes --> F{Restart Time / Stale Path Time 一致?}
    F -- No --> G[両端の timer を揃える]
    F -- Yes --> H{End-of-RIB を受信できているか}
    H -- No --> I[control plane の負荷 / TCP MSS / MD5 を確認]

確認コマンド

# GR capability の現状
docker exec bgp vtysh -c "show bgp neighbor <peer_ip>" | grep -A20 "Graceful Restart"

# 設定値
docker exec bgp vtysh -c "show running-config" | grep -E "graceful-restart|restart-time|stalepath-time"

# CONFIG_DB 側
sonic-db-cli CONFIG_DB hgetall "BGP_GLOBALS|default" | grep -i graceful

# Restart 直後の stale path
docker exec bgp vtysh -c "show bgp ipv4 unicast" | grep -i stale | head

よくある原因

  1. 片側でしか graceful-restart が有効化されていないbgp graceful-restart が router bgp 配下に無い
  2. Restart Time が短すぎる — bgpd 再起動が完了する前に対向が stale path を破棄
  3. GR-Notification capability の非互換 — RFC 8538 対応版とそれ以前で挙動が異なる
  4. BFD と併用時の即 downBFD が即 session down を通知するため GR をスキップする
  5. TCP セッションが MD5 / MSS で再確立できない — control plane の再ハンドシェイクが失敗

GR capability の交換は BGP OPEN メッセージ中の Capability Optional Parameter で行われ、FRRbgpd/bgp_open.c でエンコード/デコードする1

関連 reference / topics


  1. sonic-net/sonic-frr bgpd/bgp_open.c における Graceful Restart capability (Type 64) のパース。Restart Time / Flags / AFI-SAFI の対称性が両端で合っていなければ GR は片側だけ "advertised" 表示となり実際には機能しない。