为什么 Linux Bridge 不工作

为什么 Linux Bridge 不工作

我想在 Linux 桥上连接两对 veth,并尝试从一对 ping 到另一对,以测试桥接功能。

下面的脚本在多台机器上测试,其中一些按预期工作,而其他则没有。

经过一些故障排除后,我发现:

  • brctl showstp <br>告诉两个端口都处于转发状态
  • brctl showmacs <br>正确显示本地和外部 mac

问题:

  • 为什么网桥不转发数据包?(不知道这些机器之间有什么区别)
  • 或者,我应该如何继续排除故障?

任何建议都值得赞赏。

--

#!/bin/bash

BR=br1

ip link add veth0 type veth peer name veth1
ip link add veth2 type veth peer name veth3
ip link add $BR type bridge
ip netns add ns0
ip netns add ns1
ip link set veth0 netns ns0
ip link set veth2 netns ns1
ip link set veth1 master $BR
ip link set veth3 master $BR
ip link set $BR up
ip link set veth1 up
ip link set veth3 up
ip netns exec ns0 ip link set veth0 up
ip netns exec ns1 ip link set veth2 up
ip netns exec ns0 ip addr add 172.30.0.1/24 dev veth0
ip netns exec ns1 ip addr add 172.30.0.2/24 dev veth2

ip netns exec ns0 ping 172.30.0.2

编辑

tcpdump -ni br1显示:

23:23:31.097396 ARP, Request who-has 172.30.0.2 tell 172.30.0.1, length 28
23:23:31.097431 ARP, Reply 172.30.0.2 is-at 9e:47:56:91:34:e6, length 28
23:23:31.097443 IP 172.30.0.1 > 172.30.0.2: ICMP echo request, id 21210, seq 1, length 64
23:23:32.096804 IP 172.30.0.1 > 172.30.0.2: ICMP echo request, id 21210, seq 2, length 64
23:23:33.096803 IP 172.30.0.1 > 172.30.0.2: ICMP echo request, id 21210, seq 3, length 64

ip netns exec ns1 tcpdump -ni veth2节目

23:33:58.198790 ARP, Request who-has 172.30.0.2 tell 172.30.0.1, length 28
23:33:58.198823 ARP, Reply 172.30.0.2 is-at 9e:47:56:91:34:e6, length 28
^C

该桥正在桥接 arp 数据包,但不桥接 icmp 数据包?

答案1

我已经解决了。

原来是iptables谁在桥上丢弃了数据包。数据包通过FORWARD表链filter,不匹配表中的任何规则,因此DROP适用默认策略。

为了测试是否由 iptables 引起,我们可以尝试

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

然后看看桥是否能正常工作。

答案2

这正是我在对用于 lxd 的手动创建的网桥进行故障排除时遇到的问题。我在 /etc/iptables/rules.v4 中添加了以下规则:

-A FORWARD -o br0 -m comment --comment "allow packets to pass from lxd lan bridge" -j ACCEPT
-A FORWARD -i br0 -m comment --comment "allow input packets to pass to lxd lan bridge" -j ACCEPT

相关内容