访问控制列表配置

Cumulus Linux 提供了几种工具来配置 ACL

  • NVUE 是 Cumulus Linux 特定的用户空间工具,您可以使用它来配置自定义 ACL。
  • iptablesip6tablesebtables 是 Linux 用户空间工具,您可以使用它们来管理 IPv4 数据包、IPv6 数据包和以太网帧(使用 MAC 地址的第 2 层)的过滤规则。
  • cl-acltool 是 Cumulus Linux 特定的用户空间工具,您可以使用它来管理过滤规则和配置默认 ACL。cl-acltool 对各种配置文件进行操作,并使用 iptablesip6tablesebtables 将规则安装到内核中。此外,cl-acltool 还在交换机端口接口的硬件中编程规则,而 iptablesip6tablesebtables 自身无法做到这一点。

流量规则

Cumulus Linux 中的 ACL 对进出和穿过交换机的数据包进行分类和控制,通过根据规则列表检查数据包和帧标头,在 OSI 模型的第 2、3 和 4 层断言策略。iptablesip6tablesebtables 用户空间应用程序提供您用来定义规则的语法。

规则在数据包通过系统的几个点()检查或操作数据包

  • PREROUTING 在交换机路由数据包之前接触数据包。
  • INPUT 在交换机确定数据包用于本地系统之后,但在控制平面软件接收它们之前接触数据包。
  • FORWARD 在中转流量通过交换机时接触它。
  • OUTPUT 在数据包离开交换机之前,从控制平面软件接触数据包。
  • POSTROUTING 在数据包离开交换机之前但在路由决策之后立即接触数据包。

当您构建规则以影响流量流动时, 可以访问各个链。Linux 默认提供三个表

  • Filter 对流量进行分类或过滤
  • NAT 应用网络地址转换规则
  • Mangle 在数据包通过交换机时更改数据包

每个表都有一组默认链,这些链在通过交换机的路径的不同点修改或检查数据包。链包含影响流量的各个规则。

规则

规则对您要控制的流量进行分类。您将规则应用于链,链附加到表。

规则有几个不同的组件

  • 表: 第一个参数是
  • 链: 第二个参数是。每个表支持几个不同的链。请参阅上面的
  • 匹配项: 第三个参数是匹配项。您可以在单个规则中指定多个匹配项。但是,规则中使用的匹配项越多,规则消耗的内存就越多。
  • 跳转: 跳转 指定规则的目标;如果数据包与规则匹配,则采取什么操作。如果在规则中省略此选项,则匹配规则对数据包没有影响,但规则上的计数器会递增。
  • 目标: 目标 是用户定义的链(规则所在的链除外)、决定数据包命运的特殊内置目标之一(如 DROP)或扩展目标。有关不同的目标示例,请参阅下面的支持的规则类型

规则如何解析和应用

交换机从 iptablesip6tablesebtables 读取每个链中的所有规则,并按顺序将它们输入到过滤器表或 mangle 表中。交换机按以下顺序从内核读取规则

  • IPv6 (ip6tables)
  • IPv4 (iptables)
  • ebtables

当您组合并将规则放入一个表中时,顺序决定了规则的相对优先级;iptablesip6tables 具有最高的优先级,而 ebtables 具有最低的优先级。

Linux 数据包转发构造是底层硅处理数据包方式的覆盖。请注意以下事项

  • switchd 写入 ASIC 时,交换机硅会重新排序规则,而传统的 iptables 按顺序执行规则列表。

  • 除 POLICE 和 SETCLASS 规则外,所有规则都是终止规则;在规则匹配后,操作发生,不再处理更多规则。

  • 在处理流量时,影响 FORWARD 链的规则(指定入口接口)在匹配出口接口的规则之前处理。作为一种解决方法,仅影响出口接口的规则可以具有入口接口通配符(仅限 swp+bond+),该通配符匹配您应用的任何接口,以便您可以与其他输入接口规则保持操作顺序。例如,对于以下规则

    -A FORWARD -i swp1 -j ACCEPT
    -A FORWARD -o swp1 -j ACCEPT   <-- This rule processes LAST (because of egress interface matching)
    -A FORWARD -i swp2 -j DROP
    

    如果您像这样修改规则,它们将按顺序处理

    -A FORWARD -i swp1 -j ACCEPT
    -A FORWARD -i swp+ -o $PORTA -j ACCEPT   <-- These rules are performed in order (because of wildcard match on the ingress interface)
    -A FORWARD -i swp2 -j DROP
    
  • 当使用对数据包执行 mangle 和过滤器查找的规则时,Cumulus Linux 并行处理它们并组合操作。

  • 如果没有入口接口或出口接口匹配,则 Cumulus Linux 默认在入口中安装 FORWARD 链规则。

  • 当使用 OUTPUT 链时,您必须将规则分配给源。例如,如果您在流量方向上将规则分配给交换机端口,但源是网桥 (VLAN),则该规则不会影响流量,您必须将其应用于网桥。

  • 如果您需要将规则应用于所有中转流量,请使用 FORWARD 链,而不是 OUTPUT 链。

  • 交换机根据 ebtable 规则是否使用 IPv4 或 IPv6 进行决策,将 ebtable 规则放入 IPv4 或 IPv6 内存空间中。交换机仅将匹配 MAC 地址的第 2 层规则放入 IPv4 内存空间中。

内存中的规则放置

INPUT 和入口 (FORWARD -i) 规则占用相同的内存空间。如果您设置 -i 选项,则规则计为入口。如果您同时设置输入和输出选项 (-i-o),则交换机将规则视为入口并占用该内存空间。例如

-A FORWARD -i swp1 -o swp2 -s 10.0.14.2 -d 10.0.15.8 -p tcp -j ACCEPT

如果您使用 INPUT 链设置输出标志,则会看到错误。例如

-A FORWARD,INPUT -i swp1 -o swp2 -s 10.0.14.2 -d 10.0.15.8 -p tcp -j ACCEPT
error: line 2 : output interface specified with INPUT chain error processing rule '-A FORWARD,INPUT -i swp1 -o swp2 -s 10.0.14.2 -d 10.0.15.8 -p tcp -j ACCEPT'

如果您删除 -o 选项和接口,则它是一个有效规则。

非原子更新模式和原子更新模式

Cumulus Linux 默认启用原子更新模式。但是,此模式限制了您可以配置的 ACL 规则的数量。

要增加可配置 ACL 规则的数量,请将交换机配置为在非原子模式下运行。

非原子模式不为原子更新保留 50% 的 TCAM 空间,而是运行增量更新,这些更新使用可用的可用空间来写入新的 TCAM 规则,然后切换到新规则。Cumulus Linux 删除旧规则并释放原始 TCAM 空间。如果可用空间不足以完成此任务,则运行常规非原子(非增量)更新,这将中断流量。

非原子更新提供更好的扩展性,因为所有 TCAM 资源都会积极影响流量。使用原子更新,一半的硬件资源处于待机状态,不会积极影响流量。

增量非原子更新 是基于表的,因此当您安装新规则时,它们不会中断网络流量。规则映射到以下表并按此顺序更新

  • mirror(仅入口)
  • ipv4-mac(可以是入口和出口)
  • ipv6(仅入口)

