β

理解 VXLAN

nosa.me 263 阅读

VXLAN (Virtual eXtensible LAN) 是一种通过三层网络来传输二层网络数据的一种隧道技术,可以解决很多问题,我们主要用它来解决不同宿主机的 docker 实例通信问题。

不同的 VXLAN 有一个 ID,叫做 VXLAN Network Identifier 或者 VNI,有 24 位( VLAN 只有 12 位),能提供 16 million 个 ID。

使用 VXLAN 可以隔离每个 VNI 之间的网络,但是我们目前只使用一个 VNI,也就是所有 docker 宿主机都有相同的 VNI。

VXLAN 还有个名词叫做 VXLAN Tunnel End Point (VTEP),在我们的环境中 VTEP 在每台宿主机上,它有两个接口,一个是普通的对外的接口,一个是面向 docker 的接口,后者通过虚拟交换机和里面的 docker 相连,docker 的 IP 是私有网段。

当一台宿主机的 docker 访问另一台宿主机的 docker 时,原始的二层报文包括:

Inner Ethernet header  + Inner IP header + Payload

然后,VTEP 会对其进行封装,在原始的二层报文前面封装如下:

Outer UDP header + VXLAN header  —>  Outer IP header  —>  Outer Ethernet header

D4B1FE0D-F1A2-4C1F-8BF6-9C916F4DDFF8

解释:

| VXLAN 头封装
– Flags:8 比特,取值为 00001000。
– VNI:VXLAN 网络标识,24 比特,用于区分 VXLAN 段。
– Reserved:24 比特和 8 比特,必须设置为 0。

l 外层 UDP 头封装
目的 UDP 端口号是 4789 。源端口号是内层以太报文头通过哈希算法计算后的值。

l 外层 IP 头封装
源IP地址为发送报文的虚拟机所属VTEP的IP地址;目的 IP 地址是目的虚拟机所属
VTEP的 IP 地址。

l 外层 Ethernet 头封装
– SA:发送报文的虚拟机所属 VTEP 的 MAC 地址。
– DA:目的虚拟机所属 VTEP 上路由表中直连的下一跳 MAC 地址。
– VLAN Type:可选字段,当报文中携带 VLAN Tag 时,该字段取值为 0x8100。
– Ethernet Type:以太报文类型,IP协议报文该字段取值为 0x0800。

在 VTEP 进行封装之前,事实上源 docker ( 起名 docker1 )需要知道目的 docker ( 起名 docker2 ) 的 MAC 和 IP,而且源 VTEP ( 起名 VTEP1 ) 需要知道目的 VTEP ( 起名 VTEP2 ) 的 IP。

如何知道呢,过程如下(假设 VNI = 864):

1、docker1 发送 ARP 请求包,请求 192.168.0.101 [docker2 IP] 的 MAC 地址;
2、ARP 请求包被 VTEP1 封装成多播包,发给 VNI = 864 的多播组;
3、所有的 VTEP 接收此多播包,并添加 ( VNI – VTEP1– docker1_MAC Address) 映射关系到自己的 VXLAN 表中;
4、目的主机上的 VTEP2 接收到多播包后将其解开,并向本主机上 VNI = 864 的所有虚拟机发送广播包;
5、docker2 看到了 ARP 包后,回应了自己的 MAC 地址;
6、VTEP2 再次封装回应的单播包,通过路由发给 VTEP1;
7、VTEP1 解包,并将包传给 docker1,则最终获取了 docker2 的 MAC 地址;
8、VTEP1 将 ( VNI – VTEP2 – docker2_MAC Address)映射关系添加到自己的 VXLAN 表中。

下面看 docker1 到 docer2 的过程 ( 偷的图,把docker1 换成了 VM1,docker2 换成了 VM2 ):

5B172701-B5A7-46F8-8FDA-35E26D6FA085

1、 发送 IP 数据包到 VM2,即 192.168.0.100 到 192.168.0.101;
2、 VTEP1 查找自己的 VXLAN 表知道要发给 VTEP2,然后依次封装以下数据包头;
a) VXLAN 包头,VNI = 864;
b) 标准 UDP 包头,校验和 checksum 为 0x0000,目标端口号 4789;
c) 标准 IP 包头,目标地址为VTEP2的IP地址,协议号设为 0x11 表面为 UDP 包。
d) 标准 MAC 数据包,目标地址为下一跳设备的MAC地址 00:10:11:FE:D8:D2,可路由到目标隧道端 VTEP2。
3、 VTEP2 接收数据包,根据 UDP 的 destination 端口找到 VXLAN 数据包。接着查找所有所在 VXLAN 的 VNI 为 864 的端口组,找到 VM2;
4、 VM2 接收并处理数据包,拿到 Payload 数据。

https://sites.google.com/site/amitsciscozone/home/data-center/vxlan

http://blog.sina.com.cn/s/blog_6de3aa8a0101oisp.html

http://e.huawei.com/cn/marketing-material/cn/products/enterprise_network/ce_switches/hw_376141

No related posts.

作者:nosa.me
未来不会有sa
原文地址:理解 VXLAN, 感谢原作者分享。

发表评论