VXLAN协议解析

Virtual Extensible LAN虚拟可扩展局域网,采用UDP封装形式。VXLAN是应用最广泛的基于主机的Overlay技术,主机端通过VTEP(Virtual Tunnel EndPoint)实体完成VXLAN的封装解封装等功能。与二层VLAN相似,VXLAN使用VNI来表示一个二层网络,VNI长度为24个bit,可支持16M个不同的网络段,解决了VLAN(4096)容量有限的问题。 VXLAN协议本身并没有定义控制平面,转发信息可通过数据平面流量进行学习。

对于未知单播流量(目的MAC所在VTEP的IP地址未知)或者多播流量,VTEP在进行封装时,设定外层IP头中的目的IP地址为指定IP多播地址,进行发送。
对于已知流量,即学习到(VNI & DMAC)与出口VTEP的IP对应关系的数据帧,在封装时,外层IP头部的目的IP地址使用出口VTEP的IP地址。

为避免未知流量引发的多播,可将(VNI & DMAC <-> 出口VTEP-IP)对应关系存储在中心控制器中(如OpenFlow控制器),发包的VTEP对未知流量可到控制器中查询获取。

VXLAN帧格式

由于VLAN协议将VLAN ID限制在12bit(4096)内,对于当前数据中心来说已然造成瓶颈。并且VLAN不支持VM跨三层网络的移动。新提出的VXLAN协议正为解决VLAN存在的不足。

VXLAN是一种基于主机的Overlay协议,不同于FabricPath或者TRILL等基于网络的Overlay协议,VXLAN不需要在中间核心网络的部署,基于现有网络,VXLAN可部署在服务器上,只需要每个服务器中的VTEP(Virtual Tunnel EndPoint)节点实现VXLAN功能,完成服务器之上的VM虚拟机与外部的通信。对于出方向流量,VTEP将虚拟机的原始数据包封装上VXLAN头,对于入方向,VTEP剥掉VXLAN头部数据。

由以下VXLAN的帧格式可知,VXLAN是一种MAC-in-UDP的数据帧,UDP目的端口号使用4798。

    |----------- VXLAN Encap Header ---------||---------- Original Ethernet packet ----------|
                      
    |----------|--------|---------|----------||------|------|--------|-------|---------------|-----|
    |   Outer  | Outer  |  Outer  |  VXLAN   || DMAC | SMAC | 802.1Q | EType |    PayLoad    | CRC |
    |  MAC Hdr | IP Hdr | UDP Hdr |  Header  ||      |      |        |       |               |     |
    |----------|--------|---------|----------||------|------|--------|-------|---------------|-----|
        14B       20B        8B        8B      
         |                              |               
         |                              |           
         |------>--|                    |----------->---------| 
                   |                                          |            
                   |                                          |         
    |----------|----------|-------|     |-------|----------|--------------------|-------|
    |   Outer  | Optional | Ether |     | VXLAN |          |       VXLAN        | VXLAN |
    |  MAC Hdr | VLAN Hdr | Type  |     | flags | Reserved | Network Identifier | flags |
    |----------|----------|-------|     |-------|----------|--------------------|-------|
        12B         4B       2B            8bit    24bit           24bit           8bit

VXLAN数据转发

