コンテンツにスキップ

設定

ACL の最小設定は、table を作り、rule JSON を流し、show で確認する流れです。config acl は table の作成・削除と JSON の一括投入を提供しますが、個別 rule を CLI 引数で追加するインタフェースではありません。rule は JSON に書いて config acl update full または incremental で投入します。

最小 ACL

例として Ethernet0 に入ってくる特定送信元を drop する L3 ACL を考えます。

config acl add table DATAACL L3 -p Ethernet0 -s ingress -d "drop selected sources"

rule は JSON で定義します。

{
  "ACL_RULE": {
    "DATAACL|DROP_SRC_10_0_0_1": {
      "PRIORITY": "1000",
      "SRC_IP": "10.0.0.1/32",
      "PACKET_ACTION": "DROP"
    }
  }
}

投入は次の形です。

config acl update incremental acl-rules.json
show acl table DATAACL
show acl rule DATAACL

設定を読むときは ACL_TABLE|DATAACLtypestageports を先に見ます。その後に ACL_RULE|DATAACL|DROP_SRC_10_0_0_1PRIORITY、match、action を見ます。

ACL_RULE の基本

PRIORITY は値が大きいほど優先です。match は SRC_IP / DST_IPSRC_IPV6 / DST_IPV6IP_PROTOCOLL4_SRC_PORT / L4_DST_PORTETHER_TYPETCP_FLAGS などを組み合わせます。action は PACKET_ACTIONREDIRECT_ACTION、mirror action、POLICERDSCP 書換などです。

table type が action の可否を制限するため、rule JSON だけを別 table に移すと失敗することがあります。特に egress stage、mirror、DSCP 書換、packet trimming のような action は ASIC capability の影響を受けます。

Policer

POLICER は単独で packet を分類しません。ACL rule、CoPP group、mirror session などから参照される rate limiting 部品です。METER_TYPEMODECIR / CBSPIR / PBS、色別 action を持ちます。

ACL で使う場合は rule の action として policer 名を参照します。CoPP では COPP_GROUP 内に queue、trap action、meter、rate を持つ形で control plane traffic に適用されます。

Mirror Session

MIRROR_SESSION は SPAN または ERSPAN のセッション定義です。SPAN はローカル dst_port へコピーし、ERSPAN は src_ipdst_ip、GRE type、DSCP、TTL などの outer header を持って collector へ送ります。

ACL と組み合わせる場合、先に mirror session を作り、ACL_RULE から MIRROR_ACTIONMIRROR_INGRESS_ACTIONMIRROR_EGRESS_ACTION で参照します。ポート単位で常時 mirror したい場合は MIRROR_SESSION.src_port / direction 側を読む方が近道です。

CoPP

CoPP は COPP_TRAP が trap ID 群を定義し、COPP_GROUP が CPU queue と policer を定義します。COPP_TRAP.trap_groupCOPP_GROUP を参照し、coppmgrAPPL_DBCOPP_TABLE に変換し、CoppOrchSAI hostif trap / trap group / policer に反映します。

YANG の正本は sonic-copp で、COPP_GROUPCOPP_TRAP の tree、leaf、leafref を確認できます。mirror session の YANG は sonic-mirror-session で、ERSPAN / SPAN の必須条件や POLICER への leafref を確認できます。

「上位 spine から特定 prefix (10.0.0.0/8) しか受け取らない」というケース。

CLI と JSON

# 1. ingress ACL table を作る
sudo config acl add table UPLINK_FILTER L3 -p PortChannel10,PortChannel20 -s ingress

rule JSON (/tmp/uplink_filter.json):

{
  "ACL_RULE": {
    "UPLINK_FILTER|ALLOW_10_8": {
      "PRIORITY": "9999",
      "SRC_IP": "10.0.0.0/8",
      "PACKET_ACTION": "FORWARD"
    },
    "UPLINK_FILTER|DENY_ANY": {
      "PRIORITY": "1",
      "SRC_IP": "0.0.0.0/0",
      "PACKET_ACTION": "DROP"
    }
  }
}

投入:

sudo acl-loader update incremental /tmp/uplink_filter.json

CONFIG_DB の表現:

{
  "ACL_TABLE": {
    "UPLINK_FILTER": {
      "type": "L3",
      "stage": "ingress",
      "ports@": "PortChannel10,PortChannel20",
      "policy_desc": "uplink prefix filter"
    }
  },
  "ACL_RULE": {
    "UPLINK_FILTER|ALLOW_10_8": {
      "PRIORITY": "9999",
      "SRC_IP": "10.0.0.0/8",
      "PACKET_ACTION": "FORWARD"
    },
    "UPLINK_FILTER|DENY_ANY": {
      "PRIORITY": "1",
      "SRC_IP": "0.0.0.0/0",
      "PACKET_ACTION": "DROP"
    }
  }
}

ports@ の末尾の @ は ConfigDB の list 型表記です。CLI 経由なら自動付与されます。

確認

show acl table UPLINK_FILTER
show acl rule UPLINK_FILTER

show acl table の典型出力:

