YoloKokura

用一句话来总结的话,VXLAN (Virtual eXtensible Local Area Networking) 是一种基于隧道的二层网络虚拟化技术。

作为一个计网小白,脱离具体问题,初次接触VXLAN时总是懵的。网络虚拟化和隧道技术和我有什么关系?为什么我会要用到VXLAN?所以我们首先从一个实际的场景来引入相关概念。

为什么我们需要 VXLAN?

设想你建立了一个云服务公司,最开始你没有想太多,客户的应用直接跑在你的物理机设备上。如果我们只考虑网络通信这一个方面,那么用户部署的VM会直接和物理机的网卡打交道,你雇佣的SRE需要根据每个用户的特殊需要,细心维护每一台物理机上的网卡配置。

在创业初期,这好像不是什么问题。你的物理机资产、客户数量,以及客户的集群规模都在一个可控范围内。然而,随着公司业务规模扩张,上述三个指标可以预见,会出现惊人的增长,运维人员的工作难度显然会随之增加。除此以外,你可能还需要注意物理机维护、配置变动等带来的业务迁移问题,用户可不希望因为你的问题,他的服务要宕掉。再次,不少用户业务涉及敏感数据,如果缺乏有效的通信隔离手段,多个用户的业务在一个同物理网络中裸跑,恶意用户可能会利用各种方式窃取其他用户的数据。

梳理一下不难发现,上面提到的种种需求,归根结底是因为多个用户的业务运行在同一个物理网络上。物理网络的变动、某些用户的恶意流量都会直接影响到同一个网络中的其他用户。为了解决这个问题,不妨对业务运行以来的网络环境进行虚拟化处理,每个用户只能看到自己被分配的逻辑网络,而对更底层的物理网络一无所知。(和OS虚拟化等相似的思路)

VXLAN就是网络虚拟化的技术之一。诚然,网络虚拟化的具体技术实现有一打,它们和VXLAN相比,在系统兼容性、硬件支持、性能开销等方面各有优劣,但这种对比不是本文关心的内容,我们这里就只关心VXLAN这一种技术。

VXLAN 是怎样做的?

如文章开头的第一句话所说,VXLAN提供的是二层网络虚拟化能力,即会在物理机上创建虚拟网口,如:

ip link add vxlan0 type vxlan id 4100 remote IPADDR local IPADDR dstport 4789 dev eth0
ip link add vxlan0 type vxlan id 4100 group IPADDR dstport 4789 dev eth0

ip link delete vxlan0

ip -d link show vxlan0

我们先忽略上述命令中的其它细节,单看ip l add命令本身,它只是创建了vxlan类型的虚拟接口,真实数据通过eth0传输。命令中的IPADDR对应着虚拟网络中的IP地址,dsport参数提供了端口信息。

在实际的数据传输过程中,业务层使用预先配置的虚拟网络IP通信。到达虚拟网口vxlan0的以太网帧,实际上是由dsport端口上的UDP通信,即在VXLAN数据帧上封一个L3UDP头部,通过eth0发出。这种在原始数据包外封装额外头部的方式即为隧道,它使底层L2的数据能通过L3网络传输。也就是说,用户看到的,是固定的二层网络结构,底层的网络只要确保三层可达即可,用户不感知可能出现的拓扑变化。

我们还注意到,ip l add命令还给了一个id参数,它用于标识一个VXLAN虚拟网络,又被称为VNI (VXLAN Network Identifier),以实现多个网络间的隔离。

总的来看,数据包的处理过程大概是这样的:

  1. 用户 (VM) 将通过VXLAN虚拟网络,组装L2数据帧,其中各层的头部信息与该网络相关,用到的参数包括vxlan0的MAC地址、IP地址,隧道对侧的MAC地址、IP地址等; 2。 数据帧将通过vxlan0发送给内核,后者将根据目标MAC地址,在VXLAN映射表中查询,找到对方的虚拟口信息,在原始的L2数据帧上封装VXLAN头部,内容包括虚拟网络的ID标识;
  2. 紧接着,内核将为数据帧封装UDP头部,包含端口信息dsport
  3. 随后,内核继续添加IP数据报头部和以太网帧头部(目标的IP地址和下一跳MAC地址),最终组成新的L2数据帧,发送给物理网口eth0;
  4. eth0将数据帧发送给对方,取决于网络拓扑结构,可能要经过多次路由跳转。隧道对侧的物理网口接收到数据帧后,会交由对侧的内核根据映射表配置,反向解除封装,拿到原始的L2数据帧,根据VNI将之分发到对应的VXLAN接口,再上升到业务。

可见,用户组装或解析的L2数据帧是建立在虚拟的网络配置上的,VXLAN在中间插入,接管了虚拟网络到物理网络之间的转换。

如果我们拓展一下,vxlan0只是一个支持VXLAN的虚拟网口,用于接入虚拟网络。但这只是实现方式之一,事实上,这种接入设备还可以是支持VXLAN的交换机等,它们被统称为VTEP (VXLAN Tunnel Endpoint)。

如何管理 MAC - VNI - VTEP 的映射关系?

从上一节内容得知,管理运维人员要做的,基本上就是在各个设备上配置VTEPVNI,架设虚拟网络。OS内核将根据一张映射表来决定VTEP地址,这张表被称作FDB (Forwarding Database),结构大概如下:

MAC 地址VNI出接口VTEP 目标 IP(远端 VTEP)
VM1_MAC(本地)1000vxlan0-
VM2_MAC(远端)1000vxlan010.1.1.2(VTEP2)

我们的vxlan0收到了来自VM1的以太网帧后,发送到内核,后者从中获取目标的MAC地址 (VM2_MAC)和VNI,以此确定对方VTEP宿主机IP地址。有了IP地址,后面不难通过ARP获取下一跳MAC,后面便是经典的七层网络封装过程了,我们这里不再关注。

FDB可通过以下方式静态配置或查看:

bridge fdb add to MACADDR dst IPADDR dev vxlan0
bridge fdb delete MACADDR dev vxlan0
bridge fdb replace MACADDR dst IPADDR dev vxlan0
bridge fdb show dev vxlan0

另外,如果在添加vxlan0时启动learning选项,如:

ip link add vxlan0 type vxlan id 1000 local 192.168.1.2 dstport 4789 learning

内核也会根据接收到的数据包的源MAC地址和VTEP IP地址,自动更新FDB,但静态配置的内容优先级要更高。

Further Reading

  1. VXLAN 基础教程:VXLAN 协议原理介绍 · 云原生实验室
  2. VXLAN 基础教程:在 Linux 上配置 VXLAN 网络 - 米开朗基杨 - 博客园
  3. Chapter 9. Using a VXLAN to create a virtual layer-2 domain for VMs | Red Hat Product Documentation
  4. Virtual eXtensible Local Area Networking documentation — The Linux Kernel documentation

Tags: