我设置了一个br0
“连接”到两个接口的桥:
eth0
,我的物理接口连接到真实的LAN,vnet0
,KVM虚拟接口(连接到Windows VM)。
我在前向链中有一个防火墙规则:
iptables -A FORWARD -j REJECT
现在,唯一有效的 ping 是从虚拟机到主机。
该br0
接口拥有我的主机的 IP 地址。从主机的角度来看,eth0
并且不“拥有”任何IP。 vnet0
Windows VM 具有静态 IP 配置。
如果将我的iptables
规则更改为ACCEPT
(或者甚至使用更具限制性的iptables -A FORWARD -o br0 -j ACCEPT
),则一切正常! (即我可以从虚拟机 ping 任何 LAN 计算机,反之亦然)。
所有 IP 转发内核选项均被禁用(如net.ipv4.ip_forward = 0
)。
那么,netfilter 防火墙如何阻止甚至未启用的东西呢?
此外,VM-LAN 流量应仅表示eth0
和vnet0
。然而,它看起来像是允许-o br0
“有效”的转发流量(虽然我没有仔细检查)。
答案1
这评论斯特凡·查泽拉斯 (Stéphane Chazelas) 提供了答案的提示。
根据Bridge-nf 常见问题解答bridge-nf 使 iptables、ip6tables 或 arptables 能够查看桥接流量。
从内核版本 2.6.1 开始,有五个系统控制条目对于bridge-nf行为控制:
bridge-nf-call-arptables
- 将桥接的 ARP 流量传递到 arptables 的 FORWARD 链。bridge-nf-call-iptables
- 将桥接的 IPv4 流量传递到 iptables 的链。bridge-nf-call-ip6tables
- 将桥接的 IPv6 流量传递到 ip6tables 的链。bridge-nf-filter-vlan-tagged
- 将桥接 VLAN 标记的 ARP/IP 流量传递到 arptables/iptables。net.bridge.bridge-nf-filter-pppoe-tagged
- 将桥接的 pppoe 标记的 IP/IPv6 流量传递到 {ip,ip6} 表
您可以使用以下命令禁用 netfilter 防火墙阻止:
# sysctl -w net.bridge.bridge-nf-call-iptables=0
# sysctl -w net.bridge.bridge-nf-call-ip6tables=0