本文大量介绍及定义是参考 RFC 7348 中的内容,精简了一些并翻译

摘要


VXLAN 全称 Virtual eXtensible Local Area Network (VXLAN) ,是一个架设在 3 层网络上的虚拟 2 层网络,用于解决多个租户在虚拟化数据中心内对 overlay 网络的需求,用于云服务提供商和企业数据中心的网络中。

  1. Virtual eXtensible Local Area Network(VXLAN), which is used to address the need for overlay networks within virtualized data centers accommodating multiple tenants.
  2. The scheme and the related protocols can be used in networks for cloud service providers and enterprise data centers.

1. 介绍


在物理设施上服务虚拟化的需求越来越重要。 一台物理服务器上的虚拟机可以有自己的mac地址。 大量虚拟机之间的通信以及与交换机之间的连接会消耗以太网上交换机大量的mac地址映射。

如果数据中心的虚拟机放到各自的vlan中,vlan的数量也会大大增加,甚至需要好几千个,当前的vlan数量限制为4094,肯定是不足的。

数据中心又要求服务多租户,每一个都要求隔离网络,使用物理设施隔离太烧钱,所以网络管理员可以想办法在共享网络上隔离出虚拟网络来。 在这个场景下,普遍会遇到mac地址和vlan id之间的绑定多用户之间是冲突的。

对于2层物理网络的虚拟环境来说,一个重要的需求是数据中心甚至跨数据中心的二层网络可扩展,以便于计算、网络和存储资源的分配。 这样的网络下,传统的生成树协议下的回环拓扑结构会导致大量的不可用连接。

最后一个场景是用户更喜欢用IP协议来做物理设备之间的连接(比如,为了防止物理链路出现问题,并充分利用多条线路来提升性能,使用Equal-Cost Multipath(ECMP)来实现多路径扩展)。

以上场景引起了overlay 网络的需求,VXLAN 用于以封装的格式在逻辑 “隧道 “上传输二层流量。

1.1 缩写及定义


ACL Access Control List

ECMP Equal-Cost Multipath

IGMP Internet Group Management Protocol

IHL Internet Header Length

MTU Maximum Transmission Unit

PIM Protocol Independent Multicast

SPB Shortest Path Bridging

STP Spanning Tree Protocol

ToR Top of Rack

TRILL Transparent Interconnection of Lots of Links

VLAN Virtual Local Area Network

VM Virtual Machine

VNI VXLAN Network Identifier (or VXLAN Segment ID)

VTEP VXLAN Tunnel End Point. An entity that originates and/or
terminates VXLAN tunnels

VXLAN Virtual eXtensible Local Area Network

VXLAN Segment
VXLAN Layer 2 overlay network over which VMs communicate

VXLAN Gateway
an entity that forwards traffic between VXLANs

3. VXLAN 问题描述


本节提供更多关于VXLAN方面的细节,关注点在数据中心的网络设施和相关问题上。

3.1 生成树导致的限制和VLAN的范围

当前二层网络使用 IEEE 802.1D 生成树协议(STP)去避免可选多路径引起的网络回环。STP 会放弃使用某些链路来避免数据帧的重复拷贝和回环。一些网络中心操作员会觉得在使用 STP 的情况下设备空闲是一种资源浪费。而且 STP 引起的部分链路不可用还会影响故障恢复。不过最近有一些新进展,比如 TRILL 协议(RFC6325)和 SPB 被提出,用来规避 STP 引起的一些问题。STP 限制也可以通过以下方式避免,将机架中的服务器配置为位于同一第3层网络上,在机架内和机架之间的切换是在三层进行的。但这对于依赖二层进行通信的 VM 不相容。

数据中心二层网络的一个关键特性是使用虚拟局域网来隔绝广播域,以太帧中12比特的VLAN ID用来将二层网络隔离为多个广播域。即使最多只能有4094个,VLAN事实上已经服务了很多的数据中心。随着虚拟化的增长,这个限制已经快不能满足需求了。此外,STP的存在也限制了VLAN可用数。虚拟化基础上的多租户环境加速了更大数量VLAN的需求。

3.2 多租户环境

云计算给多租户环境提供了按需弹性资源供给。最典型的案例就是云服务商在一套物理设施上给多客户或多用户提供弹性服务。

