为什么我的防火墙(iptables)会干扰我的网桥(brctl)?

Tot*_*tor 12 firewall virtual-machine iptables bridge

我建立了一个br0“附加”到两个接口的网桥:

  • eth0,我的物理接口连接到真正的局域网,
  • vnet0,一个 KVM 虚拟接口(连接到 Windows VM)。

我在前向链中有这个单一的防火墙规则:

iptables -A FORWARD -j REJECT
Run Code Online (Sandbox Code Playgroud)

现在,唯一有效的 ping 是从 VM 到主机。

br0接口拥有我主机的 IP 地址。eth0vnet0没有“拥有”任何IP,从主机点。Windows VM 具有静态 IP 配置。

如果将我的iptables规则更改为ACCEPT(甚至使用更严格的iptables -A FORWARD -o br0 -j ACCEPT),则一切正常!(即我可以从 VM ping 任何 LAN 机器,反之亦然)。

所有 IP 转发内核选项都被禁用(如net.ipv4.ip_forward = 0)。

那么,netfilter 防火墙如何阻止甚至没有启用的东西?

此外,VM-LAN 流量应仅暗示eth0vnet0。然而,它看起来像是允许带有-o br0“作品”的FORWARD 流量(虽然我没有仔细检查)。

Mat*_*ner 11

Stéphane Chazelas的评论提供了答案的提示。

根据Bridge-nf 常见问题, bridge-nf 使 iptables、ip6tables 或 arptables 能够查看桥接流量。

从内核版本 2.6.1 开始,bridge-nf 行为控制有五个sysctl 条目

  • 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
Run Code Online (Sandbox Code Playgroud)

  • 从 Linux 3.18 开始,可以通过不加载 `br_netfilter` 模块来禁用 iptables 处理来自网桥的数据包​​的功能。没有加载模块也意味着没有 `/proc/sys/net/bridge/` 条目。 (4认同)