增量非原子更新操作遵循此顺序

  1. 更新是增量的,一次一个表,不会停止流量。
  2. Cumulus Linux 检查表中的规则是否与安装时间不同;如果表没有任何更改,则不会重新安装规则。
  3. 如果表中有更改,则新规则将填充到硬件中的新组或切片中,然后该表切换到新组或切片。
  4. 最后,该表的旧资源被释放。此过程为上面列出的每个表重复。
  5. 如果资源不足以同时容纳新规则集和旧规则集,则 Cumulus Linux 会尝试常规非原子模式,这将中断网络流量。
  6. 如果常规非原子更新失败,Cumulus Linux 会恢复为以前的规则。

要设置非原子模式

cumulus@switch:~$ nv set system acl mode non-atomic 
cumulus@switch:~$ nv config apply

  • 在 Spectrum-2 及更高版本上,在您运行并应用 nv set system acl mode 命令后,NVUE 会重新加载 switchd。重新加载 switchd 不会 中断网络服务。
  • 在 Spectrum 1 上,在您运行并应用 nv set system acl mode 命令后,NVUE 会重新启动 switchd。重新启动 switchd 会导致所有网络端口重置,以及重置交换机硬件配置。

  1. 编辑 /etc/cumulus/switchd.conf 文件以添加 acl.non_atomic_update_mode = TRUE

    cumulus@switch:~$ sudo nano /etc/cumulus/switchd.conf
    ...
    acl.non_atomic_update_mode = TRUE
    
  2. 在 Spectrum-2 及更高版本上,重新加载 switchd 以使更改生效。重新加载 switchd 不会 中断网络服务。

    cumulus@switch:~$ sudo systemctl reload switchd.service
    

    在 Spectrum 1 上,重新启动 switchd 以使更改生效。重新启动 switchd 会导致所有网络端口重置,以及重置交换机硬件配置。

    cumulus@switch:~$ sudo systemctl restart switchd.service
    

在常规非增量非原子更新期间,流量停止,然后在所有新配置都进入硬件后继续。

iptables、ip6tables 和 ebtables

不要直接使用 iptablesip6tablesebtables;安装的规则仅适用于 Linux 内核,Cumulus Linux 不会进行硬件加速。当您运行 cl-acltool -i 时,Cumulus Linux 会重置所有规则并删除 /etc/cumulus/acl/policy.conf 中不存在的任何内容。

例如,以下规则似乎有效

cumulus@switch:~$ sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

cl-acltool -L 命令显示该规则

cumulus@switch:~$ sudo cl-acltool -L ip
-------------------------------
Listing rules of type iptables:
-------------------------------