一个租户网络流量的独立性可以通过二层或者三层网络来解决。对于二层网络有 VLANs 来隔离流量 – 比如一个租户直接由 VLAN 来区分。不过因为租户的数量太多,4094个 VLAN 常常不够用。而且还有每个租户需要多个 VLAN 的情况。采用 VLAN 的虚拟网络环境,不存在 overlay 网络,只有 underlay 网络。也就是说 虚拟机的 VLAN 数据包直接在物理网络上传输,和物理网络上的 VLAN 数据包融合在一起,这样的好处是虚拟机能直接访问到物理网络的设备,但坏处也很明显,虚拟网络无法打破物理网络的界限,具体表现在虚拟机的部署和迁移不太灵活。

另一个相关问题就是跨 pod (cross-pod) 扩展,一个 pod 一般包括一到多个附带着网络和存储的服务器。租客可能开始只用一个pod ,随着扩展,可能开始需要其他 pod 上的 server/VM ,而其他 pod 上的资源通常并不能很好被充分使用。这个场景就需要可以动态扩展的二层网络了。注:与 k8s 中的 pod 并不是同一概念。

三层网络来隔绝多租户流量也不复杂。两个租户在各自的环境可能会用到相同的ip地址,这样就需要云服务提供商来用一些其他的形式来隔绝地址了。此外,这要求所有租户内部虚机通信是使用ip而不是直接依赖2层协议或者其他非ip三层协议。

3.3 ToR交换机上的 MAC 表限制

目前虚拟化环境对连接服务器的接入交换机的mac地址表也有要求。多租户环境下不再是一个mac地址对应一个服务器了,接入交换机会学习大量虚机的mac地址(每个服务器上可能有数百个)。这是因为虚机到物理网路上的流量是复用服务器跟交换机之间链路的。一个典型的接入交换机连接服务器端口的数目为24或者48个。数据中心则可能由多个接入交换机组成,每个交换机需要维持一份地址表以提供跨物理服务器的虚机通信。虚拟化环境对地址表大小需求远大于非虚拟化环境。

华为交换机 S5700 mac 表承载容量为 90000 左右,数据中心交换机 CE6870 750000

如果接入交换机的mac地址表满了,交换机可能会停止学习新地址直到有地址项过期,这样会导致超出mac地址表的帧大量洪泛。

4. VXLAN


VXLAN(虚拟扩展局域网)用来处理上述多租户多虚机环境下2,3层网络的需求。VXLAN跑在现有的网络设备上并虚拟出一个更大的2层网络。也就是,VXLAN是一个在3层网络上构建的 overlay 网络。每个 overlay 网络都被称为VXLAN段。只有在同一个VXLAN段的虚机之间才能够通信。每个VXLAN段都使用一个24 bit 段ID来标识,术语为“VXLAN Network Identifier(VNI)”。24 bit 的ID使得有1600万+的VXLAN段能同时存在同一个管理网络中。

VNI同时也决定了内部虚机的mac帧的范围。因此不同的VXLAN段之间可以有相同的mac地址,却不会有流量互串的情况。VNI作为头部封装了来自虚机的mac帧。下面的章节中,VXLAN段**(VXLAN segment)VXLAN overlay 网络(**VXLAN overlay network)是相同的意思。

因为有封装,VXLAN也可以称为隧道方法,这个隧道是构建在3层网络上的 overlay 2层网络。这些通道是无状态的,因此每个帧是按照一系列规则来封装的。下面章节讨论的隧道终端(VXLAN隧道终端或者叫VTEP)是位于虚拟机宿主服务器上的。

因此VXLAN协议里的VNI、隧道以及外层头部封装只有VTEP才知道,虚机是看不到封装的(见图1)。注意VTEP也可以以硬件交换机的形式存在。

下面的章节讨论了VXLAN环境的典型流量场景,该VXLAN环境的控制方法是通过学习数据平面的来达成的。虚机的mac地址和VTEP的IP地址的映射关系会因为源地址学习被记录下来。而未知目的地址、广播、多播帧则会使用多播协议来承载。

除了基于学习的控制平面,也有其他方法来让虚机mac地址和VTEP的IP地址映射信息分发下去。可能的方法包括VTEP来查找鉴权中心或者目录中心(central authority-/directory-based),以及鉴权中心主动分发这些信息导VTEP上。有时候这两种方法也被称为推送和拉取模型。本文档主要关注在VXLAN中学习数据平面信息作为控制平面的方法。

4.1 虚拟机间单播

