在 tap 接口上使用 iptables 过滤数据包

在 tap 接口上使用 iptables 过滤数据包

我正在尝试编写防火墙规则来阻止客户机访问互联网。服务器(Ubuntu 服务器 22.0,使用 KVM)有一个物理连接(enp34s0),它连接到路由器、桥接接口(br0),而客户机正在使用一个 tap 设备(vnet0),它与 br0 桥接到同一个网络。我尝试在 vnet0 上应用的任何规则都不起作用。

例如我尝试使用以下命令来阻止 ping: iptables -I FORWARD -i vnet0 -o br0 -p icmp -j DROP iptables -I FORWARD -o vnet0 -i br0 -p icmp -j DROP iptables -I FORWARD -i vnet0 -o enp34s0 -p icmp -j DROP iptables -I FORWARD -o enp34s0 -i br0 -p icmp -j DROP

我仍然能够从/向客户机发送 ping。(还尝试使用 -p tcp --dport 443 来阻止 https)我做错了吗?无法确定这是否与它是 TAP 设备有关,并且在网上找不到任何相关信息。

答案1

如果您向表中添加日志记录规则FORWARD以捕获任何 ICMP 流量...

iptables -I FORWARD -p icmp -j LOG --log-prefix 'FORWARD_ICMP '

...您会看到输入接口是桥梁,而不是 TAP 设备:

Sep 09 19:19:20 fizzgig kernel: FORWARD_ICMP IN=virbr0 OUT=wlp0s20f3
PHYSIN=vnet1 MAC=52:54:00:f7:70:2a:52:54:00:18:f8:12:08:00 SRC=192.168.122.210
DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=59668 DF PROTO=ICMP TYPE=8
CODE=0 ID=5 SEQ=1 

这意味着您的规则-i vnet0永远不会匹配。

您可以在属性中看到 TAP 设备PHYSIN。我们可以使用该physdev模块来匹配它,如下所示:

iptables -A FORWARD -m physdev --physdev-in vnet1 -j DROP

(如果您需要匹配另一个方向的流量,还有一个 --physdev-out 匹配。)

相关内容