TABLE filter :
Chain INPUT (policy ACCEPT 72 packets, 5236 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP icmp -- any any anywhere anywhere icmp echo-request

但是,Cumulus Linux 不会将该规则同步到硬件。运行 cl-acltool -ireboot 会删除该规则,而不会替换它。为了确保 Cumulus Linux 硬件加速所有可以在硬件中的规则,请将它们添加到 /etc/cumulus/acl/policy.conf 并使用 cl-acltool -i 命令安装它们。

估计规则数量

要估计可以从 ACL 条目创建的规则数量,首先确定 ACL 条目是入口还是出口。然后,确定条目是 IPv4-mac 还是 IPv6 类型规则。这决定了规则所属的切片。使用以下方法确定交换机为每种类型使用的条目数。

默认情况下,每个条目占用一个双宽条目,除非该条目是以下情况之一

  • 具有多个逗号分隔的输入接口的条目拆分为每个输入接口一个规则。例如,此条目拆分为两个规则

    -A FORWARD -i swp1s0,swp1s1 -p icmp -j ACCEPT
    
  • 具有多个逗号分隔的输出接口的条目拆分为每个输出接口一个规则。此条目拆分为两个规则

    -A FORWARD -i swp+ -o swp1s0,swp1s1 -p icmp -j ACCEPT
    
  • 具有输入和输出逗号分隔接口的条目拆分为输入和输出接口的每种组合一个规则。此条目拆分为四个规则

    -A FORWARD -i swp1s0,swp1s1 -o swp1s2,swp1s3 -p icmp -j ACCEPT
    
  • 具有多个第 4 层端口范围的条目拆分为每个范围一个规则。例如,此条目拆分为两个规则

    -A FORWARD -i swp+ -p tcp -m multiport --dports 1050:1051,1055:1056 -j ACCEPT
    

    您只能将端口范围用于入口规则。

在第 2 层接口上匹配 VLAN ID

您可以在第 2 层接口上匹配 VLAN ID 以用于入口规则。以下示例匹配 VLAN 和 DSCP 类,并设置数据包的内部类。为了扩展匹配 IP 字段,请将此规则与入口 iptable 规则结合使用。

[ebtables]
-A FORWARD -p 802_1Q --vlan-id 100 -j mark --mark-set 102

[iptables]
-A FORWARD -i swp31 -m mark --mark 102 -m dscp --dscp-class CS1 -j SETCLASS --class 2

  • Cumulus Linux 保留 0 到 100 之间的 mark 值;例如,如果您使用 --mark-set 10,您会看到错误。使用 101 到 4196 之间的标记值。
  • 您不能使用相同的值标记多个 VLAN。
  • 如果您启用 EVPN-MH 并在 ebtables 中使用 mark 目标配置 VLAN 匹配规则,则 ebtables 规则可能会覆盖您为入口上的 EVPN-MH 配置的流量类规则设置的 mark。匹配入口流量类 mark 的出口 EVPN MH 流量类规则可能不会被命中。为了解决此问题,请添加 ebtable 规则以 ACCEPT 已由入口上的 EVPN-MH 流量类规则标记的数据包。

使用 NVUE 安装和管理 ACL 规则

您可以使用 NVUE 命令,而不是手动制作规则,然后使用 cl-acltool 安装它。Cumulus Linux 将命令转换为 /etc/cumulus/acl/policy.d/50_nvue.rules 文件。您使用 NVUE 创建的规则独立于默认文件 /etc/cumulus/acl/policy.d/00control_plane.rules99control_plane_catch_all.rules

Cumulus Linux 5.0 及更高版本使用 -t mangle -A PREROUTING 链作为入口规则,使用 -t mangle -A POSTROUTING 链作为出口规则,而不是以前版本中使用的 - A FORWARD 链。

考虑以下 iptables 规则

-t mangle -A PREROUTING -i swp1 -s 10.0.14.2/32 -d 10.0.15.8/32 -p tcp -j ACCEPT

要使用 NVUE 创建此规则,请按照以下步骤操作。NVUE 会自动添加规则中的所有选项。

  1. 设置规则类型、匹配协议、源 IP 地址和端口、目标 IP 地址和端口以及操作。您必须为规则提供名称(以下命令中的 EXAMPLE1)

    cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
    cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip protocol tcp
    cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip source-ip 10.0.14.2/32
    cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip tcp source-port ANY
    cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip dest-ip 10.0.15.8/32
    cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip tcp dest-port ANY
    cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 action permit
    

    对于控制平面上的防火墙 IPv4 类型 ACL,您可以匹配 hashlimit 模块 (hashimit)、连接状态 (connection-state) 和 recent 模块 (recent-list)。请参阅防火墙规则

  2. 使用 nv set interface <interface> acl 命令将规则应用于入站或出站接口。

    • 对于影响 -t mangle -A PREROUTING 链(以前版本中的 -A FORWARD)的规则,将规则应用于入站或出站接口:例如
    cumulus@switch:~$ nv set interface swp1 acl EXAMPLE1 inbound
    cumulus@switch:~$ nv config apply
    
    • 对于影响 INPUT 或 OUPUT 链(-A INPUT 或 -A OUTPUT)的规则,将规则应用于控制平面接口。例如
    cumulus@switch:~$ nv set interface swp1 acl EXAMPLE1 inbound control-plane
    cumulus@switch:~$ nv config apply
    

要查看已安装的规则,请检查 /etc/cumulus/acl/policy.d/50_nvue.rules 文件或运行 NVUE nv show acl <rule-name> rule <ID> 命令

cumulus@switch:~$ sudo cat /etc/cumulus/acl/policy.d/50_nvue.rules
[iptables]

## ACL EXAMPLE1 in dir inbound on interface swp1 ##
-t mangle -A PREROUTING -i swp1 -s 10.0.14.2/32 -d 10.0.15.8/32 -p tcp -j ACCEPT
...
cumulus@switch:~$ nv show acl EXAMPLE1 rule 10 
                     operational   applied     
-------------------  ------------  ------------
match                                          
  ip                                           
    source-ip        10.0.14.2/32  10.0.14.2/32
    dest-ip          10.0.15.8/32  10.0.15.8/32
    protocol         tcp           tcp         
    tcp                                        
      [source-port]  ANY           ANY         
      [dest-port]    ANY           ANY

要删除此规则,请运行 nv unset acl <acl-name>nv unset interface <interface> acl <acl-name> 命令。这些命令从 /etc/cumulus/acl/policy.d/50_nvue.rules 文件中删除规则。

cumulus@switch:~$ nv unset acl EXAMPLE1
cumulus@switch:~$ nv unset interface swp1 acl EXAMPLE1
cumulus@switch:~$ nv config apply

要查看每个接口的 ACL 统计信息,例如与 ACL 规则匹配的字节总数,请运行 nv show interface <interface-id> acl <acl-id> statisticsnv show interface <interface-id> acl <acl-id> statistics <rule-id> 命令。

要查看所有 NVUE ACL 命令的列表,请运行 nv list-commands acl 命令。

使用 cl-acltool 安装和管理 ACL 规则

您可以使用 cl-acltool 管理 Cumulus Linux ACL。规则首先写入 iptables 链(如上所述),然后通过 switchd 同步到硬件。

要检查链的当前状态并列出所有已安装的规则,请运行

cumulus@switch:~$ sudo cl-acltool -L all
 -------------------------------
Listing rules of type iptables:
-------------------------------
TABLE filter :
Chain INPUT (policy ACCEPT 432K packets, 31M bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  swp+   any     240.0.0.0/5          anywhere            
    0     0 DROP       all  --  swp+   any     127.0.0.0/8          anywhere            
    0     0 DROP       all  --  swp+   any     base-address.mcast.net/4  anywhere            
    0     0 DROP       all  --  swp+   any     255.255.255.255      anywhere            
    0     0 ACCEPT     all  --  swp+   any     anywhere             anywhere            

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 457K packets, 35M bytes)
 pkts bytes target     prot opt in     out     source               destination
...

要使用原生 iptablesip6tablesebtables 列出已安装的规则,请将 -L 选项与相应的命令一起使用

cumulus@switch:~$ sudo iptables -L
cumulus@switch:~$ sudo ip6tables -L
cumulus@switch:~$ sudo ebtables -L

要删除所有已安装的规则,请运行

cumulus@switch:~$ sudo cl-acltool -F all

要仅删除 IPv4 iptables 规则,请运行

cumulus@switch:~$ sudo cl-acltool -F ip

如果安装失败,内核和硬件中的 ACL 规则将回滚到以前的状态。您还会看到来自内核或 ASIC 中编程规则的错误。

安装数据包过滤 (ACL) 规则

cl-acltool 采用文件中的访问控制列表 (ACL) 规则输入。每个 ACL 策略文件都包含 [iptables][ip6tables][ebtables] 标记下的 iptablesip6tablesebtables 类别。您必须将 ACL 策略中的每个规则分配给其中一个规则类别。

有关 ACL 规则的详细信息,请参阅 man cl-acltool(5)。有关 iptables 规则语法,请参阅 man iptables(8)。有关 ip6tables 规则语法,请参阅 man ip6tables(8)。有关 ebtables 规则语法,请参阅 man ebtables(8)

有关使用 cl-acltool 的更多详细信息,请参阅 man cl-acltool(5)man cl-acltool(8)

默认情况下

  • ACL 策略文件位于 /etc/cumulus/acl/policy.d/ 中。
  • /etc/cumulus/acl/policy.d/ 目录中的所有 *.rules 文件也位于 /etc/cumulus/acl/policy.conf 中。
  • policy.conf 文件中的所有文件在交换机启动时安装。
  • policy.conf 文件期望规则文件具有 .rules 后缀作为文件名的一部分。

以下显示了一个示例 ACL 策略文件

[iptables]
-A INPUT -i swp1 -p tcp --dport 80 -j ACCEPT
-A FORWARD -i swp1 -p tcp --dport 80 -j ACCEPT

[ip6tables]
-A INPUT -i swp1 -p tcp --dport 80 -j ACCEPT
-A FORWARD -i swp1 -p tcp --dport 80 -j ACCEPT

[ebtables]
-A INPUT -p IPv4 -j ACCEPT
-A FORWARD -p IPv4 -j ACCEPT

您可以使用通配符或变量来指定链和接口列表。

  • 您只能使用 swp+bond+ 作为通配符名称。
  • swp+ 规则作为聚合应用,而不是 按端口应用。如果您要应用按端口策略,请指定特定端口而不是通配符。

INGRESS = swp+
INPUT_PORT_CHAIN = INPUT,FORWARD

[iptables]
-A $INPUT_PORT_CHAIN -i $INGRESS -p tcp --dport 80 -j ACCEPT

[ip6tables]
-A $INPUT_PORT_CHAIN -i $INGRESS -p tcp --dport 80 -j ACCEPT

[ebtables]
-A INPUT -p IPv4 -j ACCEPT

您可以将系统的 ACL 规则写入默认 /etc/cumulus/acl/policy.d/ 目录下的多个文件中。安装期间规则的排序遵循文件名的排序顺序。

使用多个文件来堆叠规则。下面的示例显示了两个规则文件,它们分隔了管理和数据路径流量的规则

cumulus@switch:~$ ls /etc/cumulus/acl/policy.d/
00sample_mgmt.rules 01sample_datapath.rules
cumulus@switch:~$ cat /etc/cumulus/acl/policy.d/00sample_mgmt.rules

INGRESS_INTF = swp+
INGRESS_CHAIN = INPUT

[iptables]
# protect the switch management
-A $INGRESS_CHAIN -i $INGRESS_INTF -s 10.0.14.2 -d 10.0.15.8 -p tcp -j ACCEPT
-A $INGRESS_CHAIN -i $INGRESS_INTF -s 10.0.11.2 -d 10.0.12.8 -p tcp -j ACCEPT
-A $INGRESS_CHAIN -i $INGRESS_INTF -d 10.0.16.8 -p udp -j DROP

cumulus@switch:~$ cat /etc/cumulus/acl/policy.d/01sample_datapath.rules
INGRESS_INTF = swp+
INGRESS_CHAIN = INPUT, FORWARD

[iptables]
-A $INGRESS_CHAIN -i $INGRESS_INTF -s 192.0.2.5 -p icmp -j ACCEPT
-A $INGRESS_CHAIN -i $INGRESS_INTF -s 192.0.2.6 -d 192.0.2.4 -j DROP
-A $INGRESS_CHAIN -i $INGRESS_INTF -s 192.0.2.2 -d 192.0.2.8 -j DROP

安装目录下的所有 ACL 策略

cumulus@switch:~$ sudo cl-acltool -i -P ./rules
Reading files under rules
Reading rule file ./rules/01_http_rules.txt ...
Processing rules in file ./rules/01_http_rules.txt ...
Installing acl policy ...
Done.

应用 /etc/cumulus/acl/policy.conf 中包含的所有规则和策略

cumulus@switch:~$ sudo cl-acltool -i

指定要安装的策略文件

默认情况下,Cumulus Linux 安装您在 /etc/cumulus/acl/policy.d/ 中配置的任何 .rules 文件。要将其他策略文件添加到 ACL,您需要将它们包含在 /etc/cumulus/acl/policy.conf 中。例如,为了使 Cumulus Linux 安装名为 01_new.datapathacl 的策略文件中的规则,请将 include /etc/cumulus/acl/policy.d/01_new.rules 添加到 policy.conf

cumulus@switch:~$ sudo nano /etc/cumulus/acl/policy.conf

#
# This file is a master file for acl policy file inclusion
#
# Note: This is not a file where you list acl rules.
#
# This file can contain:
# - include lines with acl policy files
#   example:
#     include <filepath>
#
# see manpage cl-acltool(5) and cl-acltool(8) for how to write policy files 
#

include /etc/cumulus/acl/policy.d/01_new.datapathacl

ACL 规则的硬件限制

交换机硬件可以存储的最大规则数取决于

  • IPv4 和 IPv6 规则的组合;Cumulus Linux 不支持同时支持 IPv4 和 IPv6 的最大规则数。
  • Cumulus Linux 提供的默认规则的数量。
  • 规则是在入口还是出口上应用。
  • 规则是在原子或非原子模式下;当您启用非原子更新时,Cumulus Linux 使用非原子模式规则。
  • 共享同一表空间的其他资源,例如组播路由条目和内部 VLAN 计数器。

如果您超出最大规则数或用完 ACL 表的相关内存资源,cl-acltool -i 会生成以下错误之一

error: hw sync failed (sync_acl hardware installation failed) Rolling back .. failed.
error: hw sync failed (Bulk counter init failed with No More Resources). Rolling back ..

要解决此问题并使用高 VLAN 和 ACL 规模管理资源,请参阅ACL 规则安装失败故障排除

NVIDIA Spectrum 交换机使用 TCAMATCAM 来快速查找各种表,其中包括 ACL、组播路由和某些内部 VLAN 计数器。根据网络 ACL、组播路由和 VLAN 计数器的大小,您可能需要调整一些参数,以使您的网络要求适应这些表。

Spectrum 1 上的 TCAM 配置文件

NVIDIA Spectrum 1 ASIC(型号 2xx0)具有一个通用的 TCAM 空间,用于入口和出口 ACL,交换机也将其用于组播路由条目。

Cumulus Linux 通过不同的 TCAM 配置文件以及 ACL 原子和非原子更新设置来控制 NVIDIA Spectrum 1 交换机上的 ACL 和组播路由条目规模。

配置文件原子模式 IPv4 规则原子模式 IPv6 规则非原子模式 IPv4 规则非原子模式 IPv6 规则组播路由条目
默认50025010005001000
ipmc-heavy750500150010008500
acl-heavy1750100035002000450
ipmc-max10005002000100013000
ip-acl-heavy600001200000

  • 即使上表指定 ip-acl-heavy 配置文件不支持 IPv6 规则,Cumulus Linux 也不会阻止您配置 IPv6 规则。但是,不能保证 IPv6 规则在 ip-acl-heavy 配置文件下工作。
  • ip-acl-heavy 配置文件显示了更新的受支持原子模式和非原子模式 IPv4 规则数量。先前发布的数字是原子模式为 7500 个,非原子模式为 15000 个 IPv4 规则。

要配置要使用的配置文件,请在 /etc/mlx/datapath/tcam_profile.conf 文件中设置 tcam_resource.profile 参数,然后重新启动 switchd

cumulus@switch:~$ sudo nano /etc/mlx/datapath/tcam_profile.conf
...
tcam_resource.profile = ipmc-max
cumulus@switch:~$ sudo systemctl restart switchd.service

控制 ACL 和组播路由规模的 Spectrum 1 TCAM 资源配置文件与控制 MAC 表、IPv4 和 IPv6 条目规模的转发资源配置文件不同。

Spectrum-2 及更高版本上的 ATCAM

使用 Spectrum-2 及更高版本的交换机采用更新的 KVD 方案和 ATCAM 设计,这种设计更加灵活,并允许比 Spectrum 1 更高的 ACL 规模。Spectrum-2 及更高版本上没有 TCAM 资源配置文件。

下表显示了经过测试的 ACL 规则限制。由于 KVD 和 ATCAM 与转发表项、组播路由表项和 VLAN 流计数器共享空间,因此这些 ACL 限制可能会因您对其他表的使用而有所不同。

当使用任何 Spectrum-2 及更高版本的转发配置文件时,这些限制均有效,但 l2-heavy-3v6-lpm-heavy1 配置文件除外,这些配置文件会显著降低 ACL 规模。

对于 Spectrum-2 及更高版本,所有配置文件都支持相同数量的规则。

原子模式 IPv4 规则原子模式 IPv6 规则非原子模式 IPv4 规则非原子模式 IPv6 规则
1250062502500012500

有关非原子模式和原子模式的信息,请参阅 非原子更新模式和原子更新模式

ATCAM 资源耗尽

如果您在尝试应用 ACL 时看到类似于 No More Resources .. Rolling back 的错误消息,请参阅 ACL 规则安装失败故障排除,以获取有关故障排除和管理资源的信息。

支持的规则类型

iptables/ip6tables/ebtables 构造尝试将 Linux 实现分层在底层硬件之上,但它们并非始终直接兼容。以下显示了 iptablesip6tablesebtables 中链的受支持规则。

要了解有关下表中显示的任何选项的更多信息,请运行 iptables -h [选项名称]。相同的帮助语法适用于 ip6tablesebtables 的选项。

root@leaf1# ebtables -h tricolorpolice
...
tricolorpolice option:
--set-color-mode STRING setting the mode in blind or aware
--set-cir INT setting committed information rate in kbits per second
--set-cbs INT setting committed burst size in kbyte
--set-pir INT setting peak information rate in kbits per second
--set-ebs INT setting excess burst size in kbyte
--set-conform-action-dscp INT setting dscp value if the action is accept for conforming packets
--set-exceed-action-dscp INT setting dscp value if the action is accept for exceeding packets
--set-violate-action STRING setting the action (accept/drop) for violating packets
--set-violate-action-dscp INT setting dscp value if the action is accept for violating packets
Supported chains for the filter table:
INPUT FORWARD OUTPUT

iptables 和 ip6tables 规则支持

规则元素支持不支持
匹配项源/目标,IP 协议
入/出接口
IPv4:ecn、icmp、frag、ttl、
IPv6:icmp6、hl、
IP 通用:tcp (带标志)、udp、多端口、DSCP、addrtype
带有输入/输出以太网接口的规则不适用
反向匹配项
标准目标ACCEPT、DROPRETURN、QUEUE、STOP、Fall Thru、Jump
扩展目标LOG (IPv4/IPv6);LOG 不支持 UID
TCP SEQ、TCP 选项或 IP 选项
ULOG
SETQOS
DSCP
Cumulus Linux 独有
SPAN
ERSPAN (IPv4/IPv6)
POLICE
TRICOLORPOLICE
SETCLASS

ebtables 规则支持

规则元素支持不支持
匹配项以太网类型
输入接口/通配符
输出接口/通配符
源/目标 MAC
IP:src、dest、tos、proto、sport、dport
IPv6:tclass、icmp6:type、icmp6:代码范围、源/目标地址、sport、dport
802.1p (CoS)
VLAN
反向匹配项
协议长度
标准目标ACCEPT、DROPRETURN、CONTINUE、Jump、Fall Thru
扩展目标ULOG
LOG
Cumulus Linux 独有
SPAN
ERSPAN
POLICE
TRICOLORPOLICE
SETCLASS

其他不支持的规则

  • 当前忽略链中没有匹配项且接受所有数据包的规则。
  • 链默认规则(即 ACCEPT)也被忽略。

注意事项

跨入口 TCAM 和出口 TCAM 拆分规则会导致规则的入口 IPv6 部分匹配发送到所有目标的数据包,这可能会干扰序列中常规的预期线性规则匹配。例如

较高的规则可能会阻止较低的规则匹配

规则 1:-A FORWARD -o vlan100 -p icmp6 -j ACCEPT

规则 2:-A FORWARD -o vlan101 -p icmp6 -s 01::02 -j ACCEPT

规则 1 匹配来自入口 TCAM 中所有输出接口的所有 icmp6 数据包。

这会阻止规则 2 匹配,规则 2 更具体,但具有不同的输出接口。即使输出接口不同,也要确保将更具体的匹配项放在更通用的匹配项之上。

当您有两个具有相同输出接口的规则时,较低的规则可能会根据先前规则的存在情况进行匹配。

规则 1:-A FORWARD -o vlan100 -p icmp6 -j ACCEPT

规则 2:-A FORWARD -o vlan101 -s 00::01 -j DROP

规则 3:-A FORWARD -o vlan101 -p icmp6 -j ACCEPT

对于 sip 为 00:01 且传出 vlan101 的 icmp6 数据包,规则 3 仍然匹配。规则 1 会干扰规则 2 和/或规则 3 的正常功能。

当您有两个具有相同匹配项和不同输出接口的相邻规则时,例如

规则 1:-A FORWARD -o vlan100 -p icmp6 -j ACCEPT

规则 2:-A FORWARD -o vlan101 -p icmp6 -j DROP

规则 2 永远不会在入口处匹配。这两个规则共享相同的标记。

常见示例

数据平面策略器

您可以为数据平面上的流量配置服务质量。通过使用 QoS 策略器,您可以限制流量速率,以便传入数据包在超过指定阈值时被丢弃。

iptables 中 POLICE ACL 规则上的计数器不显示由于这些规则而丢弃的数据包。

以下示例将 swp1 上的传入流量速率限制为每秒 400 个数据包,突发速率为每秒 200 个数据包

cumulus@switch:~$ nv set acl example1 type ipv4
cumulus@switch:~$ nv set acl example1 rule 10 action police
cumulus@switch:~$ nv set acl example1 rule 10 action police mode packet
cumulus@switch:~$ nv set acl example1 rule 10 action police burst 200
cumulus@switch:~$ nv set acl example1 rule 10 action police rate 400
cumulus@switch:~$ nv set interface swp1 acl example1 inbound
cumulus@switch:~$ nv config apply

POLICE 目标与 iptables 结合使用。POLICE 接受以下参数

  • --set-rate value 指定最大速率,单位为千字节 (KB) 或数据包。
  • --set-burst value 指定允许连续到达的数据包或千字节 (KB) 数量。
  • --set-mode string 为速率和突发大小设置模式,单位为KB(千字节)或 pkt(数据包)。

例如,要将 swp1 上的传入流量速率限制为每秒 400 个数据包,突发速率为每秒 200 个数据包,并在您相应的 .rules 文件中设置此规则

-t mangle -A PREROUTING -i swp1  -j POLICE --set-mode pkt --set-rate 400 --set-burst 200

控制平面策略器

您可以为控制平面上的流量配置服务质量,并限制流量速率,以便传入数据包在超过某些阈值时被丢弃,方法如下

  • 运行 NVUE 命令。
  • 编辑 /etc/cumulus/control-plane/policers.conf 文件。

Cumulus Linux 5.0 及更高版本不再使用 INPUT 链规则来配置控制平面策略器。

要配置控制平面策略器

  • 使用 nv set system control-plane policer <trap-group> burst <value> 命令设置陷阱组的突发速率。突发速率是允许连续到达的数据包或千字节 (KB) 数量。
  • 使用 nv set system control-plane policer <trap-group> rate <value> 命令设置陷阱组的转发速率。转发速率是最大速率,单位为千字节 (KB) 或数据包。

陷阱组可以是:arpbfdpim-ospf-ripbgpclagicmp-defdhcp-ptpigmpsshicmp6-neighicmp6-def-mldlacplldprpvsteapolip2meacl-lognatstpl3-localspan-cpucatch-allNONE

以下示例将 PIM 陷阱组转发速率和突发速率更改为每秒 400 个数据包,并将 IGMP 陷阱组转发速率更改为每秒 400 个数据包,突发速率更改为每秒 200 个数据包

cumulus@switch:~$ nv set system control-plane policer pim-ospf-rip rate 400
cumulus@switch:~$ nv set system control-plane policer pim-ospf-rip burst 400
cumulus@switch:~$ nv set system control-plane policer pim-ospf-rip state on
cumulus@switch:~$ nv set system control-plane policer igmp rate 400
cumulus@switch:~$ nv set system control-plane policer igmp burst 200
cumulus@switch:~$ nv config apply

要使用 /etc/cumulus/control-plane/policers.conf 文件限制流量速率,您需要

  • 为陷阱组启用单个策略器(将 enable 设置为 TRUE)。
  • 以每秒数据包数设置策略器速率。转发速率是最大速率,单位为千字节 (KB) 或数据包。
  • 以每秒数据包数设置策略器突发速率。突发速率是允许连续到达的数据包或千字节 (KB) 数量。

编辑 /etc/cumulus/control-plane/policers.conf 文件后,您必须使用 /usr/lib/cumulus/switchdctl --load /etc/cumulus/control-plane/policers.conf 命令重新加载该文件。

当陷阱组的 enable 为 FALSE 时,陷阱组和 catch-all 陷阱组共享一个策略器。当 enable 为 TRUE 时,Cumulus Linux 会为陷阱组创建单个策略器。

以下示例将 PIM 陷阱组转发速率和突发速率更改为每秒 400 个数据包,并将 IGMP 陷阱组转发速率更改为每秒 400 个数据包,突发速率更改为每秒 200 个数据包

cumulus@switch:~$ sudo nano /etc/cumulus/control-plane/policers.conf
...
copp.pim_ospf_rip.enable = TRUE
copp.pim_ospf_rip.rate = 400
copp.pim_ospf_rip.burst = 400
...
copp.igmp.enable = TRUE
copp.igmp.rate = 400
copp.igmp.burst = 200
...
cumulus@switch:~$ /usr/lib/cumulus/switchdctl --load /etc/cumulus/control-plane/policers.conf

要显示控制平面策略配置和统计信息,请运行 NVUE nv show system control-plane policer --view=brief 命令。

Cumulus Linux 提供默认的控制平面策略器值。您可以根据需要调整这些值,以适应特定协议的更高规模要求。

策略器默认值

控制平面 ACL

您可以配置控制平面 ACL,以便为转发到 CPU 的所有数据包应用单个规则,而无需考虑交换机上的源接口或目标接口。与陷阱相比,控制平面 ACL 允许您以更精细的方式 регулировать 转发到交换机上应用程序的流量,并配置 ACL 以阻止来自特定地址或子网的 SSH。

Cumulus Linux 在 INPUT 链中应用入站控制平面 ACL,在 OUTPUT 链中应用出站控制平面 ACL。

Cumulus Linux 不支持 deny all 控制平面规则。这种类型的规则会阻止进程间通信,并影响整体系统功能。

以下示例命令应用名为 ACL1 的输入控制平面 ACL。

cumulus@switch:~$ nv set system control-plane acl ACL1 inbound
cumulus@switch:~$ nv config apply

以下示例命令应用名为 ACL2 的输出控制平面 ACL。

cumulus@switch:~$ nv set system control-plane acl ACL2 outbound
cumulus@switch:~$ nv config apply

要显示所有控制平面 ACL 的统计信息,请运行 nv show system control-plane acl 命令

cumulus@switch:~$ nv show system control-plane acl
ACL Name   Rule ID  In Packets  In Bytes  Out Packets  Out Bytes
---------  -------  ----------  --------  -----------  ---------
acl1       1        0           0         0            0
           65535    0           0         0            0
acl2       1        0           0         0            0
           65535    0           0         0            0 

要显示特定控制平面 ACL 的统计信息,请运行 nv show system control-plane acl <acl_name> statistics 命令

cumulus@switch:~$ nv show system control-plane acl ACL1 statistics
Rule  In Packet  In Byte  Out Packet  Out Byte  Summary 

----  ---------  -------  ----------  --------  --------------------------- 

1     0          0 Bytes  0           0 Bytes   match.ip.dest-ip:   9.1.2.3 

2     0          0 Bytes  0           0 Bytes   match.ip.source-ip: 7.8.2.3 

在传输流量上设置 DSCP

以下示例使用 mangle 表在数据包通过交换机时修改数据包。DSCP 在以下示例中以 十进制表示法 表示。

[iptables]

#Set SSH as high priority traffic.
-t mangle -A PREROUTING -i swp+ -p tcp -m multiport --dports 22 -j SETQOS --set-dscp 46

#Set everything coming in swp1 as AF13
-t mangle -A PREROUTING -i swp1  -j SETQOS --set-dscp 14

#Set Packets destined for 10.0.100.27 as best effort
-t mangle -A PREROUTING -i swp+ -d 10.0.100.27/32 -j SETQOS --set-dscp 0

#Example using a range of ports for TCP traffic
-t mangle -A PREROUTING -i swp+ -s 10.0.0.17/32 -d 10.0.100.27/32 -p tcp -m multiport --sports 10000:20000 -m multiport --dports 10000:20000 -j SETQOS --set-dscp 34

应用规则

cumulus@switch:~$ sudo cl-acltool -i

将 SSH 设置为高优先级流量

cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip protocol tcp
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip tcp dest-port 22
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 action set dscp 46
cumulus@switch:~$ nv set interface swp1-48 acl EXAMPLE1 inbound
cumulus@switch:~$ nv config apply

将 swp1 上传入的所有内容设置为 AF13

cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 action set dscp 14
cumulus@switch:~$ nv set interface swp1 acl EXAMPLE1 inbound
cumulus@switch:~$ nv config apply

将目标为 10.0.100.27 的数据包设置为尽力而为

cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip dest-ip 10.0.100.27/32
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 action set dscp 0
cumulus@switch:~$ nv set interface swp1-48 acl EXAMPLE1 inbound
cumulus@switch:~$ nv config apply

为 TCP 流量使用端口范围

cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip protocol tcp
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip source-ip 10.0.0.17/32
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip tcp source-port 10000:20000
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip dest-ip 10.0.100.27/32
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip tcp dest-port 10000:20000
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 action set dscp 34
cumulus@switch:~$ nv set interface swp1-48 acl EXAMPLE1 inbound
cumulus@switch:~$ nv config apply

要在 NVUE 中指定交换机上的所有端口(iptables 规则中的 swp+),您必须在交换机上设置接口范围,如以上示例所示 (nv set interface swp1-48)。此命令在 /etc/cumulus/acl/policy.d/50_nvue.rules 文件中创建的规则数量与您指定的范围内的接口数量相同。

过滤特定 TCP 标志

当您设置 SYN 位并重置 RST、ACK 和 FIN 位时,以下示例规则会丢弃入口 IPv4 TCP 数据包。该规则在接口 swp1 上入站应用。配置此规则后,您无法建立从入口端口 swp1 发起的新 TCP 会话。您可以建立从任何其他端口发起的 TCP 会话。

-t mangle -A PREROUTING -i swp1 -p tcp --tcp-flags  ACK,SYN,FIN,RST SYN -j DROP

应用规则

cumulus@switch:~$ sudo cl-acltool -i
cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 20 match ip protocol tcp
cumulus@switch:~$ nv set acl EXAMPLE1 rule 20 match ip tcp flags syn
cumulus@switch:~$ nv set acl EXAMPLE1 rule 20 match ip tcp mask rst
cumulus@switch:~$ nv set acl EXAMPLE1 rule 20 match ip tcp mask syn
cumulus@switch:~$ nv set acl EXAMPLE1 rule 20 match ip tcp mask fin
cumulus@switch:~$ nv set acl EXAMPLE1 rule 20 match ip tcp mask ack
cumulus@switch:~$ nv set acl EXAMPLE1 rule 20 action deny 
cumulus@switch:~$ nv set interface swp1 acl EXAMPLE1 inbound
cumulus@switch:~$ nv config apply

控制谁可以 SSH 进入交换机

运行以下命令来控制谁可以 SSH 进入交换机。在以下示例中,10.10.10.1/32 是交换机的接口 IP 地址(或环回 IP 地址),10.255.4.0/24 可以 SSH 进入交换机。

-A INPUT -i swp+ -s 10.255.4.0/24 -d 10.10.10.1/32 -j ACCEPT
-A INPUT -i swp+ -d 10.10.10.1/32 -j DROP

应用规则

cumulus@switch:~$ sudo cl-acltool -i
cumulus@switch:~$ nv set acl example2 type ipv4
cumulus@switch:~$ nv set acl example2 rule 10 match ip source-ip 10.255.4.0/24 
cumulus@switch:~$ nv set acl example2 rule 10 match ip dest-ip 10.10.10.1/32
cumulus@switch:~$ nv set acl example2 rule 10 action permit
cumulus@switch:~$ nv set acl example2 rule 20 match ip source-ip ANY 
cumulus@switch:~$ nv set acl example2 rule 20 match ip dest-ip 10.10.10.1/32
cumulus@switch:~$ nv set acl example2 rule 20 action deny
cumulus@switch:~$ nv set system control-plane acl example2 inbound
cumulus@switch:~$ nv config apply

阻止流向 eth0 接口的流量

要阻止流向 eth0 接口的流量,请在系统控制平面上而不是在 eth0 接口上应用 ACL。以下示例创建了一个名为 DENY-IN 的 ACL,该 ACL 阻止来自入口 eth0 且源 IP 地址为 192.168.200.10 的流量

cumulus@switch:~$ nv set acl DENY-IN rule 10 action deny
cumulus@switch:~$ nv set acl DENY-IN rule 10 match ip source-ip 192.168.200.10
cumulus@switch:~$ nv set acl DENY-IN type ipv4
cumulus@switch:~$ nv set system control-plane acl DENY-IN inbound
cumulus@switch:~$ nv config apply

匹配 TCP IP 标头中的 ECN 位

ECN 允许端到端网络拥塞通知,而无需丢弃数据包。您可以添加 ECN 规则以匹配 TCP IPv4 标头中的 ECECWRECT 标志。

默认情况下,ECN 规则匹配设置了位的数据包。您可以使用感叹号 (!) 反转匹配。

匹配 ECE 位

在端点收到路由器设置了 CE 位的数据包后,它会在返回的 ACK 数据包中设置 ECE 位,以通知另一个端点需要减速。

要匹配 ECE 位

/etc/cumulus/acl/policy.d 目录中创建一个规则文件,并在 [iptables] 下添加以下规则

cumulus@switch:~$ sudo nano /etc/cumulus/acl/policy.d/30-tcp-flags.rules
[iptables]
-t mangle -A PREROUTING -i swp1 -p tcp -m ecn  --ecn-tcp-ece  -j ACCEPT

应用规则

cumulus@switch:~$ sudo cl-acltool -i
cumulus@switch:~$ nv set acl example2 type ipv4
cumulus@switch:~$ nv set acl example2 rule 10 match ip protocol tcp
cumulus@switch:~$ nv set acl example2 rule 10 match ip ecn flags tcp-ece
cumulus@switch:~$ nv set acl example2 rule 10 action permit
cumulus@switch:~$ nv set interface swp1 acl example2 inbound
cumulus@switch:~$ nv config apply

匹配 CWR 位

CWR 位通知连接的另一个端点,它已收到 ECE 并做出反应。

要匹配 CWR 位

/etc/cumulus/acl/policy.d 目录中创建一个规则文件,并在 [iptables] 下添加以下规则

cumulus@switch:~$ sudo nano /etc/cumulus/acl/policy.d/30-tcp-flags.rules
[iptables]
-t mangle -A PREROUTING -i swp1 -p tcp -m ecn  --ecn-tcp-cwr  -j ACCEPT

应用规则

cumulus@switch:~$ sudo cl-acltool -i
cumulus@switch:~$ nv set acl example2 type ipv4
cumulus@switch:~$ nv set acl example2 rule 10 match ip protocol tcp
cumulus@switch:~$ nv set acl example2 rule 10 match ip ecn flags tcp-cwr
cumulus@switch:~$ nv set acl example2 rule 10 action permit
cumulus@switch:~$ nv set interface swp1 acl example2 inbound
cumulus@switch:~$ nv config apply

匹配 ECT 位

ECT 代码点协商连接是否支持 ECN,方法是将两个位之一设置为 1。路由器还使用 ECT 位来指示它们正在经历拥塞,方法是将两个 ECT 代码点都设置为 1。

要匹配 ECT 位

/etc/cumulus/acl/policy.d 目录中创建一个规则文件,并在 [iptables] 下添加以下规则

cumulus@switch:~$ sudo nano /etc/cumulus/acl/policy.d/30-tcp-flags.rules
[iptables]
-t mangle -A PREROUTING -i swp1 -p tcp -m ecn  --ecn-ip-ect 1 -j ACCEPT

应用规则

cumulus@switch:~$ sudo cl-acltool -i
cumulus@switch:~$ nv set acl example2 type ipv4
cumulus@switch:~$ nv set acl example2 rule 10 match ip protocol tcp
cumulus@switch:~$ nv set acl example2 rule 10 match ip ecn ip-ect 1
cumulus@switch:~$ nv set acl example2 rule 10 action permit
cumulus@switch:~$ nv set interface swp1 acl example2 inbound
cumulus@switch:~$ nv config apply

示例配置

以下示例演示了 Cumulus Linux 如何应用多个不同的规则。

出口规则

以下规则阻止任何目标端口为 200 的 TCP 流量通过 leaf01 流向 server01(上图中的规则 1)。

[iptables]
-t mangle -A POSTROUTING -o swp1 -p tcp -m multiport --dports 200 -j DROP
cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip protocol tcp
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip tcp dest-port 200
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 action deny
cumulus@switch:~$ nv set interface swp1 acl EXAMPLE1 outbound
cumulus@switch:~$ nv config apply

入口规则

以下规则阻止任何源端口为 200 的 UDP 流量从 server01 通过 leaf01 流入(上图中的规则 2)。

[iptables] 
-t mangle -A PREROUTING -i swp1 -p udp -m multiport --sports 200 -j DROP
cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip protocol udp
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip udp source-port 200
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 action deny
cumulus@switch:~$ nv set interface swp1 acl EXAMPLE1 inbound
cumulus@switch:~$ nv config apply

输入规则

以下规则阻止任何源端口为 200 且目标端口为 50 的 UDP 流量从 server02 流向 leaf02 控制平面(上图中的规则 3)。

[iptables] 
-A INPUT -i swp2 -p udp -m multiport --dports 50 -j DROP
cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip protocol udp
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip udp dest-port 50
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 action deny
cumulus@switch:~$ nv set interface swp2 acl EXAMPLE1 inbound control-plane
cumulus@switch:~$ nv config apply

输出规则

以下规则阻止任何源端口为 123 且目标端口为 123 的 TCP 流量从 leaf02 流向 server02(上图中的规则 4)。

[iptables] 
-A OUTPUT -o swp2 -p tcp -m multiport --sports 123 -m multiport --dports 123 -j DROP
cumulus@switch:~$ nv set acl EXAMPLE1 type ipv4
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip protocol tcp
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip tcp source-port 123
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 match ip tcp dest-port 123
cumulus@switch:~$ nv set acl EXAMPLE1 rule 10 action deny
cumulus@switch:~$ nv set interface swp2 acl EXAMPLE1 outbound control-plane
cumulus@switch:~$ nv config apply

第 2 层规则 (ebtables)

以下规则阻止任何源 MAC 地址为 00:00:00:00:00:12 且目标 MAC 地址为 08:9e:01:ce:e2:04 的流量从任何交换机端口出口或入口。

[ebtables]
-A FORWARD -s 00:00:00:00:00:12 -d 08:9e:01:ce:e2:04 -j DROP
cumulus@switch:~$ nv set acl EXAMPLE type mac
cumulus@switch:~$ nv set acl EXAMPLE rule 10 match mac source-mac 00:00:00:00:00:12
cumulus@switch:~$ nv set acl EXAMPLE rule 10 match mac dest-mac 08:9e:01:ce:e2:04
cumulus@switch:~$ nv set acl EXAMPLE rule 10 action deny
cumulus@switch:~$ nv set interface swp1-48 acl EXAMPLE inbound
cumulus@switch:~$ nv config apply

注意事项

并非所有规则都受支持

Cumulus Linux 并非支持所有 iptablesip6tablesebtables 规则。有关特定规则支持,请参阅 支持的规则

ACL 日志策略器限制流量

为了保护 CPU 免于过载,Cumulus Linux 通过 ACL 日志策略器将复制到 CPU 的流量限制为每秒 1 个数据包。

桥接流量限制

匹配 LOG ACTION 规则的桥接流量不会记录到 syslog;内核和硬件使用不同的信息来识别数据包。

您无法转发日志操作

您无法转发记录的数据包。硬件无法同时转发数据包并将数据包发送到控制平面(或内核)进行日志记录。日志操作还必须具有丢弃操作。

引用传出接口的 SPAN 会话

引用传出接口的 SPAN 会话在路由/交换决策之前,根据入口接口创建镜像数据包。请参阅网络故障排除部分中的 引用传出接口的 SPAN 会话使用 CPU 端口作为 SPAN 目的地

iptables 与 cl-acltool 的交互

由于 Cumulus Linux 是 Linux 操作系统,因此您可以使用 iptables 命令。但是,考虑到以下原因,请考虑改用 cl-acltool

  • 如果不使用 cl-acltool,规则将不会安装到硬件中。
  • 运行 cl-acltool -i(安装命令)会重置所有规则并删除 /etc/cumulus/acl/policy.conf 文件中不存在的任何内容。

例如,运行以下命令有效

cumulus@switch:~$ sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

当您运行 cl-acltool -L 时,规则会显示出来

cumulus@switch:~$ sudo cl-acltool -L ip
-------------------------------
Listing rules of type iptables:
-------------------------------
TABLE filter :
Chain INPUT (policy ACCEPT 72 packets, 5236 bytes)
pkts bytes target  prot opt in   out   source    destination

0     0 DROP    icmp --  any  any   anywhere  anywhere      icmp echo-request

但是,运行 cl-acltool -ireboot 会将其删除。为确保 Cumulus Linux 可以硬件加速所有可以硬件加速的规则,请将其放置在 /etc/cumulus/acl/policy.conf 文件中,然后运行 cl-acltool -i

在何处分配规则

  • 如果您将交换机端口分配给 bond,则必须将任何出口规则分配给 bond。
  • 当使用 OUTPUT 链时,您必须将规则分配给源。例如,如果您在流量方向上将规则分配给交换机端口,但源是桥接器 (VLAN),则该规则不会影响流量,您必须将规则应用于桥接器。
  • 如果您需要将规则应用于所有中转流量,请使用 FORWARD 链,而不是 OUTPUT 链。

ACL 规则安装失败故障排除

在 Spectrum-2 及更高版本上,除了 ACL 之外,存储在 KVD 和 ATCAM 中的项目还包括桥接器中 VLAN 和接口的内部计数器。如果网络包含 1000 多个 VLAN 接口,则计数器可能会占用大量空间,并减少 ACL 的可用空间量。

如果您使用所有 ACL 空间,则在尝试应用 ACL 时,您可能会看到类似于以下的错误消息

cumulus@switch:$ sudo cl-acltool -i -p 00control_plane.rules
Using user provided rule file 00control_plane.rules
Reading rule file 00control_plane.rules ...
Processing rules in file 00control_plane.rules ...
error: hw sync failed (sync_acl hardware installation failed)
Installing acl policy... Rolling back ..
failed.
error: hw sync failed (Bulk counter init failed with No More Resources). Rolling back ..

您还可能会在 /var/log/syslog 文件中看到类似于以下的消息

2023-12-07T16:31:32.386792-05:00 mlx-4700-51 sx_sdk: 1951 [FLOW_COUNTER] [NOTICE ]:
Spectrum_flow_counter_bulk_set: cm_bulk_block_add failed toallocated bulk size 64

您还可能会在 /var/log/switchd.log 文件中看到类似于以下的消息

2023-12-07T16:31:32.387219-05:00 mlx-4700-51 switchd[7354]: hal_mlx_sdk_counter_wrap.c:366 ERR
sx_api_flow_counter_bulk_set create failed with: No More Resources
2023-12-07T16:31:32.387338-05:00 mlx-4700-51 switchd[7354]: hal_mlx_flx_acl.c:9531 ERR
flow_counter_bulk_set create failed with: No More Resources
2023-12-07T16:31:32.387415-05:00 mlx-4700-51 switchd[7354]: hal_mlx_flx_acl.c:3202 ERR BULK
counter init failed with No More Resources
2023-12-07T16:31:32.387481-05:00 mlx-4700-51 switchd[7354]: hal_mlx_flx_acl.c:2765
 hal_mlx_flx_chain_desc_install returned 0
2023-12-07T16:31:32.387554-05:00 mlx-4700-51 switchd[7354]: hal_mlx_flx_acl.c:1981 ERR
acl_plan_install returned 0
2023-12-07T16:31:32.393928-05:00 mlx-4700-51 switchd[7354]: sync_acl.c:225 ERR BULK counter init
failed with No More Resources
2023-12-07T16:31:32.394047-05:00 mlx-4700-51 switchd[7354]: sync_acl.c:6669 ERR BULK counter init
failed with No More Resources

有关 ACL 资源限制的信息,请参阅 ACL 规则的硬件限制

在 Spectrum-2 及更高版本上,当您尝试配置超过 1000 个 VLAN 接口时,您可能会看到资源错误,因为某些 VLAN 计数器与 ATCAM 中的 ACL 内存共享空间。

要释放资源,您可以

  • 将指定的 VLAN 或 VLAN 接口的数量减少到网络中需要的数量。

  • 释放 VLAN 流计数器空间;编辑 /etc/mlx/datapath/stats.conf 文件以取消注释并将 hal.mlx.stats.vlan.enable 选项设置为 FALSE,然后重新加载 switchd

    cumulus@switch:$ sudo nano /etc/mlx/datapath/stats.conf
    # Once the stat controls are enabled/disabled,
    # run 'systemctl reload switchd' for changes to take effect
    hal.mlx.stats.vlan.enable = FALSE
    
    cumulus@switch:$ sudo systemctl reload switchd.service
    

流计数器是用于调试的内部计数器;您在 nv show interface <interface> counterscl-netstat 命令中看不到计数器。

要查看流计数器占用了多少空间,请检查 cl-resource-query 输出中的 Flow Counters 行。

当 ACL 上的输出端口是子接口时,ACL 不匹配

当您将子接口配置为输出端口时,ACL 在数据包上不匹配。仅当主端口作为输出端口时,ACL 才在数据包上匹配。如果子接口是输出或出口端口,则数据包会正确匹配。

例如

-A FORWARD -o swp49s1.100 -j ACCEPT

在 Bond 上出口 ACL 匹配

Cumulus Linux 不支持在出站 bond 接口上匹配的 ACL 规则。例如,您无法创建以下规则

[iptables]
-A FORWARD -o <bond_intf> -j DROP

要解决此问题,请在 bond 的每个物理端口上复制 ACL 规则。例如

[iptables]
-A FORWARD -o <bond-member-port-1> -j DROP
-A FORWARD -o <bond-member-port-2> -j DROP

到管理 VRF 的 SSH 流量

要允许到管理 VRF 的 SSH 流量,请使用 -i mgmt,而不是 -i eth0。例如

-A INPUT -i mgmt -s 10.0.14.2/32 -p tcp --dport ssh -j ACCEPT

INPUT 链规则和 swp+

在 INPUT 链规则中,仅当数据包的目标是指向第 3 层 swp 接口时,-i swp+ 匹配才有效;如果数据包在 SVI 接口(例如,vlan10)终止,则匹配无效。要允许流向特定 SVI 的流量,请使用没有任何接口匹配的规则或带有单个 -i <SVI> 匹配的规则。