如下拓扑,三台服务器S1-S3,分别部署有三个虚拟机VM1-VM3,和三个VTEP接口。三个VTEP同属于一个VXLAN网络,VNI为3001,对此VNI关联了组播地址235.1.1.1。对于广播流量,如ARP,VTEP在VNI对应的多播组内转发流量。如VM1要发起到VM3的访问请求,需要首先获得VM3的IP地址192.168.0.3所对应的MAC地址,于是VM1发送一个ARP请求到VTEP1,VTEP1将添加VXLAN头部信息(如上图所示),其中VNI字段为3001。外部UDP头部信息中的目的端口号为固定的4798,源端口号理论上可为任意值,但是一般情况下会使用对VM1发出的原始数据包头进行hash计算得到的一个端口值,这样对于不同的原始数据包会有不同的源端口值,对支持ECMP的underlay网络,可有助于其根据外层头的五元组信息对数据包选择不同的路径。外层IP头部的源IP地址置为VTEP1的IP地址(10.10.1.1),由于原始数据包的目的MAC地址为广播地址(FF:FF:FF:FF:FF:FF),VTEP1使用组播地址(235.1.1.1)作为目的IP地址。至此,封装好的VXLAN数据包可发送到网络中。

                             /---------------\
                            /                 \
                           |  IP Core Network  |
                            \                 /
                             \---------------/
              /-------------/        |        \------------\
			 /                       |                      \
        S1  /                     S2 |                    S3 \
     +------------+           +------------+          +------------+
     |   VTEP 1   |           |   VTEP 2   |          |   VTEP 3   |
     |  VNI 3001  |           |  VNI 3001  |          |  VNI 3001  |
     | 10.10.1.1  |           | 10.10.2.1  |          | 10.10.3.1  |
     +------------+           +------------+          +------------+
           |                        |                       |
           |                        |                       |
    +--------------+         +--------------+        +--------------+
    |     VM 1     |         |     VM 2     |        |     VM 3     |
    | 192.168.0.1  |         | 192.168.0.2  |        | 192.168.0.3  |
    | 0:0:0:0:0:1  |         | 0:0:0:0:0:2  |        | 0:0:0:0:0:3  |
    +--------------+         +--------------+        +--------------+

由于VTEP2和VTEP3都在235.1.1.1的多播组内,二者都将接收到此VXLAN数据帧。此时,VTEP2和VTEP3将根据此数据包学习到VM1的MAC地址与VTEP1的IP的对应关系,即MAC(0:0:0:0:0:1) <-> VTEP1 IP (10.10.1.1) <-> VNI 3001,表明在VNI:3001虚拟网段中,MAC为(0:0:0:0:0:1)的设备可通过VTEP1(10.10.1.1)访问。VTEP2与VTEP3在解封装去掉VXLAN头部之后,分别将数据包转发到其所服务的网络中。由于此ARP数据包请求的为192.168.0.3的MAC地址,仅VM3对其作出回复。当ARP回复到达VTEP3时,VTEP3根据目的MAC地址(0:0:0:0:0:1)查询对应关系列表,找到可通过VTEP1的IP(10.10.1.1)到达此MAC地址,于是将10.10.1.1作为外部IP头中的目的IP地址,进行转发。由于是单播,仅VTEP1将接收到此回复数据包。VTEP1将由此数据包学习到 VM3的MAC地址(0:0:0:0:0:3)和VTEP3的IP(10.10.3.1)的对应关系。之后VM1与VM3的数据包交互,就可通过单播完成。

可见。基于组播地址235.1.1.1的转发和VM3的ARP回复数据包,致使VTEP1和VTEP3学习到了VM1和VM3的MAC与VTEP IP地址的对应关系。对于组播地址与VNI的对应关系,由于VNI为24bit,其容量有16M大小,而组播地址为224.0.0.0-239.255.255.255网段,有三种分配方案。其一所有的VNI共用一个组播地址,缺点很明显将导致VTEP接收到所有VNI的组播报文,即使其仅支持一个VNI网络;其二每个VNI网络分配一个组播地址,缺点是导致underlay网络维护过多的组播状态;最后一种就是在前两种极端的分配方案之间做平衡。


二层VXLAN网关

以上是针对虚拟机而言的网络,在实际应用中,对于不具有VTEP接口的服务器而言,其将不能够接入到VXLAN网络中。这种情况下,需要一种VXLAN网关设备,来联通这些服务器。VXLAN网关实质上未VTEP的实体化,完成VXLAN网络到传统网络的转换。如下网络拓扑,详情不在累述。

                             /---------------\
                            /                 \
                           |  IP Core Network  |
                            \                 /
                             \---------------/
               /------------/        |        \------------\
              /                      |                      \
         S1  /                    S2 |                       \
      +------------+          +------------+          +------------+
      |   VTEP 1   |          |   VTEP 2   |          |    VXLAN   |
      |  VNI 3001  |          |  VNI 3001  |          |   GATEWAY  |
      | 10.10.1.1  |          | 10.10.2.1  |          |  10.10.4.1 |
      +------------+          +------------+          +------------+
            |                       |                       |
            |                       |                       |
     +--------------+        +--------------+               |              +--------------+
     |     VM 1     |        |     VM 2     |        +--------------+      |   Server 4   |
     | 192.168.0.1  |        | 192.168.0.2  |        |    SWITCH    |------| 192.168.0.40 |
     | 0:0:0:0:0:1  |        | 0:0:0:0:0:2  |        +--------------+      | 0:0:0:0:0:40 |
     +--------------+        +--------------+                              +--------------+

 

