我正在尝试设置一个有关 Linux 桥接器的测试场景,为此我需要一个完整的虚拟 IP 堆栈。基本上,我想模拟虚拟机(或容器)与其主机之间的网络,只是没有虚拟机,即虚拟化层。
主机端是一个桥接器 ( br0
),它配置了 IP 地址(模拟 VM 的默认网关),如其他正常工作的 KVM 设置中所示。我尝试模拟连接的 VM 端,如下所示:
- 使用
tap
接口(OpenVPN 连接到另一台服务器,从那里 ping 一下) - 一
veth
对,一端配置有 IP 地址,另一端连接到网桥 bridge
具有 IP 地址的辅助网桥通过veth
对连接到主网桥
在这些设置中,我都无法 ping 主机桥(虚拟机默认网关)。在所有设置中,问题都是一样的:桥接接口没有响应 ARP 数据包。
配置(本地 veth):
+-----+
| br0 |
| | +------+ +------+
| ==| vip1 |<-->| vip2 |
+-----| +------+ +------+
br0: type=bridge, UP, 172.16.1.1/24
vip1: type=veth, UP
vip2: type=veth peer, UP, 172.16.1.2/24
# brctl addbr br0
# ifconfig br0 172.16.1.1 netmask 255.255.255.0 up
# ip link add vip1 type veth peer name vip2
# ifconfig vip2 172.16.1.2 netmask 255.255.255.0 up
# brctl addif br0 vip1
# ifconfig vip1 up
现在我正在尝试ping
从br0
:vip2
# [root@host ~]# ping -I vip2 172.16.1.1
# PING 172.16.1.1 (172.16.1.1) from 172.16.1.2 vip2: 56(84) bytes of data.
# ^C
# --- 172.16.1.1 ping statistics ---
# 2 packets transmitted, 0 received, 100% packet loss, time 1493ms
tcpdump
在桥上:
# [root@host ~]# tcpdump -i br0
# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
# listening on br0, link-type EN10MB (Ethernet), capture size 65535 bytes
# 23:14:02.367624 ARP, Request who-has 172.16.1.1 tell 172.16.1.2, length 28
# 23:14:03.367657 ARP, Request who-has 172.16.1.1 tell 172.16.1.2, length 28
# 23:14:04.367345 ARP, Request who-has 172.16.1.1 tell 172.16.1.2, length 28
# ...
这很奇怪,因为br0
这些数据包到达的接口UP
应该响应 ARP 请求。
# [root@host ~]# ifconfig br0
# br0 Link encap:Ethernet HWaddr F6:F3:5A:A7:A2:5B
# inet addr:172.16.1.1 Bcast:172.16.1.255 Mask:255.255.255.0
# inet6 addr: fe80::f4f3:5aff:fea7:a25b/64 Scope:Link
# UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
# RX packets:53 errors:0 dropped:0 overruns:0 frame:0
# TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
# collisions:0 txqueuelen:0
# RX bytes:1580 (1.5 KiB) TX bytes:360 (360.0 b)
我试过了:
- OpenVPN tap 接口(通过 OpenVPN 从另一台主机 ping 以便数据包到达 tap 接口而不是 veth 接口)
- 另一座桥(
br1
),使用一veth
对连接两座桥 - 设置
net.ipv4.conf.all.arp_filter
和其他,但似乎没有什么影响 iptables
并且ebtables
是空的并且接受一切。
所以我一直在努力寻找为什么这不起作用以及与容器或虚拟化解决方案有什么区别。任何帮助都非常感谢!
谢谢!