Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 07 章: ACL / CoPP / Mirror を参照。
裏取りステータス: code-verified (2026-05-11)
sonic-buildimage/src/sonic-pac/ 配下に PAC のコンポーネント (authmgr, mab, mabmgr, hostapdmgr, pacmgr, paccfg, pacoper, fpinfra, json_lib) が取り込み済みであることを確認。hostapdmgr.cpp L43-L46 で CFG_PAC_PORT_CONFIG_TABLE / CFG_PAC_HOSTAPD_GLOBAL_CONFIG_TABLE / RADIUS_SERVER / RADIUS 4 テーブルを subscribe する経路を確認。SAI Bridge port learning モード変更詳細・host interface trap の詳細は sai_redis / vendor SAI スコープのため別途。
Port Access Control(PAC: 802.1x / MAB / RADIUS)¶
概要¶
物理ポート単位の クライアント認証 (IEEE 802.1x + MAB)を SONiC に持ち込む機能1。RADIUS で外部 AAA サーバに問合せ、結果に応じて当該 MAC をポートに「authorized / unauthorized」状態で許可する。authorized クライアントを VLAN に動的に割り当てる(VLAN assignment)こともできる。
要点:
- 対象は 物理 interface のみ(LAG / VLAN bind は不可)1
- 認証方式: 802.1x(EAPoL)/ MAB(MAC をクライアント識別子として RADIUS に問合せ)。両方を同一ポートに有効化可、優先順序は設定可能1
- ホストモード: Multiple Hosts / Single-Host / Multiple Authentication
- ポートモード: Auto / Force-Authorized / Force-Unauthorized
- Re-authentication 対応
動作仕様¶
コンポーネント構成¶
flowchart TB
SUP[supplicant\n(端末)] -->|EAPoL| HAPD[hostapd]
SUP -->|MAC(フレーム)| MABD[mabd]
HAPD <-->|control| HAPDMGR[hostapdmgrd]
MABD --> AM[Authentication Manager]
HAPD --> AM
AM --> ORCH[orchagent / SAI]
AM -->|RADIUS request| RAD[RADIUS server]
AM -->|state 反映| STATE[(STATE_DB)]
CONF[(CONFIG_DB\nPAC_PORT_CONFIG_TABLE\nHOSTAPD_GLOBAL_CONFIG_TABLE\nRADIUS / RADIUS_SERVER)] --> HAPDMGR
CONF --> AM
ORCH --> SAI[(SAI: bridge port learning,\nFDB, VLAN, host trap)]
各 daemon の責務¶
| Daemon | 役割 |
|---|---|
hostapd |
802.1x EAP-{MD5, PEAP, TLS} などの supplicant 対応 |
hostapdmgrd |
CONFIG_DB を hostapd 設定ファイルに変換、再読込制御 |
mabd |
MAB 用に MAC 学習をトリガにして RADIUS リクエストを発行(PAP / CHAP / EAP-MD5)1 |
| Authentication Manager | 802.1x と MAB の結果統合、ポート / クライアントの authorized state 管理 |
CONFIG_DB¶
PAC_PORT_CONFIG_TABLE|<port>:
pac_enabled = true | false
port_control = auto | force-authorized | force-unauthorized
host_mode = multi-host | single-host | multi-auth
reauth = enabled | disabled
priority = dot1x-then-mab | mab-then-dot1x
HOSTAPD_GLOBAL_CONFIG_TABLE:
...
RADIUS:
auth_type, retransmit, ...
RADIUS_SERVER|<server-ip>:
auth_port, key, priority, ...
STATE_DB に client / port の authorized 状態と認証方式(dot1x / mab)を出す1。
SAI 影響¶
- Bridge port learning mode の変更: PAC 有効ポートでは learning 制御が PAC 側に移る1
- FDB: authorized クライアント MAC のみ移動 / 学習を許可。MAC move 時の挙動は HLD で別節
- VLAN: RADIUS から VLAN 割当属性が来たら dynamic VLAN bind
- Host interface trap: EAPoL / MAB 用フレームを CPU に上げるため新 trap 追加
認証フロー¶
sequenceDiagram
participant C as supplicant
participant DUT as PAC port
participant H as hostapd / mabd
participant AM as Auth Mgr
participant R as RADIUS
C->>DUT: EAPoL or MAC frame
DUT->>H: trap to CPU
H->>AM: identity
AM->>R: Access-Request
R-->>AM: Accept (VLAN, Session-Timeout)
AM->>DUT: authorize MAC, set VLAN
Note right of DUT: 当該 MAC のフレームのみ通す
Warm reboot¶
HLD では 802.1x / MAB の認証状態を STATE_DB から復元する想定で書かれている1。具体的なステートシリアライズは別節。
📋 検証エビデンス: sonic-net/SONiC/doc/pac/Port Access Control.md#L120-L160 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/pac/Port Access Control.md#L120-L160 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
PAC should be supported on physical interfaces only.
PAC should enforce access control for clients ... using ... 802.1x, MAB.
... The following PAC port modes should be supported: Auto / Force Authorized / Force Unauthorized
判断根拠: 物理 IF 限定・802.1x/MAB 併用・3 種 port mode の根拠。
設定¶
関連する CLI(HLD で言及)¶
| Command | 用途 |
|---|---|
config authentication port-control auto Ethernet0 |
port mode |
config authentication host-mode multi-auth Ethernet0 |
host mode |
config dot1x enable Ethernet0 |
802.1x 有効化 |
config mab enable Ethernet0 |
MAB 有効化 |
config radius add <ip> --key <secret> |
RADIUS server 追加 |
show authentication interface Ethernet0 |
認証状態表示 |
clear authentication sessions interface Ethernet0 |
セッションクリア |
CLI 文法は HLD ベース。実装は v0.2 / v0.3 で見直されているため詳細差異あり。
制限事項¶
- 物理 interface のみ1
- EAP-TLS の証明書管理は別経路(hostapd 側設定)
- 動的 VLAN は RADIUS 属性経由のみ
- LAG メンバーポートに直接 PAC を効かせるのは想定外(LAG でなくメンバーが認証対象)
干渉する機能¶
- VLAN / FDB: dynamic VLAN 割当・MAC move によって VLAN_MEMBER / FDB が変動
- AAA / RADIUS: AAA improvements や RADIUS 全体の改修と密接(management 章の RADIUS / AAA ページ参照)
- CoPP: EAPoL / MAB のフレームを CPU に上げる trap が CoPP queue を消費
トラブルシューティング¶
- 認証が通らない →
show authentication interfaceでセッション状態確認、RADIUS server reachable 確認 - VLAN が変わらない → RADIUS Accept に VLAN attribute(Tunnel-Type / Tunnel-Medium-Type / Tunnel-Private-Group-ID)が来ているか抽出ログ確認
- MAB が誤判定 →
mabdログで MAC 学習契機と RADIUS リクエスト送出を確認
コマンド例: Port Access Control 確認¶
下記コマンドを順に実行することで、関連する CONFIG_DB / APP_DB / STATE_DB のエントリと、 CLI 表示・syslog の整合を一通り突き合わせ確認できる。
# PAC 機能 (802.1X / MAB) の認証状態と CONFIG_DB を確認
show authentication interface all
redis-cli -n 4 keys 'PAC_*'
redis-cli -n 4 hgetall 'PAC_PORT_CONFIG_TABLE|Ethernet0'
# hostapd / pac-agent のログ
sudo grep -Ei 'hostapd|pac' /var/log/syslog | tail -50
裏取り済み実装位置 (2026-05-11)¶
- PAC コンポーネントツリー:
sonic-buildimage/src/sonic-pac/配下のauthmgr/,mab/,mabmgr/,hostapdmgr/,pacmgr/,paccfg/,pacoper/,fpinfra/,json_lib/を確認 - hostapdmgr のテーブル subscribe:
sonic-buildimage/src/sonic-pac/hostapdmgr/hostapdmgr.cppL43-L46(CFG_PAC_PORT_CONFIG_TABLE,CFG_PAC_HOSTAPD_GLOBAL_CONFIG_TABLE,RADIUS_SERVER,RADIUS) - PAC_PORT_CONFIG_TABLE イベント処理: 同 L107, L231(
Received an table config event on PAC_PORT_CONFIG_TABLE tableログ + DEL 操作の warn) - HOSTAPD_GLOBAL_CONFIG_TABLE イベント処理: 同 L242, L342
- RADIUS / RADIUS_SERVER イベント処理: 同 L502-L623(DEL warn, hostapd への RADIUS 設定再計算)
- pacmgr daemon entry:
sonic-buildimage/src/sonic-pac/pacmgr/pacmgr_main.cpp/pacmgr.cpp
SAI bridge port learning モード制御や host-bound EAPoL trap の vendor SAI 取り込み度合いは別バッチで sairedis / sai-headers 側を裏取りする。