VXLAN间三层路由

实际应用中,同一个租户可能需要多个VXLAN网段,而且要求这几个网段直接可以相互连通。本质上VXLAN相当于VLAN网络实现了二层隔离,要达到互通,需要实现类似VLAN间路由的功能,即VXLAN间路由。但是,此路由要局限在同一租户内部,租户之间还是隔离状态。类似于VLAN间通过外部的路由器实现VLAN间路由,VXLAN网络引入三层VXLAN网关来实现VXLAN路由,或者类似于三层交换机,VXLAN网络为VTEP扩展了IRB(Integrated Routing and Bridge)功能,可完成VXLAN间的路由。拓扑如下:

                     +----------------+
                     |  Layer3 VXLAN  |
                     |    GATEWAY     |
                     +----------------+
                      /               \        
	       		     /                 \        
             S1     /                   \ S5  
          +------------+            +------------+
          |   VTEP 1   |            |   VTEP 5   |
          |  VNI 3001  |            |  VNI 3005  |
          | 10.10.1.1  |            | 10.10.3.5  |
          +------------+            +------------+
                |                         |
                |                         |
         +--------------+          +--------------+
         |     VM 1     |          |     VM 5     |
         | 192.168.0.1  |          | 192.168.5.1  |
         | 0:0:0:0:0:1  |          | 0:0:0:0:0:5  |
         +--------------+          +--------------+

以VM1到VM5之间的流量为例,首先由于VM5与VM1不在同一个网段内,VM1将访问VM5的流量发送到三层VXLAN网关,L3网关根据数据包内容,学习到(源VNI、SMAC)与源VTEP IP地址的对应关系。接着根据源VNI找到为租户预先配置的VRF-ID(Virtual Routing and Forwarding ID),确认其三层转发信息表FIB,以数据包内层的IP头部的目的IP地址查表,找到对应的目的VNI(3005)和目的MAC地址(0.0.0.0.0.5)。最后使用目的VNI与目的MAC地址查询二层转发表,得到目的VTEP的IP地址(10.10.3.5)。得到所有信息之后,将数据包的内层MAC头部的目的MAC地址换成刚刚查询到的目的MAC地址,将源MAC地址替换为L3网关的MAC地址。IP头部的TTL值减一。对于VXLAN头部,VNI字段替换为查询到的目的VNI值,外层IP头部的目的IP替换为查询到的目的VTEP的IP地址(VTEP 5 - 10.10.3.5),源IP地址替换为L3网关的IP地址。最终数据包通过VTEP5到达VM5。VM5的回复流量沿着相同路径返回,过程类似。

VXLAN的移动性

如下图拓扑,将VTEP1下的VM1迁移到VTEP3的网络中。此处的迁移操作是在VM1的工作状态中进行的,所以S1,S2和S3的binding表中在迁移之前已经学习到了VM1的位置信息,即VM1的MAC地址(0.0.0.0.0.1)通过VTEP1(IP-10.10.1.1)可达。VM1在迁移之后,此信息需要马上进行更新,以保证到达VM1的数据流的连续。

                             /---------------\
                            /                 \
                           |  IP Core Network  |
                            \                 /
                             \---------------/
              /-------------/        |        \------------\
             /                       |                      \
        S1  /                     S2 |                    S3 \
     +------------+           +------------+          +------------+
     |   VTEP 1   |           |   VTEP 2   |          |   VTEP 3   |
     |  VNI 3001  |           |  VNI 3001  |          |  VNI 3001  |
     | 10.10.1.1  |           | 10.10.2.1  |          | 10.10.3.1  |
     +------------+           +------------+          +------------+
           |                        |                /      |
           |                        |               /       |
    +--------------+         +--------------+      / +--------------+
    |     VM 1     |         |     VM 2     |     /  |     VM 3     |
    | 192.168.0.1  |         | 192.168.0.2  |    |   | 192.168.0.3  |
    | 0:0:0:0:0:1  |\        | 0:0:0:0:0:2  |    |   | 0:0:0:0:0:3  |
    +--------------+ \       +--------------+    |   +--------------+
                      \------>----->------>------|

