Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 14 章: Platform / Port / Optics を参照。
裏取りステータス: code-verified
実装裏取り済み(下記コード位置)。dhcpmon / dhcrelay: sonic-buildimage/dockers/docker-dhcp-relay/dhcp-relay.monitors.j2 で program:dhcpmon-{vlan} と /usr/sbin/dhcpmon -id
DHCPv4 Relay Agent(dhcpmon / dhcrelay / option-82 / circuit-id)¶
概要¶
ToR スイッチが downstream client から受けた DHCPDISCOVER / REQUEST broadcast を、upstream の DHCP サーバ群へ unicast で中継する仕組み1。SONiC は ISC 由来の dhcrelay を VLAN 単位で起動し、付随する dhcpmon で監視・統計収集する。
主な責務:
- VLAN broadcast → upstream へ relay(複数 server に対する parallel forwarding)
- option-82(Relay Agent Information)に circuit-id / remote-id を埋め込む
- dual ToR / MC-LAG 環境で 1 client の DHCPLEASE が双方の ToR から重複して返らないように調整
- counter / リーク検知のための状態を
STATE_DB/ log に出す
動作仕様¶
flowchart LR
CLI[client\nDHCPDISCOVER bcast] --> VLAN[VLAN interface]
VLAN --> RELAY[dhcrelay\nVLAN 単位で起動]
RELAY -->|option-82 付加| SRV[(DHCP server群)]
SRV --> RELAY
RELAY --> VLAN
VLAN --> CLI
RELAY -.通信観測.-> MON[dhcpmon]
MON --> STDB[STATE_DB / log]
ポイント1:
dhcrelayは CONFIG_DB のDHCP_RELAY|<VLAN>からdhcp_serversリストを読み、VLAN 単位に起動。VLAN を VRF にバインドしている場合は VRF コンテキスト指定で動かす- option-82 の circuit-id はデフォルトで client 側 interface 名相当(実装によっては VLAN + port)、remote-id は switch hostname or MAC ベース
dhcpmonはdhcrelayの入出力を観測してドロップ / カウンタをSTATE_DBに出す。dual-ToR / active-active 構成で peer 側との整合性を見る運用に用いる
dual ToR / MC-LAG での挙動¶
- 両 ToR で
dhcrelayを起動する設計だが、リース重複や ToR 切替えで lease の移行が発生し得る - 詳細はこの HLD では概要のみ。dual-ToR の active-active / standby ページを参照する
設定¶
関連する CONFIG_DB¶
| Table | Key | 説明 |
|---|---|---|
DHCP_RELAY |
<vlan> |
dhcp_servers(list of DHCP server IP)、vrfid 等 |
VLAN |
<vlan> |
VLAN そのものの定義(DHCP relay 対象は VLAN interface) |
関連する CLI¶
| Command | 用途 |
|---|---|
config vlan dhcp_relay add <vlan> <server> |
server 追加 |
config vlan dhcp_relay del <vlan> <server> |
server 削除 |
show dhcp_relay ipv4 |
リレー設定とカウンタ表示 |
設定例¶
config vlan dhcp_relay add 1000 10.1.0.1
config vlan dhcp_relay add 1000 10.1.0.2
show dhcp_relay ipv4
既知の問題¶
Option 82 の circuit-id に物理ポート名を記録できない(#57)¶
SONiC の DHCP relay は VLAN インターフェース上でパケットを受信するため、ISC dhcrelay の Option 82 circuit-id には VLAN インターフェース名が記録される(物理ポート名ではない)。
isc-dhcp-relay では受信インターフェース名を circuit-id に利用するが、VLAN インターフェースに IP が割り当てられている場合、物理ポート(メンバーポート)を特定する手段がない。メンバーポートには IP アドレスがないため dhcrelay がパケットを破棄してしまう。
この制約は isc-dhcp-relay の実装上の制限であり、SONiC 固有の問題ではない。物理ポート名を circuit-id に含める要件がある場合は dhcrelay のパッチまたは代替 relay 実装が必要。
制限事項¶
- broadcast 起点のみ: client が unicast で server を直叩きする経路は relay 対象外
- option-82 の circuit-id / remote-id 文字列フォーマットは platform / 実装で差がある
- dual-ToR 環境では client 側 single-link / dual-link で挙動が異なる(peer 側 relay の有無)
- ISC
dhcrelay自体の制約(-pfPID file、parallel server 数)は ISC 側に依存
干渉する機能¶
- dual ToR active-active / standby: lease 整合と repaire の挙動が ToR モードで変わる
- VRF: server 到達経路の VRF 指定が必要。
mgmtVRF か data VRF か明確化が要件 - ipv4-port-based-dhcp-server: SONiC 側で local DHCP server を立てる場合との排他関係(用途が違う)
- DHCP DoS mitigation / dhcp-mac-move-test: ACL / 監視系がパケットドロップの原因になり得る
トラブルシューティング¶
- client がアドレスを取れない →
show dhcp_relay ipv4でカウンタ、dhcrelayプロセス起動状態、server 到達性を確認 - option-82 が想定と違う →
dhcrelay起動引数の circuit-id / remote-id 設定とプラットフォーム実装差を確認 - dual-ToR で IP がフラップ → ToR モード(active-active / active-standby)と peer 側 relay の状態確認
コマンド例: DHCPv4 relay の確認¶
下記コマンドを順に実行することで、関連する CONFIG_DB / APP_DB / STATE_DB のエントリと、 CLI 表示・syslog の整合を一通り突き合わせ確認できる。
# DHCP relay 設定と統計の確認
show dhcp_relay ipv4 helper
show dhcp_relay ipv4 counters
redis-cli -n 4 keys 'DHCP_RELAY|*'
# dhcrelay / dhcp-relay container のログ
docker logs dhcp_relay 2>&1 | tail -50