我正在尝试vxlan
使用 Linux,这个问题让我困扰了好几天。
简单的 Vxlan 工作正常
具有多播的简单 vxlan 可用于跨主机通信,只需创建一个 vxlan vtep 并分配一个 ip 地址:
ip link add vxlan100 type vxlan id 100 group 239.1.1.1 dev enp0s8
ip addr add 10.20.1.2/24 dev vxlan100
ip link set vxlan100 up
在两台主机上运行上述命令后,拓扑如下:
并且效果很好!
桥接 VXLAN 不起作用
然后我尝试设置桥接 vxlan,以将容器与 vxlan 连接起来,但它不起作用。以下是我设置桥接和 vxlan 的步骤:
ip link add br0 type bridge
ip link add vxlan100 type vxlan id 100 group 239.1.1.1 dev enp0s8
ip link set dev vxlan100 master br0
ip link set vxlan100 up
ip link set br0 up
至于 vms/容器,我仅使用网络命名空间和 veth peer 进行测试目的:
ip link add veth0 tyep veth peer name veth1
ip link set dev veth0 master br0
ip link set veth0 up
ip netns add container1
ip link set dev veth1 netns container1
ip netns exec container1 ip link set lo up
ip netns exec contianer1 ip link set veth1 name eth0
ip netns exec container1 ip addr add 10.20.1.2/24 dev eth0
ip netns exec container1 ip link set eth0 up
拓扑结构如下图所示:
当我尝试从 VM1 ping VM2 时,它会打印出目标主机无法访问错误:
[root@localhost ~]# ip netns exec container2 ping -c 3 10.20.1.3
PING 10.20.1.3 (10.20.1.3) 56(84) bytes of data.
From 10.20.1.2 icmp_seq=1 Destination Host Unreachable
From 10.20.1.2 icmp_seq=2 Destination Host Unreachable
From 10.20.1.2 icmp_seq=3 Destination Host Unreachable
--- 10.20.1.3 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 1999ms
使用tcpdump抓包br0
,结果:
[root@localhost vagrant]# tcpdump -e -nn -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
15:35:02.533609 0e:f3:f2:c1:9a:b5 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.20.1.3 tell 10.20.1.2, length 28
15:35:02.533609 0e:f3:f2:c1:9a:b5 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.20.1.3 tell 10.20.1.2, length 28
15:35:02.534184 76:c2:07:e6:c2:7b > 0e:f3:f2:c1:9a:b5, ethertype ARP (0x0806), length 42: Reply 10.20.1.3 is-at 76:c2:07:e6:c2:7b, length 28
15:35:03.534274 0e:f3:f2:c1:9a:b5 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.20.1.3 tell 10.20.1.2, length 28
15:35:03.534274 0e:f3:f2:c1:9a:b5 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.20.1.3 tell 10.20.1.2, length 28
15:35:03.535261 76:c2:07:e6:c2:7b > 0e:f3:f2:c1:9a:b5, ethertype ARP (0x0806), length 42: Reply 10.20.1.3 is-at 76:c2:07:e6:c2:7b, length 28
15:35:04.536105 0e:f3:f2:c1:9a:b5 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.20.1.3 tell 10.20.1.2, length 28
15:35:04.536105 0e:f3:f2:c1:9a:b5 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 10.20.1.3 tell 10.20.1.2, length 28
15:35:04.536696 76:c2:07:e6:c2:7b > 0e:f3:f2:c1:9a:b5, ethertype ARP (0x0806), length 42: Reply 10.20.1.3 is-at 76:c2:07:e6:c2:7b, length 28
^C
9 packets captured
9 packets received by filter
0 packets dropped by kernel
如输出所示,ARP 请求已在 vxlan 中发送,并得到了响应br0
,但网桥并未将其转发到VM1
。有两个问题我完全不明白:
- 为什么每次 ICMP ping 都会有两个 ARP 请求?
- 为什么不
br0
转发 ARP 响应VM1
,即使目标 MAC 地址完全正确VM1
?
供你参考,我正在读这个2017 年 vxlan linux 文章作者:vincent bernat。
不确定我是否做错了什么,或者错过了一些配置。真的需要一个解决方案或调试技巧。
答案1
这可能与广播帧的头端复制有关
在我的案例中(点对多点 VXLAN 与 VLAN 桥接),通过添加静态 VTEP 条目解决了类似的问题
ip link add vxlan0 type vxlan id 100 local 198.51.100.10 remote 203.0.113.110 dev ens0 dstport 4789
bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 203.0.113.110
来源:https://vincent.bernat.ch/en/blog/2017-vxlan-linux#unicast-with-static-flooding
答案2
vm1
并且vxlan100
是 L2 接口,不能有 IP 地址,它们是虚拟交换机/网桥的一部分br0
。
如果您需要 L3 连接,请将您的 IP 地址移至接口br0
。
这帮我解决了这个问题。
(参考) https://unix.stackexchange.com/questions/308086/host-unreachable-after-added-into-linux-bridge