如果一个虚机是在VXLAN overlay 网络中,那这个虚机是感知不到VXLAN存在的。如果这个虚机要跟不同宿主机上的虚机通信,只需要跟非虚拟机环境一样发送一个到目标的mac帧。通过宿主机上的VTEP来查找目的虚机相关联的VNI。这个决定了两个虚机是否处于同一个VXLAN段,如果相同再看是否有虚机mac地址对应的VTEP的IP地址。如果有,则外层mac地址、外ip头部和VXLAN头部一起作为头部追加到虚机产生的mac帧上,这个封装好的包被发往目的VTEP。对端的VTEP拿到包后验证VNI合法性并检查是否有内部虚机能匹配上VNI和mac地址。如果匹配上则拿掉这个封装的头部并发送给目的虚拟机。目的虚拟机不会知道VNI以及帧是从VXLAN封装发送过来的。

除了把包发送到目的虚机,远程VTEP还会学习源mac地址和外层源IP地址的映射关系。这个映射关系被存储在表里,随后目标虚机发送返回包的时候就可以查到该映射信息,就不会有返回包目的地址未知导致洪泛的情况发生。

除了广播情况外,单播与非VXLAN环境相同,目标虚机的mac地址是在发送前就决定好的。广播帧被封装在多播包里,具体见下一节。

4.2 映射到多播的广播

如果有一个虚机想要使用IP协议来与目的虚机通信,假设两个虚机在同一个子网,虚机会发送一个 ARP 广播包,在非 VXLAN 情况下,这个帧会经过交换机发送到同一VLAN的主机。

在VXLAN环境下,VNI和IP头部和UDP头部一起插入在包首。不过这个包被发往这个 VNI overlay 网络所在的IP多播组中。

为了更高效,我们需要有一个VNI和IP多播组的映射。这个映射在管理层通过管理通道已经提供给各VTEP了。使用这个映射,VTEP就可以提供给多播交换机或路由器IGMP成员报告,就可以实现VXLAN对应的多播组的加入和离开。使用特定的多播地址来确定主机上某个成员是否可用来达到剪枝的目的(见RFC4541)。此外,多播路由协议的使用可以提供高效的三层多播树,比如PIM-SM(见RFC4601)。注:这一段没太懂。。。不知如何翻译。

To effect this, we need to have a mapping between the VXLAN VNI and the IP multicast group that it will use. This mapping is done at the management layer and provided to the individual VTEPs through a management channel. Using this mapping, the VTEP can provide IGMP membership reports to the upstream switch/router to join/leave the VXLAN-related IP multicast groups as needed. This will enable pruning of the leaf nodes for specific multicast traffic addresses based on whether a member is available on this host using the specific multicast address (see [RFC4541]). In addition, use of multicast routing protocols like Protocol Independent Multicast - Sparse Mode (PIM-SM see [RFC4601]) will provide efficient multicast trees within the Layer 3 network.

VTEP发送组播信息(*,G)来加入一个组播。随着虚机在不同宿主机上的启/停,大量VXLAN隧道主机会改变,需要组播信息来更新组。另外,因为每个VTEP可以同时是多播包的源和目的,BIDIR-PIM(RFC5015)等类似的双向协议会让组播协议更高效。

目的虚机会返回一个标准ARP回复。这个帧会被VTEP使用VXLAN封装好以IP单播发送回去,因为ARP请求来的时候相关的mac地址、VTEP的IP地址已经学习过了。
需要注意的是除了广播帧外,多播帧和目的mac地址未确定的帧也会使用多播协议来发送。

4.3 物理设备要求

如果基础网络设施上IP多播被使用,那网络內每个交换机和路由器都可以使用多播路由协议如PIM-SM。这些协议可以建立更高效的多播树使多播包只发送到需要接收的主机上。

类似一点,虚机间真实网络连接并不一定需要三层网络:VXLAN也可以工作在二层网络。不管什么情况,二层网络中更高效的多播复制可以通过IGMP窥探来实现。注:指两个虚拟机间连接不一定需要三层网络,并不是 VTEP。

VTEP 绝对不可以对VXLAN包进行分段。中间路由器可能会对VXLAN封装比较大的包进行分段。目的VTEP可以丢弃这样的VXLAN分段。为了保证流量传递中不发生分段,建议物理网络的MTUs设置成可以容纳更大帧的大小。有些技术比如路径MTU发现(见RFC1191RFC1981)可以用来满足这样的需求。

5. VXLAN 帧格式


下面字段内容,并不做翻译,便于对应抓包数据分析。

