nftables - 丢弃特定网桥上的 arp 流量

nftables - drop arp traffic on specific bridge

我对 nftables 语法有基本的了解,我正在尝试丢弃发生在 Linux 网桥上的所有 arp 流量。

我是 运行 debian 并且有几个虚拟机都连接到一个网桥。对于一个项目,我需要阻止任何类型的 ARP 流量,但仅限于此网桥。

我试过

table bridge bridge_filter {
        chain forward {
                type filter hook forward priority 0;
                policy accept;

                iifname "tap2*" ether type arp drop;
                oifname "tap2*" ether type arp drop;

                iifname "vmbr1" ether type arp drop;
        }
}

(虚拟机自动连接到带有“tap2*”tap 设备的网桥) 但效果不是很好,至少我仍然可以在每个虚拟机上使用 tcpdump 看到 ARP 数据包,包括请求和回复。我知道上面的配置可能没有完全意义,但我不知道什么是正确的方法。

我的配置有什么问题?

我不确定您是只需要过滤虚拟机之间的 ARP 流量,还是还需要过滤主机和虚拟机之间的 ARP 流量。

如果是后者,则主机和 VM 之间的 ARP 流量在使用“桥接转发”挂钩时不会被过滤。

为了过滤 VM 和主机之间的单播 ARP 流量,我认为您还需要使用带有网桥“prerouting”和“postrouting”挂钩的链。

例如

table bridge bridge_prerouting_filter {
        chain prerouting {
                type filter hook prerouting priority 0; policy accept;
                iifname "tap2*" ether type arp drop;
        }
}

table bridge bridge_postrouting_filter {
        chain postrouting {
                type filter hook postrouting priority 0; policy accept;
                oifname "tap2*" ether type arp drop;
        }
}

关于广播 ARP 流量,将更难有选择地过滤。我不知道“oifname”参数是否可以应用于广播流量,因为输出接口是 all interfaces.

在输入端过滤广播 ARP 流量会更容易,但很难区分允许的广播 ARP 流量和不允许的 ARP 流量。 Linux 5.7 中应该有一个新的 netdev“出口”过滤器,它可能可以用于此目的,但我认为它已被删除。

目标只是阻止网络中多个节点之间的所有 ARP 流量。这是一个用于教育目的的环境,学生应该在其中探索路由。 网络中有三个虚拟机。其中两个不应被允许交换 ARP 消息,第三个应该是中间人。因此,我只是想阻止两个指定节点之间的 ARP 流量。

我对每个网络都做了以下陈述:

iifname "tap201i0" oifname "tap203i0" ether type arp drop;
iifname "tap201i0" oifname "tap203i0" ip daddr 172.30.1.255 drop;
iifname "tap203i0" oifname "tap201i0" ether type arp drop;
iifname "tap203i0" oifname "tap201i0" ip daddr 172.30.1.255 drop;

(tap接口属于虚拟机,172.30.1.0/24由节点A、B、C组成) 通过这些陈述,我实现了我想要的。节点 A 和 C 无法通过 ARP(和广播 IP)相互通信。因此他们要求节点B作为路由器工作,仍然可以与A和B通信。

是我想要的,我只是想展示我的最终解决方案,以防有人有相同的目标。