コンテンツにスキップ

Topics で読み物として読む

この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 07 章: ACL / CoPP / Mirror を参照。

裏取りステータス: code-verified (2026-05-10)

sonic-swss/orchagent/aclorch.cpp / aclorch.h / acltable.h で AclOrch 本体が実装。APPL_DB の ACL_TABLE_TABLE / ACL_RULE_TABLEsonic-swss-common/common/schema.h:94,96APP_ACL_TABLE_TABLE_NAME として定義。後発の DASH ACL は APP_DASH_ACL_RULE_TABLE_NAME (schema.h:178) として別系統で共存。

ACL in SONiC(テーブル型 / マッチ・アクション / SWSS パイプライン)

読み手が真っ先に知りたいのは「SONiC の ACL はどの単位で書き、どこを経由して TCAM に降りるのか」「どの type なら何が match / action できるのか」「動的に CLI で追加した rule と起動時の静的 JSON はどう統合されるのか」の 3 点だろう。以下、その順に答える。

ACL はどの単位で書くのか

SONiC の ACL は table(型を持つ)+ rule の二層構造。table の type で許される match / action と bind 先(port / LAG / VLAN / switch)が決まる1

主な type:

  • L3 / L3v6: ingress IPv4 / IPv6 ACL
  • MIRROR / MIRRORV6: ingress traffic を mirror
  • PFCWD, EVERFLOW, DROP, MUX: 用途別の派生 type(HLD 本体は基礎のみ記述、後発で追加)
  • カスタム: Rev 1.1 (2025-04) で VXLAN inner src MAC rewrite 用 type が追加1

CONFIG_DB のキーは次の 2 つだけ。

ACL_TABLE|<table_name>
  type   = "L3" | "L3v6" | "MIRROR" | ...
  ports  = "Ethernet0,PortChannel001,..."   # bind 対象
  stage  = "ingress" | "egress"

ACL_RULE|<table_name>|<rule_name>
  PRIORITY      = <int>
  PACKET_ACTION = "DROP" | "FORWARD"
  SRC_IP / DST_IP / IP_PROTOCOL / L4_*_PORT / ETHER_TYPE / TCP_FLAGS / IN_PORTS …

CLI → ASIC まで何が起きるのか

CONFIG_DB → APPL_DB → AclOrch → SAI RedisASIC_DBsyncd → SAI → ASIC TCAM、というスタックを通る1

flowchart LR
  CONF[config_db.json /<br/>swssconfig.json] --> APP[APPL_DB<br/>ACL_TABLE_TABLE<br/>ACL_RULE_TABLE]
  APP --> ORCH[AclOrch]
  ORCH --> SAI[SAI ACL API]
  SAI --> ASIC[ASIC TCAM]

