ACL_RULE テーブル¶
概要¶
ACL_TABLE 内の個別ルールを定義する。優先度、match 条件 (5-tuple、TCP flags、TC、ICMP、tunnel inner、metadata 等)、action (PACKET_ACTION、REDIRECT、MIRROR、COUNTER、DSCP 上書き、DTel 等) を持つ1。AclOrch が ACL_TABLE 配下のルールを SAI ACL entry として展開する。
YANG 未定義
ACL_RULE テーブルは YANG モジュールで未定義。スキーマの正本は sonic-swss/orchagent/aclorch.{h,cpp}。
データフロー (自動生成)¶
flowchart LR
CDB[("CONFIG_DB<br/>ACL_RULE")]
DM["AclOrch"]
CDB --> DM
APPDB[("APP_DB<br/>APP_ACL_RULE_TABLE")]
DM --> APPDB
SYNCD["syncd"]
APPDB --> SYNCD
SAI["SAI<br/>sai_acl_api"]
SYNCD --> SAI
凡例
CONFIG_DB から SAI までの典型経路を docs/reference/config-db-orch-map.md から機械生成したミニ図。詳細・例外は本ページ本文と対応表を参照。
key 構造¶
<table_name> は ACL_TABLE.name を参照(実装上は名前一致のみで leafref はない)。
共通フィールド¶
| フィールド | 型 | 説明 |
|---|---|---|
PRIORITY |
uint32 | ルール評価順位。値が大きいほど優先 |
PACKET_ACTION |
enum FORWARD/DROP/DO_NOT_NAT/etc |
既定アクション |
match フィールド (代表)¶
| 名前 | 値 |
|---|---|
IN_PORTS / OUT_PORT / OUT_PORTS |
カンマ区切り PORT 名 |
SRC_IP / DST_IP |
IPv4 prefix |
SRC_IPV6 / DST_IPV6 |
IPv6 prefix |
L4_SRC_PORT / L4_DST_PORT |
TCP/UDP ポート |
L4_SRC_PORT_RANGE / L4_DST_PORT_RANGE |
range <min>..<max> |
ETHER_TYPE |
uint16(hex 可) |
IP_PROTOCOL / NEXT_HEADER |
uint8 |
VLAN_ID |
uint16 |
TCP_FLAGS |
<flags>/<mask> |
IP_TYPE |
enum (ANY/IP/NON_IP/IPV4ANY/IPV6ANY/...) |
DSCP / TC |
DSCP / TC 値 |
ICMP_TYPE / ICMP_CODE / ICMPV6_TYPE / ICMPV6_CODE |
ICMP |
TUNNEL_VNI |
VNI |
INNER_ETHER_TYPE / INNER_IP_PROTOCOL / INNER_L4_SRC_PORT / INNER_L4_DST_PORT |
inner header |
INNER_SRC_MAC / INNER_DST_MAC / INNER_SRC_IP |
inner header |
BTH_OPCODE / AETH_SYNDROME |
RoCE 用 |
TUNNEL_TERM |
bool |
META_DATA |
uint32 |
action フィールド (代表)¶
| 名前 | 説明 |
|---|---|
PACKET_ACTION |
FORWARD / DROP 等 |
REDIRECT_ACTION |
redirect 先(next-hop / mirror セッション 等) |
DO_NOT_NAT_ACTION |
NAT バイパス |
DISABLE_TRIM_ACTION |
バッファ trim 無効化 |
MIRROR_ACTION / MIRROR_INGRESS_ACTION / MIRROR_EGRESS_ACTION |
mirror セッション参照 |
FLOW_OP / INT_SESSION / DROP_REPORT_ENABLE / TAIL_DROP_REPORT_ENABLE / FLOW_SAMPLE_PERCENT / REPORT_ALL_PACKETS |
DTel (DTEL_*) |
COUNTER |
カウンタ装着 |
META_DATA_ACTION |
metadata 上書き |
DSCP_ACTION |
DSCP 上書き |
INNER_SRC_MAC_REWRITE_ACTION |
inner SRC MAC rewrite |
ユーザ定義型 (ACL_TABLE_TYPE) を使う場合、ここで使える match / action は ACL_TABLE_TYPE.MATCHES / .ACTIONS で許可された集合に限られる。
購読者¶
orchagentAclOrch: SAI ACL entry を生成mirrororch:MIRROR_*_ACTION経由で連動copporch:CTRLPLANE種別のACL_TABLE配下のルールに連動
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
ACL_TABLE、MIRROR_SESSION、POLICER - 関連 CLI:
config acl - 関連 YANG: なし
例外条件・特殊挙動¶
| 条件 | 挙動 |
|---|---|
| key の TABLE_ID が空文字 | WARN ログ後 erase、skip |
| 対応する ACL_TABLE が未作成 | 待機 (it++)、テーブル作成後に再試行 |
| コントロールプレーンテーブルのルール | INFO ログ後 erase、skip |
AclRule::makeShared が例外 |
ERROR ログ後 erase & 関数 return(処理中断) |
| 未知/不正な属性名 | rule INACTIVE、erase |
MATCH_TCP_FLAGS あり・IP_PROTOCOL 未指定 |
IP_PROTOCOL=6 (TCP) を自動付与 |
| IPv4 と IPv6 matchfield 混在(L3V4V6 テーブル) | bAllAttributesOk=false、rule INACTIVE |
| SAI リソース枯渇 | retry キャッシュに退避、リソース解放後に再試行 |
| IN_PORTS/OUT_PORTS に非物理 IF | return false、rule INACTIVE |
| VLAN ID 範囲外 | return false、rule INACTIVE |
| Range 形式不正 | return false、rule INACTIVE |
値依存挙動マトリクス¶
PACKET_ACTION 値別挙動¶
YANG 定義値: FORWARD / DROP / REDIRECT (sonic-acl.yang:114-116)。
実装 lookup: aclPacketActionLookup (aclorch.cpp:145-147)。
| 値 | SAI マッピング | 効果 | evidence |
|---|---|---|---|
FORWARD |
SAI_PACKET_ACTION_FORWARD |
パケットを通過させる | aclorch.h:83, aclorch.cpp:145 |
DROP |
SAI_PACKET_ACTION_DROP |
パケットをドロップ | aclorch.h:84, aclorch.cpp:146 |
COPY |
SAI_PACKET_ACTION_COPY |
パケットを CPU コピー後に続行 (YANG 外) | aclorch.h:85, aclorch.cpp:147 |
REDIRECT |
oid 解決後に redirect | REDIRECT:<target> 形式。コロンなし / ターゲット空は return false → rule INACTIVE |
aclorch.h:86, aclorch.cpp:2013-2040 |
DO_NOT_NAT |
— | NAT 処理をバイパス (YANG 外) | aclorch.h:87 |
DISABLE_TRIM |
— | バッファ trim を無効化 (YANG 外) | aclorch.h:88 |
REDIRECT 後方互換
ACTION_PACKET_ACTION フィールドに REDIRECT:<target> を書く旧形式が後方互換として残る。新形式は REDIRECT_ACTION フィールドを使う (aclorch.cpp:2013)。
IP_TYPE 値別挙動¶
YANG 定義値 7 種 (sonic-acl.yang:122-130)。実装 lookup table (aclorch.cpp:503-512)。
YANG は mandatory true のため省略不可。
| 値 | SAI マッピング | 意味 | evidence |
|---|---|---|---|
ANY |
SAI_ACL_IP_TYPE_ANY |
IP/非IP 問わず全パケット | aclorch.h:100, aclorch.cpp:503 |
IP |
SAI_ACL_IP_TYPE_IP |
IPv4 または IPv6 パケット | aclorch.h:99, aclorch.cpp:504 |
IPV4 |
SAI_ACL_IP_TYPE_IPV4ANY |
IPv4 パケット (YANG のみ、実装上 IPV4ANY と同義) | sonic-acl.yang:125 |
IPV4ANY |
SAI_ACL_IP_TYPE_IPV4ANY |
IPv4 パケット | aclorch.h:101, aclorch.cpp:506 |
NON_IPV4 |
SAI_ACL_IP_TYPE_NON_IPV4 |
非 IPv4 パケット | aclorch.h:102, aclorch.cpp:507 |
IPV6ANY |
SAI_ACL_IP_TYPE_IPV6ANY |
IPv6 パケット | aclorch.h:103, aclorch.cpp:508 |
NON_IPV6 |
SAI_ACL_IP_TYPE_NON_IPV6 |
非 IPv6 パケット | aclorch.h:104, aclorch.cpp:509 |
ARP |
SAI_ACL_IP_TYPE_ARP |
ARP パケット (実装のみ、YANG 外) | aclorch.h:105, aclorch.cpp:510 |
ARP_REQUEST |
SAI_ACL_IP_TYPE_ARP_REQUEST |
ARP Request (実装のみ) | aclorch.h:106, aclorch.cpp:511 |
ARP_REPLY |
SAI_ACL_IP_TYPE_ARP_REPLY |
ARP Reply (実装のみ) | aclorch.h:107, aclorch.cpp:512 |
ETHER_TYPE 値別挙動¶
YANG pattern で 7 値に制限 (sonic-acl.yang:142)。実装では任意 uint16 を受理 (aclorch.cpp:1066)。
格納値は 0x プレフィックス付き hex 文字列。stoul(str, &idx, 0) で auto 判定 (converter.h:18)。
マスク: 0xFFFF (完全一致) で SAI に投入 (aclorch.cpp:1067)。
| 値 | プロトコル | 意味 | evidence |
|---|---|---|---|
0x88CC |
LLDP | Link Layer Discovery Protocol | sonic-acl.yang:142 |
0x8100 |
IEEE 802.1Q | VLAN タグ付きフレーム | sonic-acl.yang:142 |
0x8915 |
RoCE | RDMA over Converged Ethernet | sonic-acl.yang:142 |
0x0806 |
ARP | Address Resolution Protocol | sonic-acl.yang:142 |
0x0800 |
IPv4 | Internet Protocol version 4 | sonic-acl.yang:142 |
0x86DD |
IPv6 | Internet Protocol version 6 | sonic-acl.yang:142 |
0x8847 |
MPLS | MPLS ユニキャスト | sonic-acl.yang:142 |
stage 値別挙動 (ACL_TABLE から継承)¶
ACL_RULE 自体に stage フィールドはないが、所属 ACL_TABLE の stage により使用可能な action が変わる。
| 値 | SAI stage | MIRROR action | evidence |
|---|---|---|---|
INGRESS (既定) |
SAI_ACL_STAGE_INGRESS |
MIRROR_INGRESS_ACTION 有効 |
aclorch.cpp:166,173,263-266 |
EGRESS |
SAI_ACL_STAGE_EGRESS |
MIRROR_EGRESS_ACTION のみ有効 |
aclorch.cpp:167,185,270-272 |
type 値別挙動 (ACL_TABLE から継承)¶
ACL_RULE で使用可能な match / action は ACL_TABLE の type によって決まる。
| 値 | 使用可能な主 action | 備考 | evidence |
|---|---|---|---|
L3 |
PACKET_ACTION, REDIRECT_ACTION |
通常 IPv4 ACL | acltable.h:26, aclorch.cpp:200,454 |
L3V6 |
PACKET_ACTION, REDIRECT_ACTION |
IPv6 ACL。IP_PROTOCOL は非推奨 |
acltable.h:27, aclorch.cpp:220,1231 |
MIRROR |
MIRROR_INGRESS_ACTION |
ASIC capability 必須 | acltable.h:29, aclorch.cpp:260,3502 |
MIRRORV6 |
MIRROR_INGRESS_ACTION / MIRROR_EGRESS_ACTION |
ASIC capability 照会、一部統合 | acltable.h:30, aclorch.cpp:279,3503,5811 |
値別 grep カバレッジ¶
| フィールド | 値数 | 0 hit | 証跡ファイル |
|---|---|---|---|
PACKET_ACTION |
3 (YANG) / 6 (実装) | 0 | aclorch.h, aclorch.cpp |
IP_TYPE |
7 (YANG) / 10 (実装) | 0 | aclorch.h, aclorch.cpp, sonic-acl.yang |
ETHER_TYPE |
7 | 0 | sonic-acl.yang, aclorch.cpp |
stage (継承) |
2 | 0 | aclorch.cpp |
type (継承) |
4 (YANG) | 0 | acltable.h, aclorch.cpp |
複合条件¶
MATCH_TCP_FLAGSあり +IP_PROTOCOL未指定 →IP_PROTOCOL=6 (TCP)自動付与 (aclorch.cpp:5640-5660)IP_TYPE=IPV4ANY/IPV4+SRC_IPV6同一ルール混在 →bAllAttributesOk=false→ rule INACTIVE (aclorch.cpp:5636-5658)- YANG
choice ip_src_dst—IP_TYPEが IPv4 系ならSRC_IP/DST_IPのみ有効、IPv6 系ならSRC_IPV6/DST_IPV6のみ有効 (sonic-acl.yang:150-168) type=MIRROR/MIRRORV6+ stage=EGRESS →MIRROR_EGRESS_ACTIONのみ有効 (aclorch.cpp:270-272)PACKET_ACTION=REDIRECT:のコロン後ターゲット欠如 →return false→ rule INACTIVE (aclorch.cpp:2020-2028)
関連リファレンス¶
- CLI:
config acl
引用元¶
関連ページ¶
関連 Topics¶
運用ヒント¶
典型値¶
- key 形式:
ACL_RULE|<table-name>|<rule-name>。 priority: 0..65535(大きいほど優先)。9999 等の値を運用で使う。packet_action:FORWARD/DROP/REDIRECT:<nh>。- match:
src_ip/dst_ip/l4_src_port/ip_protocol等。
よくある誤設定¶
- 同じ
priorityを複数 rule で使うと適用順が ASIC 依存で予測不能。 SRC_IPを V6 テーブルに入れると無視され、rule が hit せず原因不明になる。SRC_IPV6を使う。packet_action: REDIRECT:の nexthop 解決が失敗すると rule が install されない(syslog 確認)。
確認コマンド¶
-
match / action のキー名は
sonic-swss/orchagent/aclorch.hのMATCH_*/ACTION_*マクロ定義から抽出。https://github.com/sonic-net/sonic-swss/blob/4305596156d70e9797e8a881b3d19b46de0bce0d/orchagent/aclorch.h ↩