为什么 linux 网桥不起作用

das*_*tan 12 networking linux

我想在 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
Run Code Online (Sandbox Code Playgroud)

编辑

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

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

网桥桥接 arp 数据包而不桥接 icmp 数据包?

das*_*tan 23

我已经解决了这个问题。

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

测试是否是iptables引起的,我们可以试试

echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
Run Code Online (Sandbox Code Playgroud)

然后看看桥是否工作。

  • 我没有完全禁用 iptables,而是尝试了“iptables -A FORWARD -i br0 -o br0 -j ACCEPT”,它有所帮助。 (3认同)

小智 8

这正是我在对与 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
Run Code Online (Sandbox Code Playgroud)