Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 02 章: BGP と FRR 制御プレーン を参照。
裏取りステータス: Code-verified
sonic-buildimage/src/sonic-bgpcfgd/bgpcfgd/managers_bgp.py L185-189 で「Loopback* の IPv4 が無く、かつ DEVICE_METADATA.localhost.bgp_router_id も設定されていない場合のみ peer 追加を中断」する分岐を確認。sonic-buildimage/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 L142-149 で 'bgp_router_id' in DEVICE_METADATA['localhost'] のとき bgp router-id <addr> をテンプレート出力することを確認 (verified at: 2026-05-09)。
BGP router-id を明示的に設定する(DEVICE_METADATA.bgp_router_id)¶
概要¶
SONiC の BGP は長らく Loopback インタフェースの IPv4 アドレスを暗黙的に router-id として使う 設計になっていた。具体的には単一 ASIC では Loopback0、マルチ ASIC では Loopback4096 の IPv4 アドレスをそのまま使用する。さらに bgpcfgd 側にも「Loopback0 の IPv4 が存在しなければ BGP ピアを追加しない」という強い依存があり、Loopback アドレスを使わない構成や、BGP router-id とインタフェースアドレスを分離したい運用では制約となっていた1。
本機能は CONFIG_DB.DEVICE_METADATA|localhost に bgp_router_id フィールドを追加し、ユーザが任意の IPv4 を BGP router-id として明示指定できる ようにする。同時に、bgp_router_id が設定されている場合に限り、単一 ASIC 系の BGP ピア追加から Loopback0 IPv4 への強い依存を切り離す。bgp_router_id を設定しない場合、振る舞いは従来と完全に同一である。
動作仕様¶
既存挙動(変更前)¶
flowchart TD
BGPC[bgp container 起動] --> RENDER[bgpd.conf 生成]
RENDER -->|Loopback0/4096 IPv4 を router-id に埋める| BGPD[bgpd 起動]
BGPD -->|router-id 未指定なら\nデバイス内最大 IP を選択| READY[BGP プロセス起動]
BGPCFGD[bgpcfgd 起動] --> CHECK{Loopback0 IPv4 あり?}
CHECK -->|Yes| ADD[BGP ピア追加]
CHECK -->|No| ABORT[ピア追加中断 / False]
要点は次のとおり。
- bgpd 設定生成時に Loopback0/4096 の IPv4 をそのまま router-id として埋め込む。なければ未指定のまま起動。
- 未指定で起動した bgpd は「デバイス内で最大の IP アドレス」を選ぶが、ネットワーク内で一意でないと BGP が動かないリスクがある1。
bgpcfgdは Loopback0 の IPv4 が無いとピア追加自体を打ち切る。マルチ ASIC では eBGP ピア追加に同じ条件が入る。
新挙動(bgp_router_id 設定時)¶
新ロジックは router-id 決定とピア追加の 2 箇所で分岐する。
router-id 決定ロジック¶
| 状況 | Loopback0/4096 IPv4 あり | Loopback0/4096 IPv4 なし |
|---|---|---|
bgp_router_id 設定あり |
bgp_router_id を採用 |
bgp_router_id を採用 |
bgp_router_id 設定なし |
Loopback0/4096 IPv4 を採用 | router-id 未指定(FRR デフォルト動作。zebra 未起動時は 0.0.0.0) |
つまり bgp_router_id が定義されていれば常にそれを最優先で採用 し、Loopback アドレスは無関係になる。
📋 検証エビデンス: sonic-net/SONiC/doc/BGP/BGP-router-id.md#L70-L84 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/BGP/BGP-router-id.md#L70-L84 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
Add a field bgp_router_id in CONFIG_DB["DEVICE_METADATA"]["localhost"]...
If CONFIG_DB["DEVICE_METADATA"]["localhost"]["bgp_router_id"] configured, always use it as BGP router id.
... When bgp_router_id doesn't be configured, the behavior is totally same as previously.
判断根拠: 「bgp_router_id があれば常にそれを使う」「未設定時は従来動作維持」という設計の根拠。
BGP ピア追加ロジック(単一 ASIC)¶
| 状況 | Loopback0 IPv4 あり | Loopback0 IPv4 なし |
|---|---|---|
bgp_router_id 設定あり |
ピア追加 | ピア追加 |
bgp_router_id 設定なし |
ピア追加 | 追加しない(従来挙動) |
bgp_router_id が設定されている限り、単一 ASIC では Loopback0 IPv4 が無くても BGP ピアを追加する。bgp_router_id が無い場合の挙動は従来どおり Loopback0 必須。
BGP ピア追加ロジック(マルチ ASIC)¶
マルチ ASIC では各 ASIC ごとに bgp[x] コンテナと config_db が独立に存在し、ASIC は FrontEnd / BackEnd の役割を持つ。新ロジックは次のように振る舞う1。
flowchart TD
START[bgpcfgd 起動] --> ROLE{ASIC role}
ROLE -->|FrontEnd| FE_CHK{Loopback0 IPv4 あり\nor bgp_router_id 設定あり}
FE_CHK -->|Yes| FE_E[eBGP ピア追加]
FE_E --> FE_LB4{Loopback4096 IPv4 あり?}
FE_LB4 -->|Yes| FE_I[iBGP ピア追加]
FE_LB4 -->|No| FE_DONE[完了]
FE_CHK -->|No| ABORT[ピア追加中断]
ROLE -->|BackEnd| BE_CHK{Loopback0 IPv4 あり\nor bgp_router_id 設定あり}
BE_CHK -->|Yes| BE_LB4{Loopback4096 IPv4 あり?}
BE_LB4 -->|Yes| BE_I[iBGP ピア追加]
BE_LB4 -->|No| ABORT2[iBGP 追加中断]
BE_CHK -->|No| ABORT
注意点として、iBGP ピア追加は依然として Loopback4096 IPv4 を必須 とする。HLD は内部ピアの追加ロジックは今回の変更対象外と明記している1。
動作シーケンス(単一 ASIC、新ロジック)¶
sequenceDiagram
participant CDB as CONFIG_DB
participant BGP as bgp container
participant BGPD as bgpd
participant CFGD as bgpcfgd
BGP->>CDB: DEVICE_METADATA / LOOPBACK_INTERFACE 読み出し
alt bgp_router_id あり
BGP->>BGP: router-id := bgp_router_id
else bgp_router_id なし & Loopback0 IPv4 あり
BGP->>BGP: router-id := Loopback0 IPv4
else どちらも無い
BGP->>BGP: router-id 未指定(FRR が選択)
end
BGP->>BGPD: bgpd 起動(生成済み bgpd.conf)
CFGD->>CDB: ピア定義読み出し
alt Loopback0 IPv4 あり
CFGD->>BGPD: ピア追加
else bgp_router_id あり
CFGD->>BGPD: ピア追加(Loopback0 不要)
else どちらも無い
CFGD->>CFGD: 中断 (False)
end
設定¶
関連する CONFIG_DB¶
| Table | Key | フィールド | 説明 |
|---|---|---|---|
DEVICE_METADATA |
localhost |
bgp_router_id |
BGP router-id として使う IPv4 アドレス。未設定時は従来動作 |
ABNF スキーマ抜粋1:
マルチ ASIC では各 ASIC の config_db に同じキーで書き込む必要がある。
関連する CLI¶
HLD には専用の config / show CLI 追加は記載されていない。config_db.json 直接編集または既存の汎用 CONFIG_DB 操作経路(sonic-cfggen / gNMI 等)から設定する想定。
関連する YANG¶
sonic-device_metadata モジュールに bgp_router_id リーフ(inet:ipv4-address 型)が追加される1。
module sonic-device_metadata {
container sonic-device_metadata {
container DEVICE_METADATA {
container localhost {
leaf bgp_router_id {
type inet:ipv4-address;
}
}
}
}
}
設定例¶
干渉する機能¶
- Loopback0 / Loopback4096: 引き続き iBGP ピア追加(マルチ ASIC)の必須条件として
Loopback4096IPv4 が要求される。bgp_router_idを設定しても iBGP の依存は解消されない。 - FRR の router-id 自動選択:
bgp_router_idも Loopback も無い場合、FRR は最大 IP アドレスを router-id に選ぶ。zebra 未起動時は0.0.0.0が選ばれる旨が HLD に明記されている1。ネットワーク全体で一意でないと BGP セッションが確立できない。 - bgpcfgd: ピア追加判定が
bgp_router_idの有無を見るように拡張される。
トラブルシューティング¶
- BGP セッションが上がらないとき、まず
vtysh -c "show bgp summary"で実際に使われている router-id を確認する。bgp_router_id設定値と一致しているはずである。 - ピアが一切登録されない場合、
bgpcfgdのログを確認する。Loopback0IPv4 不在でbgp_router_id未設定だと「neighbors adding を中断」する経路に入る。 - マルチ ASIC で iBGP のみ上がらない場合、対応 ASIC の
Loopback4096IPv4 設定を確認する。bgp_router_idでは iBGP 依存は解消されない。
コマンド例¶
明示設定された router-id が BGP セッションに反映されているか確認する。
sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["bgp_router_id"]'
docker exec bgp vtysh -c 'show bgp summary' | head
docker logs bgp 2>&1 | grep -i 'router-id' | tail
制限事項¶
- router-id を自動選出から明示設定に切り替える際、FRR が稼働中だと一度 BGP セッションが reset される。メンテナンス時間に実施する。
- multi-vrf / multi-asic 環境では VRF / namespace ごとに router-id を分離設定する必要があり、共通 ID 使用は実装上推奨されない。
- 設定変更後に
config_db.jsonを保存し忘れるとリブート時に自動選出に戻る。config save -yの運用を明示する。