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通信。
是我想要的,我只是想展示我的最终解决方案,以防有人有相同的目标。
我对 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通信。