VxLAN和VTEP

最近一直在熟悉VPN和专线相关业务,对于VxLAN和VTEP接触的较多

VxLAN封装转发二层报文,在二层报文添加了一个VxLAN Header,进而通过UDP封装来进行传输,具体的报文格式如下

这里重点关注的VxLAN封装部分的VXLAN header,其中有一个24位的VNI,可以对比VLAN ID,但VLAN的数量只有区区4096,而这里2^24数量来了个平方,使得划分网络的数目大大增加,除此之外还有虚拟机迁移,MAC表等方面都有很多利好

对于原始报文的封装,这里是通过VTEP来进行封装和解封,全称是VxLAN Tunnel End Point,它可以承载在物理交换机上,也可以是虚拟机交换机,知道了这个,整个VxLAN报文就好理解了,原始的报文,到了VTEP之后,就给封装VxLAN和UDP然后进行链路传输,因此在没有解封之前,原始报文里的信息是无法获知的

再来看VxLAN报文的结构图:

VXLAN header:上面说过了,VNI可以对比VLAN ID,同一个VNI的VxLAN网络才能进行通信

UDP header:目的Port一般默认是4789,所以抓UDP的包,确认port比较容易

IP header:SRC IP为请求的虚拟机所在的VTEP的IP地址,DST IP为目的端虚拟机所在的VTEP的IP地址

Ethernet header:SRC MAC为请求的虚拟机所在的VTEP的MAC地址,DST MAC为VTEP路由表下一跳的MAC地址,比如VTEP的网关?

根据上面的信息,基本可以体会出来,VTEP作为VxLAN隧道的两端,也可以说一对VTEP地址决定了一条VxLAN隧道,但是一个VTEP却不仅仅只能管理一条VxLAN隧道,而是很多个隧道,每个隧道的目的端不同,其实在br-tun网桥里,经常会看到类似的东西

Bridge br-tun
        Port "vxlan-0a000119"
            Interface "vxlan-0a000119"
                type: vxlan
                options: {df_default="true", in_key=flow, local_ip="11.11.11.11", out_key=flow, remote_ip="11.11.11.19"}
        Port "vxlan-0a000131"
            Interface "vxlan-0a000131"
                type: vxlan
                options: {df_default="true", in_key=flow, local_ip="11.11.11.11", out_key=flow, remote_ip="11.11.11.31"}

这里的Port就是VxLAN tunnel port,local_ip和remote_ip分别代表了隧道的两端,11.11.11.11就是本端VTEP的IP,而两个remote_ip分别是两个不同的VxLAN隧道的另一端,最简单的理解就是另两个节点机上的VTEP

在进行VxLAN通信时,包到了VTEP,需要根据请求正确地将包送到目的端,必须要找到目的端所在的VTEP先,进而才能进行地址学习和数据通信,比如下图IP包通信

简单说下VM1和VM2通过VxLAN通信流程,整个过程也是需要两个阶段,首先VM1必须知道VM2的MAC地址,然后再进行通信

1.VM1发送ARP请求,咨询 192.168.0.101的MAC地址

2.VTEP1收到了请求之后,开始封装报文,VNI为864,SRC IP为VTEP1的IP,DST IP为多播的UDP报

3.多播包会发送到所有的VTEP上,目的IP地址不在管辖范围之内的,全部丢掉,但是VxLAN表里学习一条对应关系:VM1_MAC,VNI,VTEP1_IP

4.正确的VTEP2收到了包之后,解封装,给VNI为864的虚拟机发送ARP,同时VxLAN表里学习一条对应关系:VM1_MAC,VNI,VTEP1_IP

5.VM2收到了ARP请求,发现是自己,响应请求,发送自己的MAC地址

6.VTEP2收到ARP响应,封装成三层单播包,DST IP为VTEP1的IP,进行路由转发

7.VTEP1收到了包之后,解封装,将包发送给VM1,同时VxLAN表里学习一条对应关系:VM2_MAC,VNI,VTEP2_IP

8.VM1收到了ARP响应,获得了VM2的MAC地址

9.VM1发送IP报文给VM2,S-MAC,D-MAC,S-IP,D-IP

10.VTEP1收到之后,按照要求封装

11.首先,VxLAN header,VNI设置864

12.然后,UDP的DST PORT 4789

13.接着,IP的DST为VTEP2的IP,SRC为VTEP1的IP

14.最后,MAC的DST为VTEP1下一跳的MAC地址,SRC为VTEP1的MAC地址

15.封装好之后,先走到VTEP1的下一跳,进而转发给VTEP2

16.VTEP2根据监听目的端口4789,找到VxLAN的包之后,查看VNI

17.解封完之后,完整的二层包转发给VM2

这里仅仅是同一个VNI之间通信,其它的还有不同VNI下跨网段通信,VxLAN和VLAN之间进行通信,还有涉及到VxLAN网关,可以继续研究

发表评论