Iptables - 桥接和转发链

Iptables - 桥接和转发链

我已经设置了br0包含两个接口的以太网桥eth0,并且tap0

brctl addbr br0
brctl addif eth0
brctl addif tap0
ifconfig eth0 0.0.0.0 promisc up
ifconfig tap0 0.0.0.0 promisc up
ifconfig br0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255 

我的默认FORWARD连锁政策是DROP

iptables -P FORWARD DROP

当我不添加以下规则时,流量就不会通过桥梁。

iptables -A FORWARD -p all -i br0 -j ACCEPT

据我了解iptables只负责IP层。

ebtables应该负责过滤以太网桥上的流量。

那么为什么我必须在 iptable 的 FORWARD 链中添加 ACCEPT 规则?

答案1

由于 br-nf 代码可作为 Linux 2.4 的补丁使用,并且可在 Linux 2.6 中使用:

br-nf 代码使桥接的 IP 帧/数据包通过 iptables 链。ebtables 在以太网层进行过滤,而 iptables 仅过滤 IP 数据包。

由于您正在处理的流量是 IP,因此iptables规则仍然适用,因为br-nf将桥接数据包传递给iptables

是一个很好的资源,可以阅读关于互动和这个详细说明了功能br-nf代码,包括如何禁用所有或部分功能(即不将桥接流量传递给 iptables)。

答案2

你可以通过输入以下命令禁用此行为(让 iptables 处理桥接数据包):

echo "0" > /proc/sys/net/bridge/bridge-nf-call-iptables

(看http://ebtables.sourceforge.net/documentation/bridge-nf.html

答案3

如果您不需要在系统上使用 iptables 与桥接器,则可以使用以下任一方法永久禁用它:

  1. 添加 iptables 规则:

iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT

  1. 或者编辑 /etc/sysctl.conf:

net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0

答案4

ebtables 链不会看到进入非转发桥接端口的帧。可以看看这个:http://ebtables.sourceforge.net/br_fw_ia/br_fw_ia.html

相关内容