要组成同一个 vxlan 网络,vtep 必须能感知到彼此的存在。多播组本来的功能就是把网络中的某些节点组成一个虚拟的组,所以 vxlan 最初想到用多播来实现是很自然的事情。

这个实验和前面一个非常相似,只不过主机之间不是点对点的连接,而是通过多播组成一个虚拟的整体。最终的网络架构也很相似(为了简单图中只有两个namespace,但这个模型可以容纳多个主机组成 vxlan 网络):

16、网络--实验四(搭建多播模式VXLAN网络)_docker 

1) NS01删除vxlan0配置

16、网络--实验四(搭建多播模式VXLAN网络)_hostman_02
 

2) NS02删除vxlan0配置

16、网络--实验四(搭建多播模式VXLAN网络)_network_03 

3) vxlan0配置模板

16、网络--实验四(搭建多播模式VXLAN网络)_docker_04
 

这里最重要的参数是 group 239.1.1.1 表示把 vtep 加入到这个多播组。关于多播的原理和使用不是这篇文章的重点,这里选择的多播 IP 地址也没有特殊的含义,关于多播的内容可以自行了解。

4) NS01 vxlan0配置

16、网络--实验四(搭建多播模式VXLAN网络)_linux_05
 

16、网络--实验四(搭建多播模式VXLAN网络)_docker_06 

5) NS02 vxlan0配置

16、网络--实验四(搭建多播模式VXLAN网络)_linux_07 

16、网络--实验四(搭建多播模式VXLAN网络)_hostman_08
 

默认表项的 dst 字段的值变成了多播地址 239.1.1.1,而不是之前对方的 VETP 地址。同理给所有需要通信的节点进行上述配置,可以验证他们能通过 10.20.1.0/24 网络互相访问。

1. 发送 ping 报文到 192.168.1.3,查看路由表,报文会从 vxlan0 发出去

2. 内核发现 vxlan0 的 IP 是 192.168.1.3/24,和目的 IP 在同一个网段,所以在同一个局域网,需要知道对方的 MAC 地址,因此会发送 ARP 报文查询

3. ARP 报文源 MAC 地址为 vxlan0 的 MAC 地址,目的 MAC 地址为全 1 的广播地址

4. vxlan 根据配置(VNI 42)添加上头部

5. 因为不知道对方 vtep 在哪台主机上,根据配置,vtep 会往多播地址 239.1.1.1 发送多播报文

6. 多播组中所有的主机都会受到这个报文,内核发现是 vxlan 报文,会根据 VNI 发送给对应的 vtep

7. vtep 去掉 vxlan 头部,取出真正的 ARP 请求报文。同时 vtep 会记录 <源 MAC 地址 - vtep 所在主机 IP 地址> 信息到 fdb 表中

8. 如果发现 ARP 不是发送给自己的,直接丢弃;如果是发送给自己的,则生成 ARP 应答报文

9. 应答报文目的 MAC 地址是发送方 vtep 的 MAC 地址,而且 vtep 已经通过源报文学习到了 vtep 所在的主机,因此会直接单播发送给目的 vtep。因此 vtep 不需要多播,就能填充所有的头部信息

10. 应答报文通过 underlay 网络直接返回给发送方主机,发送方主机根据 VNI 把报文转发给 vtep,vtep 解包取出 ARP 应答报文,添加 arp 缓存到内核。并根据报文学习到目的 vtep 所在的主机地址,添加到 fdb 表中

11. vtep 已经知道了通信需要的所有信息,后续 ICMP 的 ping 报文都是单播进行的