下面是VXLAN帧格式。从里往外解析 – 在外层帧校验序列上面,有内层mac帧,帧內包括有负载和帧头部,头部包括原始VLAN信息、以太类型、源和目的mac地址。

内层mac帧被下面四个头部给封装(同样从里往外):

VXLAN Header: This is an 8-byte field that has:

  • Flags (8 bits) : 合法的 VNI 的 I 标志必须设置为1。其他7比特(R标志)是在传输中是保留并必须设置为0的,并且被对端忽略。
  • VXLAN Segment ID/VXLAN Network Identifier (VNI) (24 bits): 指定了单个VXLAN overlay网络,也就是虚机所在的VXLAN网络。不同VXLAN overlay 网络的虚机不能互相通信。
  • Reserved fields (24 bits and 8 bits): 传输时必须设置为0,接收时忽略。


Outer UDP Header: 外层UDP头部包括VTEP提供的源端口和已知的UDP目的端口。

  • Destination Port: IANA已经给VXLAN分配了4789端口,协议实现者应该使用这个端口作为默认端口。早些的VXLAN实现可能用过其他的目的端口。为了让不同实现的互通性,目的端口应该是可以配置的。
  • Source Port: 建议源端口是由内层包的某些字段做哈希得到的 – 比如使用内层以太帧头部来做哈希。这是为了允许虚机间等价多路径/负载均衡的熵级别。用这个方法计算UDP源端口号的时候,建议这个值在49152-65535这个动态/私有端口范围内(见RFC6335)。
  • UDP Checksum: 应该以0来传输。当一个包接收时的UDP校验和为0,必须解封装。可选的是,如果封装终端在此字段写入一个非0的UDP校验和,那这个值必须是对IP头、UDP头、VXLAN头和封装的mac帧正确的计算结果。对端收到这个包发现是非0的校验和,可以自行选择去验证这个校验和。如果验证失败那么这个包必须被丢弃。如果对端不去验证或者验证正确,那这个包必须被解封装。


Outer IP Header:
源IP地址就是虚机(内层mac地址的虚机)相连的VTEP的IP地址。目的IP地址可能是单播或者多播地址(见 4.1 4.2)。如果是单播地址,就是内层目的mac地址关联的VTEP的IP地址。如果是多播地址,见 4.2 中的场景。

