VXLAN 全称是 Virtual eXtensible Local Area Network,虚拟可扩展的局域网。它是一种 overlay 技术,通过三层的网络来搭建虚拟的二层网络。rfc7348 (参考资料1) 上的介绍是这样的:A framework for overlaying virtualized layer 2 networks over lay 3 networks.
虚拟化(虚拟机和容器)的兴起使得一个数据中心会有成千上万的机器需要通信,而传统的 VLAN 技术只能支持 4096 个网络上限,已经满足不了不断扩展的数据中心规模。越来越多的数据中心(尤其是公有云服务)需要提供多租户的功能,不同用户之间需要独立地分配 ip 和 MAC 地址,如何保证这个功能的扩展性和正确性也是一个待解决的问题
云计算业务对业务灵活性要求很高,虚拟机可能会大规模迁移,并保证网络一直可用,也就是大二层的概念。解决这个问题同时保证二层的广播域不会过分扩大,也是云计算网络的要求。
vxlan 这类隧道网络的一个特点是对原有的网络架构影响小,原来的网络不需要做任何改动,在原来网络基础上架设一层新的网络。
下面这张图 是 vxlan 的工作模型,它创建在原来的 IP 网络(三层)上,只要是三层可达(能够通过 IP 互相通信)的网络就能部署 vxlan。在每个端点上都有一个 vtep 负责 vxlan 协议报文的封包和解包,也就是在虚拟报文上封装 vtep 通信的报文头部。物理网络上可以创建多个 vxlan 网络,这些 vxlan 网络可以认为是一个隧道,不同节点的虚拟机能够通过隧道直连。每个 vxlan 网络由唯一的 VNI 标识,不同的 vxlan 可以不相互影响。
VTEP(VXLAN Tunnel Endpoints):
vxlan 网络的边缘设备,用来进行 vxlan 报文的处理(封包和解包)。用于对VXLAN报文进行封装/解封装,包括ARP请求报文和正常的VXLAN数据报文,在一段封装报文后通过隧道向另一端VTEP发送封装报文,另一端VTEP接收到封装的报文解封装后根据封装的MAC地址进行装法。VTEP可由支持VXLAN的硬件设备或软件来实现。vtep 可以是网络设备(比如交换机),也可以是一台机器(比如虚拟化集群中的宿主机)。
VNI(VXLAN Network Identifier):
VNI 是每个 vxlan 的标识,是个 24 位整数,一共有 2^24 = 16,777,216(一千多万),一般每个 VNI 对应一个租户,也就是说使用 vxlan 搭建的公有云可以理论上可以支撑千万级别的租户。
Tunnel:
隧道是一个逻辑上的概念,在 vxlan 模型中并没有具体的物理实体想对应。隧道可以看做是一种虚拟通道,vxlan 通信双方(图中的虚拟机)认为自己是在直接通信,并不知道底层网络的存在。从整体来说,每个 vxlan 网络像是为通信的虚拟机搭建了一个单独的通信通道,也就是隧道。
NVE:
network virtualiztion edge ,能够进行vxlan数据报文封装和解封装的实体物理设备或者软件都可称作NVE。
BD:
bridge domain ,vxlan转发二层数据报文的广播域,是承载vxlan数据报文的实体。
VBDIF:
类似于vlan interface,是基于BD创建的三层接口,给vxlan网络提供三层网关,实现不同vxlan之间的路由,以及实现vxlan和非vxlan之间的通信和外部网络的通信。
下图是 vxlan 协议的报文,白色的部分是虚拟机发送报文(二层帧,包含了 MAC 头部、IP 头部和传输层头部的报文),前面加了 vxlan 头部用来专门保存 vxlan 相关的内容,在前面是标准的 UDP 协议头部(UDP 头部、IP 头部和 MAC 头部)用来在底层网路上传输报文。
0 1 2 3
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
Outer Ethernet Header:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Outer Destination MAC Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Outer Destination MAC Address | Outer Source MAC Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Outer Source MAC Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|OptnlEthtype = C-Tag 802.1Q | Outer.VLAN Tag Information |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ethertype = 0x0800 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Outer IPv4 Header:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live |Protocl=17(UDP)| Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Outer Source IPv4 Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Outer Destination IPv4 Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Outer UDP Header:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Dest Port = VXLAN Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| UDP Length | UDP Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
VXLAN Header:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|R|R|R|I|R|R|R| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| VXLAN Network Identifier (VNI) | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Inner Ethernet Header:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Inner Destination MAC Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Inner Destination MAC Address | Inner Source MAC Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Inner Source MAC Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|OptnlEthtype = C-Tag 802.1Q | Inner.VLAN Tag Information |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Payload:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ethertype of Original Payload | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Original Ethernet Payload |
| |
|(Note that the original Ethernet Frame's FCS is not included) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
最外层的 UDP 协议报文用来在底层网络上传输,也就是 vtep 之间互相通信的基础。
中间是 VXLAN 头部,vtep 接受到报文之后,去除前面的 UDP 协议部分,根据这部分来处理 vxlan 的逻辑,主要是根据 VNI 发送到最终的虚拟机。
最里面是原始的报文,也就是虚拟机看到的报文内容。
报文各个部分的意义如下:
字段 | 含义 |
---|---|
VXLAN header(8B) | |
VXLAN flags | 标志位 |
Reserved | 保留位 |
VNID | 24 位的 VNI 字段 |
Reserved | 保留字段 |
UDP 头部(8B) | |
DestPort(VXLAN Port) | 4789 |
IP 头部(20B) | |
Protocol | 0x11(UDP) |
Sip | 接口IP |
Dip | 目的VTEP的接口IP或者多播IP |
MAC 头部(14B) | |
源MAC | 主机MAC |
目的MAC | 下一跳设备MAC |
vxlan 协议比原始报文多 50 字节的内容,这会降低网络链路传输有效数据的比例。vxlan 头部最重要的是 VNID 字段,其他的保留字段主要是为了未来的扩展,目前留给不同的厂商用这些字段添加自己的功能。
虚拟机的报文通过 vtep 添加上 vxlan 以及外部的报文层,使用物理网络的IP、MAC作为外层头进行封装,然后在IP网络上传输,对方 vtep 收到之后拆除 vxlan 头部然后根据 VNI 把原始报文发送到目的虚拟机。
VTEP为虚拟机的数据包加上了层包头,这些新的报头之有在数据到达目的VTEP后才会被去掉。
中间路径的网络设备只会根据外层包头内的目的地址进行数据转发,对于转发路径上的网络来说,一个Vxlan数据包跟一个普通IP包相比,出了个头大一点外没有区别。
由于VXLAN的数据包在整个转发过程中保持了内部数据的完整,因此VXLAN的数据平面是一个基于隧道的数据平面。
VXLAN不会在虚拟机之间维持一个长连接,所以VXLAN需要一个控制平面来记录对端地址可达情况。控制平面的表为(VNI,内层MAC,外层vtep_ip)。Vxlan学习地址的时候仍然保存着二层协议的特征,节点之间不会周期性的交换各自的路由表,对于不认识的MAC地址,VXLAN依靠组播来获取路径信息(如果有SDN Controller,可以向SDN单播获取)。
另一方面,VXLAN还有自学习的功能,当VTEP收到一个UDP数据报后,会检查自己是否收到过这个虚拟机的数据,如果没有,VTEP就会记录源vni/源外层ip/源内层mac对应关系,避免组播学习。
1.哪些 vtep 需要加到一个相同的 VNI 组?
2.发送方虚拟机怎么知道对方的 MAC 地址?
3.vtep 怎么知道目的虚拟机在哪一台宿主机上?
vxlan 网络怎么感知彼此的存在并选择正确的路径传输报文?
解答:
1.vtep 形成的组是虚构的概念,只有某些 vtep 能够正确地传递报文,它们就是在同一个组内。
问题2和3在分析vxlan报文后解答。
内层报文:
通信的虚拟机双方要么直接使用 IP 地址,要么通过 DNS 等方式已经获取了对方的 IP 地址,因此网络层地址已经知道。同一个网络的虚拟机需要通信,还需要知道对方虚拟机的 MAC 地址,vxlan 需要一个机制来实现传统网络 ARP 的功能。
vxlan 头部:
只需要知道 VNI,这一般是直接配置在 vtep 上的,要么是提前规划写死的,要么是根据内部报文自动生成的。
UDP 头部:
最重要的是源地址和目的地址的端口,源地址端口是系统生成并管理的,目的端口也是写死的,比如 IANA 规定的 4789 端口。
IP 头部:
IP 头部关心的是 vtep 双方的 IP 地址,源地址可以很简单确定,目的地址是虚拟机所在地址宿主机 vtep 的 IP 地址,这个也需要由某种方式来确定。
MAC 头部:
如果 vtep 的 IP 地址确定了,MAC 地址可以通过经典的 ARP 方式来获取。
总结一下,一个 vxlan 报文需要确定两个地址信息:目的虚拟机的 MAC 地址和目的 vtep 的 IP 地址,如果 VNI 也是动态感知的,那么 vtep 就需要一个三元组:
内部 MAC <–> VNI <–> VTEP IP
根据实现的不同,一般分为两种方式:多播和控制中心。多播的概念是同个 vxlan 网络的 vtep 加入到同一个多播网络,如果需要知道以上信息,就在组内发送多播来查询;控制中心的概念是在某个集中式的地方保存了所有虚拟机的上述信息,自动化告知 vtep 它需要的信息
(多播概念略)vxlan 的底层网络是三层的,广播地址无法穿越三层网络,要给 vxlan 网络所有 vtep 发送报文只能通过多播。
通过多播学习对端虚拟机MAC地址过程如下:
位于左下方的 虚拟机 A 要通过 vxlan 网络发送报文给右下方的虚拟机 B
1.A以广播方式发送ARP请求(请求B的IP),源MAC为MAC-A。
2.VTEP1将ARP请求封装为vxlan报文,已组播方式发往组播组239.1.1.1。源MAC为VTEP1的MAC地址MAC-1,目的MAC为组播MAC地址00:01:5E:01:01:01,源IP为VTEP1的IP地址IP-1,目的IP为组播地址239.1.1.1。
3.VTEP2(VTEP3)收到vxlan报文后,剥离外层vxlan头部,在二层网络内发送广播ARP请求,并学习MAC-A | VNI | IP-1三元组。
4.B收到ARP请求后,以单播方式发送ARP应答,源MAC为B的MAC地址MAC-B,同时学习A的ARP表IP-A | MAC-A。
5.VTEP2收到B的ARP应答,加上vxlan头部,此时VTEP2已经知道虚拟机A和VTEP1的信息,以单播方式往外发送vxlan报文,目的IP为VTEP1的IP地址IP-A,源IP为自己的IP地址IP-B,VNI为学习的VNI 10。
6.VTEP1收到VTEP2发送的单播vxlan报文,学习虚拟机B和VTEP2的MAC-B | VNI | IP-2三元组信息。
7.VTEP1将vxlan报文的vlxan头部剥离,将ARP应答发送给A,虚拟机A拿到ARP应答报文,就知道了到目的虚拟机B的MAC地址。
在虚拟机和容器的场景中,当虚拟机或者容器启动还没有进行网络通讯时,我们就可以知道它的 IP 和 MAC,分布式控制中心保存了这些信息。除此之外,控制中心还保存了每个 vxlan 网络有哪些 vtep,这些 vtep 的地址是多少。有了这些信息,vtep 就能发送报文时直接查询并添加头部,不需要多播去满网络地问了。
一般情况下,在每个 vtep 所在的节点都会有一个 agent,它会和控制中心通信,获取 vtep 需要的信息以某种方式告诉 vtep。具体的做法取决于具体的实现,每种实现可能会更新不同的信息给 vtep,比如 HER(Head End Replication)只是把多播组替换成多个单播报文,也就是把多播组所有的 VTEP IP 地址告诉 vtep,这样查询的时候不是发送多播,而是给组内每个 vtep 发送一个单播报文;有些实现只是告诉 vtep 目的虚拟机的 MAC 地址信息;有些实现告诉 MAC 地址对应的 vtep IP 地址。
此外,什么时候告诉 vtep 这些信息也是有区别的。
一般有两种方式:
推送:常见的是一旦知道了虚拟机的三元组信息就告诉 vtep(即使某个 vtep 用不到这个信息,因为它管理的虚拟机不会和这个地址通信),一般这时候第一次通信还没有发生;
查询:另外一种方式是在第一次通信时,当 vtep 需要这些信息的时候以某种方式通知 agent,然后 agent 这时候才告诉 vtep 信息。
分布式控制的 vxlan 是一种典型的 SDN 架构,也是目前使用最广泛的方式。
ARP请求应答之后,A知道了B的MAC地址,并且要向B发送数据。VTEP1收到A的数据包,用MAC地址检查A和B是否使用同一个VNI(否则需要VXLAN网关),VTEP1已经知道了B和VTEP2的信息,直接进行vxlan报文封装,然后交给上联设备传输(UDP报文)。
中间传输过程就是普通IP包传输过程。
目的VTEP收到vxlan报文后检查VNI,如果和B的VNI一致,则将数据包解封装vxlan头部后交给B处理。对A和B来说,就像在一个局域网内通信一样。
VM之间的通信模式主要有3种:同VNI下的不同VM,不同VNI下的跨网访问,VXLAN和非VXLAN之间的访问。
VXLAN网关分为二层网关和三层网关。
位于同一网段的终端用户通信,二层网关收到用户报文后,根据报文中包含的目的MAC类型按照BUM(broadcast&unknown-unicast&multicast)或单播来转发。
三层网关用于非同一网段的终端用户通信或VXLAN和非VXLAN用户间的通信。
VXLAN二层网关工作流程
VXLAN二层网关工作流程分为BUM 报文转发工作流程和VXLAN已知单播转发工作流程。
1.VXLAN BUM报文转发工作流程
当BUM报文进入VXLAN隧道,接入端VTEP采用头端复制方式进行报文的VXLAN封装。BUM报文出VXLAN隧道,出口端VTEP对报文解封转。
头端复制:接口收到BUM(Broadcast&Unknown-unicast&Multicast)报文,本地VTEP通过控制平面获取属于同一个VNI的VTEP列表,将收到的BUM报文根据VTEP列表进行复制并发送给属于同一个VNI的所有VTEP。
通过头端复制完成BUM报文的广播,不需要依赖组播路由协议。
2.VXLAN已知单播转发工作流程
不同网段的VXLAN间通信,及VXLAN和非VXLAN的通信,需要通过IP路由实现。
在三层网关上创建BD,将VNI以1:1方式映射到BD,基于BD创建BDIF接口,通过BDIF接口配置IP地址实现不同网段的VXLAN间,及VXLAN和非VXLAN的通信。
BDIF接口类似VLANIF接口。
L3网关分为集中式网关和分布式网关。
集中式网关
所有网络的网关全部集中部署在一台设备,所有跨网段访问的流量都需要经过集中式网关;南北向/东西向的流量都需要经过网关,本地跨子网流量也通过集中式网关进行转发,流量迂回。
优点:
对夸网段访问的流量可集中管理,配置和维护比较简单;
缺点:
访问路径不优,从图中可以看出,位于同一vtep不同网段之间的主机互访时流量必须穿越集中式网关设备,造成访问路由的不优;
网关ARP表项瓶颈,因为所有网关都集中在一台设备,因此此设备需要生成网络中的所有ARP表象,因为设备ARP表项有限,所以不利于数据中心的扩展;
分布式网关
跨子网流量也是最优路径转发,只有南北向的流量压力,没有东西向的流量压力。在典型的spin-leaf组网部署下,可以将网关分布部署在所有的leaf节点,从而解决集中式网关带来的问题。
分布式网关特点
节点作为服务器的二层网关,负责服务器之间的二层通信;
节点作为服务器的三层网关,负责服务器夸网段的访问,因为网关三层流量在leaf节点终结,所以相同leaf节点下不同vxlan vni的访问将在leaf节点本地路由,消除了路由路径不优的问题;
因为网关在leaf节点上,因此leaf节点只需要学习本leaf节点所连接服务器的arp表象即可,消除了网关arp表象瓶颈;
因为所有vxlan隧道都终结在leaf节点之间,因此spine设备将不负责vxlan数据报文的封装和解封装工作,spine只需要进行ip路由高速转发即可,不需要支持vxlan。
分布式网关分为软件分布式网关和硬件分布式网关,其中软件分布式网关位于vSwitch, vSwitch实现VXLAN封装和解封装,通过DVR实现跨子网东西向流量转发。硬件分布式网关位于硬件网络边缘设备,由硬件网络设备做VXLAN封装和解封装。
VXLAN二层网关工作流程分为BUM报文转发工作流程和VXLAN已知单播转发工作流程。
不同网段的VXLAN网络之间通信,以及不同网段VXLAN网络和非VXLAN网络的通信,需要通过VXLAN三层网关实现,VXLAN三层网关工作流程如下:
1.作为VXLAN二层网关的Switch_4收到VXLAN报文后进行解封装,确认内层报文中的DMAC是否是本网关接口的MAC地址。
● 是,转给对应目的网段的三层网关处理,并跳转2。
● 不是,在对应的二层广播域内查找出接口和封装信息。
2.作为VXLAN三层网关的Switch_4剥除内层报文的以太封装,解析目的IP。根据目的IP查找ARP表项,确认DMAC、VXLAN隧道出接口及VNI等信息。
● 没有VXLAN隧道出接口及VIN信息,进行三层转发。
● 有VXLAN隧道出接口及VIN信息,跳转3。
3.作为VXLAN二层网关的Switch_4重新封装VXLAN报文,其中内层报文以太头中的SMAC是网关接口的MAC地址。
Switch_4与其他Switch之间的通信,请参见二层网关实现原理。
简单的二层BD配置(虚拟机挂接到二层接口vlan 100):
system-view
[~HUAWEI]vlan 10
[*HUAWEI-vlan10] name vxlan
[*HUAWEI-vlan10] quit
[*HUAWEI] interface Vlanif10
[*HUAWEI-Vlanif10]ip address 192.168.10.10 24
[*HUAWEI-Vlanif10]quit
[~HUAWEI]interface loopback10
[~HUAWEI-loopback10]ip address 192.168.10.100 32
[~HUAWEI-loopback10]quit
[~HUAWEI] interface nve 1
[*HUAWEI-Nve1] source 192.168.10.100
[*HUAWEI-Nve1] vni 1 head-end peer-list 192.168.10.101
[*HUAWEI-Nve1] vni 100 head-end peer-list 192.168.10.101
[*HUAWEI-Nve1]quit
[*HUAWEI] bridge-domain 100
[*HUAWEI-bd100] l2 binding vlan 100
[*HUAWEI-bd100] vxlan vni 1
[*HUAWEI-bd100]quit
[*HUAWEI] bridge-domain 101
[*HUAWEI-bd101] l2 binding vlan 101
[*HUAWEI-bd101] vxlan vni 101
[*HUAWEI] ip route-static 192.168.10.101 255.255.255.255 Vlanif10 192.168.10.11 permanent
system-view
[~HUAWEI]vlan 10
[*HUAWEI-vlan10] name vxlan
[*HUAWEI-vlan10] quit
[*HUAWEI] interface Vlanif10
[*HUAWEI-Vlanif10]ip address 192.168.10.11 24
[*HUAWEI-Vlanif10]quit
[~HUAWEI]interface loopback10
[~HUAWEI-loopback10]ip address 192.168.10.101 32
[~HUAWEI-loopback10]quit
[~HUAWEI] interface nve 1
[*HUAWEI-Nve1] source 192.168.10.101
[*HUAWEI-Nve1] vni 1 head-end peer-list 192.168.10.100
[*HUAWEI-Nve1] vni 100 head-end peer-list 192.168.10.100
[*HUAWEI-Nve1]quit
[*HUAWEI] bridge-domain 100
[*HUAWEI-bd100] l2 binding vlan 100
[*HUAWEI-bd100] vxlan vni 1
[*HUAWEI-bd100]quit
[*HUAWEI] bridge-domain 101
[*HUAWEI-bd101] l2 binding vlan 101
[*HUAWEI-bd101] vxlan vni 101
[*HUAWEI] ip route-static 192.168.10.100 255.255.255.255 Vlanif10 192.168.10.10 permanent
vxlan网关
https://www.jianshu.com/p/6ed5103e0deb
https://forum.huawei.com/enterprise/zh/thread-334207.html