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

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

图片.png 

1) NS01删除vxlan0配置

图片.png

 

2) NS02删除vxlan0配置

图片.png 

3) vxlan0配置模板

图片.png

 

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

4) NS01 vxlan0配置

图片.png

 

图片.png 

5) NS02 vxlan0配置

图片.png 

图片.png

 

默认表项的 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 报文都是单播进行的