使用入口 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 设备。
运行以下命令以启用
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
在
/etc/cumulus/acl/policy.d/
目录中添加一个名为75BlockDHCP.rules
的文件,其中包含以下内容[iptables] -A FORWARD -m physdev --physdev-in swp1 -p udp --sport 68 -j DROP
此示例阻止 swp1 上的入口 DHCP。要将规则应用于所有接口,请使用通配符语法
swp+
。应用规则
cumulus@switch:~$ sudo cl-acltool -i
验证规则。
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
此计数器不会递增。