我已经研究这个问题几天了,但还没有找到答案。非常感谢您的帮助!
我在物理服务器上运行了一些 VM(虚拟机)。该服务器使用 Linux 桥接器(br100)将这些 VM 连接在一起:
# brctl show
bridge name bridge id STP enabled interfaces
br100 8000.984be15fe7e3 no eth1.1729
vnet0
vnet1
vnet0和vnet1是虚拟机的虚拟网卡。
br100(物理服务器)分配了 IP 172.16.0.11。连接到 vnet1 的 VM 分配了 172.16.0.3,连接到 vnet0 的 VM 分配了 172.16.0.5。
到目前为止一切顺利。172.16.0.3 可以毫无问题地 ping 172.16.0.5。
现在我正尝试将 172.16.0.3 设置为路由器(如果重要的话,是 openvpn 服务器)到子网 10.8.0.0/16。
我的问题来了:10.8.0.0/16(在本例中为 10.8.0.6)中的机器可以 ping 172.16.0.3,但无法 ping 172.16.0.5。
(我认为)我已经排除了所有明显的原因:ip_forward 已打开、iptables 已刷新等。现在我将原因缩小到:br100 没有按应有的方式转发数据包!
当我从 10.8.0.6 ping 172.16.0.5 时,数据包被传送到物理服务器上的 vnet1(VM 172.16.0.3):
# tcpdump -leni vnet1 icmp
tcpdump: WARNING: vnet1: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vnet1, link-type EN10MB (Ethernet), capture size 65535 bytes
07:45:03.858356 02:16:3e:6a:42:57 > 02:16:3e:02:40:82, ethertype IPv4 (0x0800), length 98:
10.8.0.6 > 172.16.0.5: ICMP echo request, id 63242, seq 1046, length 64
07:45:04.858239 02:16:3e:6a:42:57 > 02:16:3e:02:40:82, ethertype IPv4 (0x0800), length 98:
10.8.0.6 > 172.16.0.5: ICMP echo request, id 63242, seq 1047, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel
但不会转发到vnet0(172.16.0.5):
# tcpdump -leni vnet0 icmp
tcpdump: WARNING: vnet0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vnet0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
我也遵循了这个帖子并将 0 设置为 /proc/sys/net/bridge/bridge-nf-*,但似乎没有帮助。
除了刷新 iptables 过滤器之外,我还打开了 iptables 中的 TRACE,这表明这些数据包从未到达 iptables。
Linux 桥接器无法在端口之间转发数据包的其他原因是什么?
答案1
找到答案了!Linux 以太网桥参考 ebtables 来决定转发哪些数据包以及丢弃哪些数据包。刷新 ebtables 解决了我的问题。