Outer Ethernet Header (example):
图1是外层以太帧+IP+UDP+VXLAN+内层以太帧的示例。外层mac地址可能是VTEP的mac地址,或者是一个3层路由的mac地址。外层VLAN标签是可选项,如果有值则表示这是LAN上的VXLAN流量。

  1. 0 1 2 3
  2. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  3. Outer Ethernet Header:
  4. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  5. | Outer Destination MAC Address |
  6. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7. | Outer Destination MAC Address | Outer Source MAC Address |
  8. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  9. | Outer Source MAC Address |
  10. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  11. |OptnlEthtype = C-Tag 802.1Q | Outer.VLAN Tag Information |
  12. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  13. | Ethertype = 0x0800 |
  14. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  15. Outer IPv4 Header:
  16. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  17. |Version| IHL |Type of Service| Total Length |
  18. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  19. | Identification |Flags| Fragment Offset |
  20. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  21. | Time to Live |Protocl=17(UDP)| Header Checksum |
  22. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  23. | Outer Source IPv4 Address |
  24. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  25. | Outer Destination IPv4 Address |
  26. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  27. Outer UDP Header:
  28. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  29. | Source Port | Dest Port = VXLAN Port |
  30. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  31. | UDP Length | UDP Checksum |
  32. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  33. VXLAN Header:
  34. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  35. |R|R|R|R|I|R|R|R| Reserved |
  36. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  37. | VXLAN Network Identifier (VNI) | Reserved |
  38. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  39. Inner Ethernet Header:
  40. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  41. | Inner Destination MAC Address |
  42. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  43. | Inner Destination MAC Address | Inner Source MAC Address |
  44. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  45. | Inner Source MAC Address |
  46. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  47. |OptnlEthtype = C-Tag 802.1Q | Inner.VLAN Tag Information |
  48. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  49. Payload:
  50. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  51. | Ethertype of Original Payload | |
  52. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
  53. | Original Ethernet Payload |
  54. | |
  55. |(Note that the original Ethernet Frame's FCS is not included) |
  56. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  57. Frame Check Sequence:
  58. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  59. | New FCS (Frame Check Sequence) for Outer Ethernet Frame |
  60. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 1: VXLAN Frame Format with IPv4 Outer Header

上面图1的帧格式展示了使用IPv4作为传输的以太帧隧道。IPv6的VXLAN详情在下图显示。

  1. Outer Ethernet Header:
  2. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  3. | Outer Destination MAC Address |
  4. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  5. | Outer Destination MAC Address | Outer Source MAC Address |
  6. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7. | Outer Source MAC Address |
  8. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  9. |OptnlEthtype = C-Tag 802.1Q | Outer.VLAN Tag Information |
  10. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  11. | Ethertype = 0x86DD |
  12. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  13. Outer IPv6 Header:
  14. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  15. |Version| Traffic Class | Flow Label |
  16. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  17. | Payload Length | NxtHdr=17(UDP)| Hop Limit |
  18. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  19. | |
  20. + +
  21. | |
  22. + Outer Source IPv6 Address +
  23. | |
  24. + +
  25. | |
  26. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  27. | |
  28. + +
  29. | |
  30. + Outer Destination IPv6 Address +
  31. | |
  32. + +
  33. | |
  34. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  35. Outer UDP Header:
  36. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  37. | Source Port | Dest Port = VXLAN Port |
  38. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  39. | UDP Length | UDP Checksum |
  40. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  41. VXLAN Header:
  42. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  43. |R|R|R|R|I|R|R|R| Reserved |
  44. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  45. | VXLAN Network Identifier (VNI) | Reserved |
  46. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  47. Inner Ethernet Header:
  48. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  49. | Inner Destination MAC Address |
  50. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  51. | Inner Destination MAC Address | Inner Source MAC Address |
  52. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  53. | Inner Source MAC Address |
  54. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  55. |OptnlEthtype = C-Tag 802.1Q | Inner.VLAN Tag Information |
  56. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  57. Payload:
  58. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  59. | Ethertype of Original Payload | |
  60. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
  61. | Original Ethernet Payload |
  62. | |
  63. |(Note that the original Ethernet Frame's FCS is not included) |
  64. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  65. Frame Check Sequence:
  66. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  67. | New FCS (Frame Check Sequence) for Outer Ethernet Frame |
  68. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 2: VXLAN Frame Format with IPv6 Outer Header

6. VXLAN 部署场景


VXLAN通常部署在虚拟主机上的数据中心中,可能会分散在多个设备上。每个交换机既可能是不同的3层网络也可能在一个2层网络上。The VXLAN segments/overlay networks are overlaid on top of these Layer 2 or Layer 3 networks. VXLAN 网段/overlay 在这些第二层或第三层网络之上。
图3 中显示了三层网络环境下的两个可虚拟化服务器。两个服务器是同一交换交换机下还是不同还是跨机房都是不一定的。下面环境中有4个VXLAN段,VNI分别是22,34,74和98。假设server 1上的VM1-1和 server 2上的VM2-4在环境VNI 22上。虚机发出的包是经过封装和解封装并且是 server 1和 server 2上的VTEP完成的,不过虚机感知不到这些。server 1上的VM1-2和 server 2上的VM2-1在VNI 34上;server 1上VM1-3和 server 2上VM2-2在环境VNI 74;server 1上VM1-4和 server 2上VM2-3在环境VNI 98上。

  1. +------------+-------------+
  2. | Server 1 |
  3. | +----+----+ +----+----+ |
  4. | |VM1-1 | |VM1-2 | |
  5. | |VNI 22 | |VNI 34 | |
  6. | | | | | |
  7. | +---------+ +---------+ |
  8. | |
  9. | +----+----+ +----+----+ |
  10. | |VM1-3 | |VM1-4 | |
  11. | |VNI 74 | |VNI 98 | |
  12. | | | | | |
  13. | +---------+ +---------+ |
  14. | Hypervisor VTEP (IP1) |
  15. +--------------------------+
  16. |
  17. |
  18. |
  19. | +-------------+
  20. | | Layer 3 |
  21. |---| Network |
  22. | |
  23. +-------------+
  24. |
  25. |
  26. +-----------+
  27. |
  28. |
  29. +------------+-------------+
  30. | Server 2 |
  31. | +----+----+ +----+----+ |
  32. | |VM2-1 | |VM2-2 | |
  33. | |VNI 34 | |VNI 74 | |
  34. | | | | | |
  35. | +---------+ +---------+ |
  36. | |
  37. | +----+----+ +----+----+ |
  38. | |VM2-3 | |VM2-4 | |
  39. | |VNI 98 | |VNI 22 | |
  40. | | | | | |
  41. | +---------+ +---------+ |
  42. | Hypervisor VTEP (IP2) |
  43. +--------------------------+

Figure 3: VXLAN Deployment - VTEPs across a Layer 3 Network

除了上面的服务器作为VTEP的部署方法外,还有实现了VXLAN协议的物理服务器作为VTEP的方法。另一个场景是VXLAN overlay 网络的节点需要与其他不同网络类型的节点通信,比如VLAN网络。这些节点可能是虚机或实体机。为了支持这种通信,部署环境里可以加上VXLAN网关(见图4的交换机作为VXLAN网关)用来转发VXLAN和非VXLAN的流量。

图4的交换机符合下面的规则。对于从VXLAN口的进来的帧,网关去除VXLAN头部并发往内部以太帧目的mac地址相连的物理端口。如果没有配置trunk,解封装的帧如果带有VLAN ID应该被丢弃。从非VXLAN口进来的帧需要根据VLAN ID对应到一个特定的VXLAN网络。除非有显示的配置,不然VLAN ID在封包前需要移除。

这些提供了VXLAN边界功能的网关可能是接入交换机或者是数据中心拓扑种更上层的交换机,比如核心交换甚至WAN边界设备。WAN边界设备可以有提供者边界(PE)路由在一个多云环境里中提供VXLAN边界。不管哪种,网关功能可以被硬件或者软件实现。

  1. +---+-----+---+ +---+-----+---+
  2. | Server 1 | | Non-VXLAN |
  3. (VXLAN enabled)<-----+ +---->| server |
  4. +-------------+ | | +-------------+
  5. | |
  6. +---+-----+---+ | | +---+-----+---+
  7. |Server 2 | | | | Non-VXLAN |
  8. (VXLAN enabled)<-----+ +---+-----+---+ +---->| server |
  9. +-------------+ | |Switch acting| | +-------------+
  10. |---| as VXLAN |-----|
  11. +---+-----+---+ | | Gateway |
  12. | Server 3 | | +-------------+
  13. (VXLAN enabled)<-----+
  14. +-------------+ |
  15. |
  16. +---+-----+---+ |
  17. | Server 4 | |
  18. (VXLAN enabled)<-----+
  19. +-------------+

Figure 4: VXLAN Deployment - VXLAN Gateway

6.1 内部 VLAN id 处理

VTEP和VXLAN网关的内部VLAN标签处理应当遵守以下约定:

Decapsulated VXLAN frames with the inner VLAN tag SHOULD be discarded
unless configured otherwise. On the encapsulation side, a VTEP
SHOULD NOT include an inner VLAN tag on tunnel packets unless
configured otherwise. When a VLAN-tagged packet is a candidate for
VXLAN tunneling, the encapsulating VTEP SHOULD strip the VLAN tag
unless configured otherwise.

7. 安全性


传统的2层网络只有可能被“内部”的流氓节点攻击 – 要么通过伪造包取代mac帧的方法来访问一个LAN并窥探流量。要么利用洪泛来导致拒绝服务(DoS)。MAC利用IP协议来传递流量的机制大大的拓宽了攻击范围。通过订阅一到多个携带者VXLAN段广播流量的多播组来实现注入。或者通过伪造UDP上的MAC帧来注入伪造流量,是有可能劫持mac地址的。

本文不会讨论防止此类IP层上而非其他传统机制攻击的方法,只会简单描述一些VXLAN环境下可能的安全方法。

传统伪节点2层网络攻击的风险能够通过限制部署和管理虚机及网关的管理员范围来减小。此外,这种管理方法可以通过配置类似于802.1X的方法来控制每个节点的访问。基于UDP封装的VXLAN允许物理交换机的配置和5元组ACL(访问控制列表)的使用也能控制一部分。

VXLAN overlay 网络是设计运行在已有的LAN基础环境上的。为了保证VXLAN节点和VTEP在LAN上是经过认证的,建议这个设计给VXLAN流量和VTEP的VLAN提供一种安全方法。

而且,VXLAN要求VNI和虚机成员有合适的映射。同样建议有一个的安全机制来保证VTEP上的管理通道的通信。

8. IANA 意见


UDP端口(4789)已经被IANA分配给VXLAN用于服务名和传输层协议端口号了。看第5节关于端口号的讨论。

以下略,见原文。

参考