当前位置: 首页 > Linux

VXLAN基础教程:VXLAN协议原理介绍

时间:2023-04-06 23:21:53 Linux

VXLAN(VirtualeXtensibleLocalAreaNetwork,虚拟可扩展局域网),是一种虚拟隧道通信技术。它是一种Overlay(覆盖网络)技术,通过三层网络构建一个虚拟的二层网络。简单来说,VXLAN是在底层物理网络(underlay)上使用隧道技术,利用UDP层构建的Overlay逻辑网络,将逻辑网络与物理网络解耦,实现灵活的组网需求。对原有网络架构几乎没有影响,可以在不对原有网络做任何改动的情况下,建立新的一层网络。也正是因为这个特性,很多CNI插件(Kubernetes集群中的容器网络接口,大家应该都知道,不知道现在知道了)都会选择VXLAN作为通信网络。VXLAN不仅支持一对一,也支持一对多。VXLAN设备可以通过类似网桥的学习方式学习其他对等体的IP地址,也可以直接配置静态转发表。典型的数据中心VXLAN网络拓扑图如图所示:其中VM是指虚拟机,Hypervisor是指虚拟化管理器。1、为什么需要VXLAN?与VLAN相比,VXLAN显然要复杂得多。再加上VLAN的先发优势,已经得到了广泛的支持,为什么还需要VXLAN呢?VLANID个数限制VLANtag一共有4个字节,其中12位用来标识不同的二层网络(即LANID),所以最多只能支持$2^{12}$,即即,4096个子网划分。随着虚拟化(虚拟机和容器)的兴起,数据中心将有成千上万台机器需要通信。这时候,VLAN就不能满足需求了。VXLAN包头预留24位来标识不同的二层网络(VNI,VXLANNetworkIdentifier),即3个字节,可以支持$2^{24}$个子网。交换机MAC地址表限制对于同一网段的主机通信,报文到达交换机后,会查询MAC地址表进行二层转发。数据中心虚拟化后,虚拟机数量较原有物理机数量级增长,应用容器化后,容器数量较虚拟机数量级增长。..交换机的内存是有限的,所以MAC地址表也是有限的。随着虚拟机(或容器)网卡的MAC地址数量空前增加,交换机压力山大!而VXLAN的功能强大。它使用VTEP(稍后解释)将第2层以太网帧封装在UDP中。一台物理机上的所有VM(或容器)可以共享一个VTEP,一台物理机对应一个VTEP。从交换机的角度来看,只是在不同的VTEP之间传输UDP数据。只需要记录与物理机数量相等的MAC地址表项,一切又恢复如初。虚拟机或容器迁移范围受限。VLAN与物理网络融为一体,没有Overlay网络。问题是虚拟网络无法突破物理网络的限制。比如要在VLAN100上部署一个虚拟机(或容器),只能部署在支持VLAN100的物理设备上。其实VLAN也有一个解决方案,就是把所有的switchtrunk连接起来形成一个大的二层。由此带来的问题是广播域被过度扩展,包括更多未知的单播和组播,即BUM(Broadcast,UnknownUnicast,Multicast),交换机MAC地址表也会有难以忍受的问题。VXLAN将二层以太网帧封装在UDP中(如上文所述),相当于在三层网络上构建二层网络。这样无论你的物理网络是二层还是三层,都不会影响虚拟机(或容器)的网络通信,而且部署在哪个物理设备上也无所谓,都可以随意迁移。一般来说,传统的二层和三层网络已经无法满足这些要求。虽然stacking、SVF、TRILL等诸多改进技术可以增加第二层的范围,力求对经典网络进行完善,但必须在对网络进行最小改动的同时保证灵活性是非常困难的。为了解决这些问题,人们提出了很多方案,Overlay就是其中之一,而VXLAN就是Overlay的典型技术方案。下面简单介绍一下Overlay。2.什么是叠加?在网络技术领域,Overlay是指叠加在网络架构上的一种虚拟化技术模式。其总体架构是在不对基础网络进行大规模改造的情况下,实现应用在网络上的承载,并与其他网络进行通信。业务分离,以IP为基础的基础网络技术为主。在Overlay技术领域,IETF提出了三大技术方案:VXLAN、NVGRE、STT。大致思路是将以太网报文承载到某个隧道层,区别在于隧道的选择和构建,底层是IP转发。VXLAN和STT对现网设备的流量均衡要求较低,即负载链路负载分担适应性好,一般网络设备可以对L2-L4数据内容参数进行链路聚合或等价路由流量NVGRE要求网络设备感知GRE扩展头并对流ID进行HASH,需要硬件升级;STT对TCP有较大的修改,隧道模式接近UDP的本质。隧道构建技术创新复杂,VXLAN利用现有的通用UDP传输,已经非常成熟。总体对比,VLXAN技术优势更大,目前VLXAN也得到了更多厂商和客户的支持,成为了Overlay技术的主流标准。3、VXLAN协议原理VXLAN有几个常用的术语:VTEP(VXLANTunnelEndpoints,VXLAN隧道端点)是VXLAN网络的边缘设备,用于处理VXLAN报文(封装和解包)。VTEP可以是网络设备(如交换机)或机器(如虚拟化集群中的主机)。VNI(VXLANNetworkIdentifier,VXLAN网络标识符)VNI是每个VXLAN网段的标识符。它是一个24位整数。总共有$2^{24}=16777216$(超过1000万)。通常,每个VNI对应一个租户。也就是说,一个使用VXLAN搭建的公有云,理论上可以支持上千万的租户。隧道(VXLAN隧道)隧道是一个逻辑概念,在VXLAN模型中没有具体的物理实体与之对应。隧道可以看作是一种虚拟通道。VXLAN通信双方都认为是直接通信,不知道底层网络的存在。从整体上看,每个VXLAN网络似乎都为相互通信的虚拟机建立了一个单独的通信通道,即隧道。上图是VXLAN的工作模型,是在原有的IP网络(三层)上创建的,只要三层可达(可以IP互通)就可以部署VXLAN。在VXLAN网络的每个端点都有一个VTEP设备,负责对VXLAN协议报文进行拆包和封装,即将VTEP通信的报文头封装在虚拟报文上。可以在物理网络上创建多个VXLAN网络,这些VXLAN网络可以看作是一个隧道,不同节点上的虚拟机/容器可以通过隧道直接相连。通过VNI来标识不同的VXLAN网络,从而实现不同VXLAN之间的隔离。VXLAN的报文结构如下图所示:VXLANHeader:在原来的二层帧前面增加8个字节的VXLANheader,其中最重要的是VNID,占3个字节(即24位),类似于VLANID,可以有$2^{24}$段。UDPHeader:使用一个8字节的UDPHeader封装(MACINUDP)在VXLAN和原始二层帧之前。目标端口号默认为4789。哈希运算的数字),以便更好地完成ECMP。IANA(InternetAssignedNumbersAutority)分配4789作为VXLAN的默认目标端口号。在上面添加的二层封装之后,添加底层网络的IP头(20字节)和MAC头(14字节),其中IP和MAC分别是主机的IP地址和MAC地址。同时需要注意MTU的问题。传统网络MTU一般为1500,这里加上VXLAN封装(36+14/18,对于14的情况,就是access口,省略4字节的VLANTag)。50或54字节,需要将MTU调整为1550或1554,防止频繁分包。VXLAN的FloodandLearn一般来说,VXLAN数据包的转发过程是:原始数据包经过VTEP,被Linux内核加上VXLANheader和外层UDPheader,然后发送出去,对端VTEP收到VXLAN后报文,去掉外层UDP头,根据VXLAN头中的VNI将原报文发送到目的服务器。但是这里有个问题,双方如何在第一次通信之前就知道所有的通信信息呢?这些信息包括:哪些VTEP需要添加到同一个VNI组?发送方怎么知道对方的MAC地址呢?如何知道目的服务器在哪个节点上(即目的VTEP的地址)?第一个问题很简单,VTEP通常是由网络管理员配置的。要回答后面两个问题,还得回到VXLAN协议报文,看看一个完整的VXLAN报文需要什么信息:内层报文:明确了通信双方的IP地址,只需要VXLAN填写对方的MAC地址,所以需要一种机制来实现ARP功能。VXLAN标头:只需要知道VNI。一般是直接配置在VTEP上,或者是预先规划好的,或者是根据内层报文自动生成的。UDPheader:需要知道源端口和目的端口。源端口由系统自动生成,目的端口默认为4789。IP头:需要知道对端VTEP的IP地址,这是最关键的部分。其实VTEP也有自己的转发表。转发表是通过泛洪和学习机制维护的。对于目标MAC地址在转发表中不存在的未知单播和广播流量,将被洪泛到除源VTEP之外的所有节点。所有VTEP和目标VTEP响应数据包后,源VTEP会从数据包中获知MAC、VNI、VTEP的映射关系,加入到转发表中。直接从转发表中获取目标VTEP地址,从而向目标VTEP发送单播数据。VTEP转发表可以通过以下两种方式获知:组播外部控制中心(如Flannel、Cilium等CNI插件)MAC头:确定VTEP的IP地址后,后面就好办了,而MAC地址可以通过经典的ARP方式获取。4、Linux的VXLANLinux已经有很短的时间不支持VXLAN协议了。2012年,StephenHemminger将相关工作合并到内核中,最终出现在内核3.7.0版本中。出于稳定性和众多功能的考虑,某些软件可能会建议在3.9.0或3.10.0以上的内核版本上使用VXLAN。到3.12内核版本,Linux已经完全支持VXLAN,支持单播和组播,支持IPv4和IPv6。使用man查看ip的link子命令,可以查看是否有VXLAN类型:$manip-linksearchVXLAN,可以看到如下描述:管理VXLAN接口LinuxVXLAN接口的基本管理如下:创建一个点对点VXLAN接口:$iplinkaddvxlan0typevxlanid4100remote192.168.1.101local192.168.1.100dstport4789deveth0其中id是VNI,remote是远程主机的IP,local是你本地的IPhost,dev是VXLAN数据传输的接口。在VXLAN中,VXLAN接口(本例中为vxlan0)一般称为VTEP。以组播方式创建VXLAN接口:$iplinkaddvxlan0typevxlanid4100group224.1.1.1dstport4789deveth0组播组主要通过ARP泛洪学习MAC地址,即在VXLAN子网内广播ARP请求,然后对应to节点响应。group指定多播组的地址。查看VXLAN接口的详细信息:$ip-dlinkshowvxlan0FDBTableFDB(ForwardingDatabaseentry,转发表)是Linux网桥维护的二层转发表,用于保存对端MAC地址虚拟机/容器。可以使用bridgefdb命令对FDB表进行操作:$bridgefdbadddevdst条目删除:$bridgefdbdeldev条目更新:$bridgefdbreplacedevdst条目查询:$bridgefdbshow5.通过介绍VXLAN的时代背景、VXLAN的概念及网络模型、VXLAN报文结构对本文进行总结,让您对VXLAN有一个初步的了解;通过介绍VXLAN转发表的泛洪和学习,让你了解通信双方是如何感知对方的;最后介绍一下Linux中VXLAN的基本配置,让大家进一步了解VXLAN在这中间的玩法。下一篇文章将通过实战讲解如何搭建基于VXLAN的Overlay网络,顺便讲解一下上面提到的组播和外控中心的工作原理。6.参考资料vxlan协议原理介绍VXLANvsVLAN微信公众号扫描下方二维码关注微信公众号,回复公众号?加群☉加入我们的云原生交流群,孙红亮,张主任、杨明等大佬一起探讨云原生技术