Name            Type    Binding             Description           Stage
--------------  ------  ------------------  --------------------  -------
UPLINK_FILTER   L3      PortChannel10       uplink prefix filter  ingress
                        PortChannel20

show acl rule UPLINK_FILTER:

Table          Rule          Priority    Action    Match
-------------  ------------  ----------  --------  -------------------
UPLINK_FILTER  ALLOW_10_8    9999        FORWARD   SRC_IP: 10.0.0.0/8
UPLINK_FILTER  DENY_ANY      1           DROP      SRC_IP: 0.0.0.0/0

show acl rule の counter 列 (Packets/Bytes) は aclshow を使うと数値で見えます。

典型シナリオ 2: ERSPAN mirror session を ACL から起動する

特定 TCP flag が立った flow だけを collector に飛ばす。

{
  "MIRROR_SESSION": {
    "investig8": {
      "src_ip": "10.1.0.1",
      "dst_ip": "10.99.0.10",
      "gre_type": "0x88be",
      "dscp": "8",
      "ttl": "64",
      "queue": "0"
    }
  },
  "ACL_TABLE": {
    "MIRROR_ACL": {
      "type": "MIRROR",
      "stage": "ingress",
      "ports@": "Ethernet0"
    }
  },
  "ACL_RULE": {
    "MIRROR_ACL|TCP_SYN": {
      "PRIORITY": "9000",
      "IP_PROTOCOL": "6",
      "TCP_FLAGS": "0x02/0x02",
      "MIRROR_INGRESS_ACTION": "investig8"
    }
  }
}

確認:

show mirror_session
ERSPAN Sessions
Name        Status    SRC IP     DST IP       GRE     DSCP    TTL    Queue
----------  --------  ---------  -----------  ------  ------  -----  ------
investig8   active    10.1.0.1   10.99.0.10   0x88be  8       64     0

Status: error の場合は dst_ip への route 未到達か、underlay reachability の問題。

典型シナリオ 3: BGP control-plane traffic の CoPP rate を上げる

default の BGP CoPP rate を引き上げて、フラップ復旧時の neighbor 再収束を速くする。

{
  "COPP_GROUP": {
    "queue4_group2": {
      "queue": "4",
      "trap_action": "trap",
      "trap_priority": "4",
      "cbs": "6000",
      "cir": "6000"
    }
  },
  "COPP_TRAP": {
    "bgp": {
      "trap_ids": "bgp,bgpv6",
      "trap_group": "queue4_group2"
    }
  }
}

確認:

show copp -t bgp
show copp config

COPP_TRAP.trap_ids の値は coppmgr が認識する hostif trap 名のリストです (arp,bgp,bgpv6,dhcp,...)。誤った trap 名は無視されるため、docker logs swssUnknown trap id を確認できます。

sonic-cfggen で投入する場合

sonic-cfggen -a "$(cat copp_patch.json)" --write-to-db
config save -y

acl-loader 経由でない config_db.json 直接書き換えは reboot しないと swss が認識しません。runtime 反映には acl-loader update incremental を使う方が安全です。

よくある設定エラーと対処

sonic-utilities/acl_loader/main.pyAclLoaderException から抜粋:

エラーメッセージ 原因 対処
Table <name> does not exist rule の table 名が table 未作成 先に config acl add table
Session <name> does not exist mirror action から未存在 session を参照 先に MIRROR_SESSION を作成
Invalid input file <path> JSON の構文 / schema 不正 jq で構文を確認
Unknown rule action <action> in table <t>, rule <r> action 名 typo reference の action 一覧を確認
Rule action <action> is not supported in table <t>, rule <r> table type と action 不整合 (例: L3 table に mirror action) table type を MIRROR 系に変更
Mirroring session does not exist mirror action 参照先 不在 先に session 作成
Invalid mirror stage passed <stage> stage 値 typo ingress / egress のいずれか
IP_PROTOCOL=<n> is not TCP, but TCP flags were provided protocol 不一致 IP_PROTOCOL=6 か TCP_FLAGS 削除
IP_PROTOCOL=<n> is not ICMP, but ICMP fields were provided protocol 不一致 IP_PROTOCOL=1 か ICMP field 削除
IP_PROTOCOL=<n> is not ICMPV6, but ICMPV6 fields were provided protocol 不一致 IP_PROTOCOL=58 か ICMPV6 field 削除
VLAN ID <n> is out of bounds (0, 4096) match の VLAN_ID 範囲外 1〜4094 に修正
ICMP type/code <n> is out of bounds [0, 255] match の ICMP 値範囲外 0〜255 に修正
l2:ethertype must be provided for rule in table type L3V4V6 dual family table で ethertype 必須 ETHER_TYPE を追加
ethertype=<n> is neither ETHERTYPE_IPV4 nor ETHERTYPE_IPV6 for IP rule ethertype 値が IPv4/IPv6 外 0x0800 または 0x86dd を指定

action / match 制約は ASIC capability に依存する部分があるため、SAI レイヤで弾かれた場合は swss syslog に SAI_STATUS_NOT_SUPPORTED が出ます。

関連ページ