使用入口 ACL 封锁 DHCP 流量

问题

由于 Cumulus Linux 中的转发管道,您无法使用传统的 ACL 来阻止 DHCP 流量。交换机在硬件中丢弃 DHCP 流量,而 CPU 软件转发(捕获)它。如果您应用 IP ACL 来匹配 DHCP 流量,则统计计数器会显示它正在匹配,但交换机不会丢弃该流量。

以下示例显示了 swp1 的 ACL

cumulus@switch:~$ nv set acl BLOCK_DHCP rule 10 action deny
cumulus@switch:~$ nv set acl BLOCK_DHCP rule 10 match ip protocol udp
cumulus@switch:~$ nv set acl BLOCK_DHCP rule 10 match ip source-port 68
cumulus@switch:~$ nv set acl BLOCK_DHCP type ipv4
cumulus@switch:~$ nv set interface swp1 acl BLOCK_DHCP inbound

使用上述 ACL,如果连接到 swp1 的主机使用 DHCP 请求 IP 地址,则 DHCP 流量会匹配;但是,交换机不会阻止此流量,因为这只是一个硬件计数器,并且转发管道使用软件路径

cumulus@switch:/home/cumulus# nv show interface swp1 acl BLOCK_DHCP statistics
Rule  In Packet  In Byte    Out Packet  Out Byte  Summary
----  ---------  ---------  ----------  --------  ------------------------
10    2          692 Bytes                        match.ip.protocol:   udp <<<<
                                                  match.ip.source-port: 68

解决方案

创建一个 IP 访问列表以匹配 physdev 设备。

  1. 运行以下命令以启用 netfilter 来处理标记的数据包

    cumulus@switch:~$ sudo sysctl -w net.bridge.bridge-nf-filter-vlan-tagged=1
    

    要使此设置持久化,请将行 net.bridge.bridge-nf-filter-vlan-tagged = 1 添加到 /etc/sysctl.conf 文件

    cumulus@switch:~$ sudo cat /etc/sysctl.conf | grep vlan
    net.bridge.bridge-nf-filter-vlan-tagged = 1
    
  2. /etc/cumulus/acl/policy.d/ 目录中添加一个名为 75BlockDHCP.rules 的文件,其中包含以下内容

    [iptables]
    -A FORWARD -m physdev --physdev-in swp1 -p udp --sport 68 -j DROP
    

    此示例阻止 swp1 上的入口 DHCP。要将规则应用于所有接口,请使用通配符语法 swp+

  3. 应用规则

    cumulus@switch:~$ sudo cl-acltool -i
    
  4. 验证规则。

    cumulus@switch:~$ sudo cl-acltool -L ip | grep udp
     0     0 DROP       udp  --  any    any     anywhere   anywhere  PHYSDEV match --physdev-in swp1 udp spt:bootpc
    

    此计数器不会递增。