経路の入口は 2 つ。

  • 動的: config acl ... CLI が CONFIG_DB → APPL_DB
  • 静的: swssconfig <file.json> が JSON を APPL_DB に直接流す(OP=SET|DEL

どちらも APPL_DB に着いた時点で AclOrch が subscribe して同じ経路で SAI に降ろす1

type ごとに何が match / action できるのか

table の type が match / action 集合を固定 する1。代表例:

Type 主な match 主な action
L3 SRC_IP, DST_IP, IP_PROTOCOL, L4_*_PORT, ETHER_TYPE, TCP_FLAGS, IN_PORTS PACKET_ACTION=FORWARD/DROP, counter, ranges
L3v6 同上 + IPv6 同上
MIRROR L3 と同種 + ranges MIRROR_INGRESS_ACTION
custom (VXLAN inner src MAC rewrite) inner header フィールド inner src MAC rewrite1

type を後から変える運用は不可。egress ステージは ASIC によって match set が大きく狭まる。ベンダ SAI の対応範囲はバラつくので SWITCH_CAPABILITY で capability query するのが推奨。

Mirror table の特殊事情

Mirror テーブルは MIRROR_SESSION の状態に追従する。session が ready でないときは ACL rule も effective にならない1

Phase 構成(HLD の歴史)

HLD は実装を 3 phase に分けていた1:

  • Phase 1: L3 / Mirror table, 基本 match / action, create/delete
  • Phase 2: counter, table/rule update, 動的反映
  • Phase 3: ranges, port/LAG bind, mirror 細部

現行 master では全 phase が入っている前提で運用してよいが、SAI 側の対応範囲は ASIC 依存。

📋 検証エビデンス: sonic-net/SONiC/doc/acl/ACL-High-Level-Design.md#L83-L91 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)

出典:

sonic-net/SONiC/doc/acl/ACL-High-Level-Design.md#L83-L91 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)

抜粋:

| 1.1 | 08-Apr-2025 | Anish Narsian | VXLAN inner src mac rewrite support |

判断根拠: Rev 1.1 で VXLAN inner src MAC rewrite が追加されたことの根拠。

設定例とトラブルシューティング

config acl add table BLACKLIST L3 -p Ethernet0,Ethernet4 -s ingress
config acl add rule BLACKLIST DENY_BAD --priority 10 \
  --src-ip 192.0.2.0/24 --action DROP
aclshow -a

CONFIG_DB / APPL_DB / ASIC_DB / capability を見るコマンド:

redis-cli -n 4 KEYS "ACL_TABLE|*"
redis-cli -n 0 KEYS "ACL_*"
redis-cli -n 1 KEYS "ASIC_STATE:SAI_OBJECT_TYPE_ACL_*" | head
redis-cli -n 6 HGETALL "SWITCH_CAPABILITY|switch" | grep -i ACL

CLI 一覧:

Command 用途
config acl add table <name> <type> table 作成
config acl add rule <table> <rule> rule 追加
config acl remove ... 削除
aclshow [-a] [-t <table>] [-r <rule>] hit カウンタ
swssconfig <file.json> 静的 ACL ロード

既知の問題

ACL のデフォルト deny は自動で機能しない(#269)

JSON 設定または config acl CLI で ACL ルールを定義した場合、暗黙の default deny は存在しない。明示的な forward ルールがある場合、それ以外のトラフィックは許可されてしまう。

default deny を実現するには、最低優先度(最大の PRIORITY 値)で catch-all の DROP ルールを明示的に追加する必要がある。

"ACL_RULE": {
    "TABLE_NAME|CATCH_ALL": {
        "PRIORITY": "10000",
        "IP_TYPE": "ipv4any",
        "PACKET_ACTION": "DROP"
    }
}

PRIORITY 値が大きいほど低優先度(最後に評価)となるため、catch-all を最大値に設定することで他のルールが先に評価される。IPv6 トラフィックに対しても別途 IP_TYPE: ipv6any のルールが必要。

MIRRORV6 ACL では IPV6_NEXT_HEADER キーがサポートされていない制約(sonic-buildimage#4570)

MIRRORV6 ACL では IPV6_NEXT_HEADER キーがサポートされていない制約。IPv6 ミラーリング ACL の設定時は対応フィールドを事前確認すること

aclshow ユーティリティがコントロールプレーン ACL のカウンターを表示しない制約(sonic-buildimage#5015)

aclshow ユーティリティがコントロールプレーン ACL のカウンターを表示しない制約。iptables ベースの COPP ACL は iptables -L -n -v で確認すること

COPP に ~350 個のルールを設定すると iptables への適用に 10 分以上かかる制約(sonic-buildimage#5275)

COPP に ~350 個のルールを設定すると iptables への適用に 10 分以上かかる制約。大量の COPP ルールは起動時間に大きく影響するため、ルール数を最小化すること

warm reboot 後にミラーリングルールの適用が失敗する問題(sonic-buildimage#5497)

warm reboot 後にミラーリングルールの適用が失敗する問題。ミラー宛先ポートの再設定が warm reboot 後に正しく実行されない場合がある

干渉する機能

  • Mirror セッション: Mirror table は MIRROR_SESSION と密結合
  • EVERFLOW / DSCP-based mirror: Mirror 上に積み重ねる別 HLD
  • PFCWD / DROP / MUX: 同じ ACL_TABLE 機構を type 違いで再利用
  • ACL Flex Counters: Phase 2 から導入
  • port / LAG: ports で bind。LAG 解体時の rebind は AclOrch 側ロジック

関連トピック

関連ページ

制限事項

  • ASIC TCAM 容量に直結: ACL_TABLE / ACL_RULE は SAI 経由で TCAM を消費する。CRM (Critical Resource Monitor) で acl_table / acl_entry / acl_counter のしきい値超過時、新規 rule 追加は失敗する。
  • type ごとの match / action 制約: L3 / L3V6 / MIRROR / MIRRORV6 / PFCWD / DROP / MUX で利用できる match field と action は異なる。ベンダー SAI 実装によっては HLD で許される組み合わせの一部が未対応。
  • bind 対象の単位: ports で port または LAG を指定する。VLAN / subinterface 単位の bind は type とプラットフォーム依存で、HLD は port / LAG を主とする。
  • Flex Counter 連動: counter 取得には FLEX_COUNTER_TABLEACLenable にする必要がある。無効時は aclshow / show acl rule のカウンタが 0 のままになる。
  • ACL_TABLE の再 bind タイミング: LAG 解体 / 再構成や Mux active/standby 切替時の rebind 中は短時間 ASIC 上のルールが消える可能性があり、実時間保証はない。
  • SAI_STATUS_INSUFFICIENT_RESOURCES 時のリトライ優先度 (sonic-swss#4406): handleSai が SAI_STATUS_INSUFFICIENT_RESOURCES を受け取った際に ACL ACE のリトライキューが蓄積し、ルートプログラミングよりも優先されてしまう問題がある。高負荷時に ACL エントリの追加が失敗し続ける環境では、orchagent が本来のルート更新より ACL リトライを繰り返すことでルート収束が遅延する可能性がある。
  • TABLE_TYPE_MIRRORV6 の IN_PORTS 非サポート (sonic-swss#2204): MIRRORV6 テーブルタイプでは IN_PORTS マッチフィールドが実装されていない。IPv6 ミラーセッションで入力ポートを限定したい場合は MIRRORV6 が使えない制約がある。

引用元

関連 Topics


  1. sonic-net/SONiC doc/acl/ACL-High-Level-Design.md @ 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06