VM1由S1迁移到S3网络中,S3在感知到VM1的迁移事件之后,S3之上的虚拟交换机负责代替VM1发送反向ARP报文,或者免费ARP来刷新VXLAN网络中其它的VTEP节点中已过时的VM1位置绑定信息。Cisco的Nexus 1000V和VMware vsphere分布式交换机广播RARP,微软的Hyper-V发送GARP。以反向ARP为例,其目的MAC为广播地址(ff:ff:ff:ff:ff:ff),源MAC地址为VM1的MAC地址,VTEP3增加VXLAN头部信息,将外部IP头部信息中的源IP设置为VTEP3自身的IP地址10.10.3.1,目的IP设置为组播地址。VXLAN网络中的其它VTEP节点,收到此数据包之后,将会更新VM1的位置信息到VTEP3的IP地址(10.10.3.1)。

VXLAN组播

此处的组播并非VXLAN网络中与VNI对应的用来转发未知流量的组播,而是VXLAN所服务网段内的组播流量。如下拓扑所示,VM1与VM2加入了同一个多播组G1。当VM1向网络中发送组播流量时,L3网关在接收到VXLAN封装的组播流量时,默认情况下将向所有配置的VNI转发此组播流量,在每个具体的VNI中转发时VXLAN封装头部的外层目的IP地址使用此VNI指定的组播地址,这就产生一个问题,要求每个VNI对应一个唯一的组播地址。如果开启了IGMP Snooping功能,L3网关检测到VTEP5网络中并没有注册监听此组播G1流量的主机时,将不转发流量到S5。

                     +----------------+
                     |  Layer3 VXLAN  |
                     |    GATEWAY     |
                     +----------------+
                    /        |        \        
             /-----/         |         \------\        
         S1 /             S2 |                 \ S5  
    +------------+     +------------+     +------------+
    |   VTEP 1   |     |   VTEP 2   |     |   VTEP 5   |
    |  VNI 3001  |     |  VNI 3002  |     |  VNI 3005  |
    | 10.10.1.1  |     | 10.10.2.1  |     | 10.10.3.5  |
    +------------+     +------------+     +------------+
          |                  |                  |
          |                  |                  |
   +--------------+   +--------------+   +--------------+
   |     VM 1     |   |     VM 2     |   |     VM 5     |
   | 192.168.0.1  |   | 192.168.0.2  |   | 192.168.5.1  |
   | 0:0:0:0:0:1  |   | 0:0:0:0:0:2  |   | 0:0:0:0:0:5  |
   +--------------+   +--------------+   +--------------+

VXLAN控制平面

VXLAN基于数据流量的Flooding Learning功能来学习网络中的拓扑,此基于组播而实现。另外VXLAN可采用Ingress Replication或者称为Head-End Replication来实现单播取代多播转发,当一个未知流量的原始数据包到达VTEP节点时,VTEP节点将数据包复制若干份,通过单播形式发送到VXLAN网络中的所有VTEP节点,达到之前组播的效果。前提是存在一个集中控制器如Openflow控制器来存储某个VNI内所有的VTEP节点信息,可由支持VTEP节点的Openvswitch或者思科的Nexus 1000V虚拟交换机将节点信息上报给集中控制器。VTEP节点在转发时,可到集中控制器查询指定VNI中的VTEP的节点信息(IP地址),为了提高效率,VTEP节点可以缓存查询的结果,不过这将需要和集中控制器进行同步更新,避免缓存信息失效。此种单播方式的数据包复制操作将给VTEP节点带来非常大的压力。

另外使用BGP EVPN协议作为VXLAN的控制层面协议,在网络中发布VTEP节点相关信息和虚拟机绑定信息,在实际网络中使用广泛。

完。

你可能感兴趣的:(网络虚拟化)