在 Linux 中设置桥接 VXLAN 网络

在 Linux 中设置桥接 VXLAN 网络

我正在尝试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。有两个问题我完全不明白:

  1. 为什么每次 ICMP ping 都会有两个 ARP 请求?
  2. 为什么不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

相关内容