VXLAN分布式网关实验详解:从原理到配置排错
1. 为什么全网都在聊VXLAN以及分布式网关到底解决了什么先聊点实际的。如果你最近在搞数据中心网络、虚拟化迁移或者跨机房容器网络一定绕不开VXLAN这个词。我去年的某个项目里客户要求把两个物理机房的虚拟机网络打通业务侧要求看起来就像同一台交换机下面的两台服务器而且IP段不能冲突、广播域要统一、虚拟机漂移之后网络策略还得跟着走。一开始大家的第一反应是做传统的大二层拉光纤、堆交换机结果一算成本跨机房的裸光纤费用和波分设备投入直接把预算打爆。后来转向VXLAN方案才真正体会到这个东西为什么能在数据中心网络里站住脚。VXLAN全称是Virtual Extensible Network是一种网络虚拟化技术。它把一个二层以太网帧封装在UDP报文里通过底层三层的IP网络传输相当于在现有物理网络上叠加了一层虚拟的二层网络。用大白话说就是把二层的网线接在一张三层的地图上。那分布式网关又是怎么回事传统方案里不同VXLAN网络之间要互通通常需要一个集中的三层网关设备所有跨网段流量都跑到这个网关去转发性能和可靠性都压在一个点上。分布式网关则是把三层网关功能下沉到每一台参与VXLAN的Leaf交换机上每个Leaf都能本地响应终端的网关ARP请求流量就近转发。这个区别就像全城只有一个火车站所有人出城都要去那里和每个区都有自己的高铁站的差别。这篇文章我会从零开始拆一个完整的VXLAN分布式网关实验。实验完全可以在VMware Workstation或者KVM里用几台虚拟机完成不需要真实硬件也不需要授权只要有一颗愿意折腾的心和一台内存不低于16G的电脑。1.1 实验拓扑和角色分工先说清楚我实验里的设备角色你照着搭就能跑起来。两台Leaf交换机Leaf-1和Leaf-2承担VXLAN封装解封装和分布式三层网关功能两台Spine交换机Spine-1和Spine-2只跑三层路由负责转发Leaf之间的VXLAN隧道流量两台服务器Server-1和Server-2分别连接Leaf-1和Leaf-2上面跑虚拟机四台虚拟机VM-A、VM-B跑在Server-1上VM-C、VM-D跑在Server-2上IP规划上我采用了典型的两段式设计。Underlay物理底层使用10.0.0.0/24网段Spine和Leaf之间通过Loopback接口建立OSPF邻居Loopback地址分别规划为10.0.0.1/32和10.0.0.2/32。Overlay虚拟网络使用192.168.0.0/24和192.168.1.0/24两个网段分别对应两个不同的VXLAN网络。这个实验全网段划分如下你可以直接抄设备接口IP地址作用Spine-1Loopback010.0.0.1/32OSPF互联/VTEP源地址Spine-2Loopback010.0.0.2/32OSPF互联/备份路径Leaf-1Loopback010.0.0.3/32本地VTEP源地址Leaf-2Loopback010.0.0.4/32本地VTEP源地址Leaf-1Vlan100192.168.0.254/24分布式网关IP子网1Leaf-2Vlan200192.168.1.254/24分布式网关IP子网2VM-Aeth0192.168.0.10/24租户虚拟机VM-Beth0192.168.0.20/24租户虚拟机VM-Ceth0192.168.1.10/24租户虚拟机VM-Deth0192.168.1.20/24租户虚拟机你一定注意到了Leaf-1和Leaf-2同时配置了Vlan100和Vlan200的网关地址。这就是分布式网关的核心设计——每个Leaf都拥有所有VXLAN网络的网关IP终端不管连到哪台Leaf网关MAC都一样这样虚拟机在Leaf之间迁移时网关不会变成别人家的网关网络配置完全不用动。1.2 为什么不用集中式网关而用分布式先别急着敲命令我用自己的理解把集中式和分布式的本质差异讲透。集中式网关的做法是所有VTEPVXLAN Tunnel End Point隧道端点把流量都发到一台专门的网关设备那台设备上配置所有VXLAN对应的三层接口。好处是设计简单坏处有三个一是所有东西向流量都绕远路延迟高二是网关单点故障一旦挂了整个网络瘫痪三是扩展性差网关设备转发能力到头了就只能换更大的盒子。分布式网关的优势在于每个Leaf都有本地VLAN接口作为VXLAN网络的网关。VM-A要访问VM-C它先把流量发给Leaf-1上192.168.0.254这个网关Leaf-1查路由表发现VM-C所在的192.168.1.0/24网络对应的VTEP是Leaf-2于是做VXLAN封装后直接发给Leaf-2Leaf-2解封装后转发给VM-C。整个过程中流量不用绕到某个中心设备路径短了时延自然也下来了。不过分布式网关也有它的痛点——最典型的就是网关MAC一致性问题。既然每个Leaf上的Vlan100接口都配了192.168.0.254那这个网关的MAC地址也必须是同一个否则虚拟机发出ARP请求时不同Leaf回的MAC不一样虚拟机网卡缓存就会错乱。解决这个问题需要Leaf交换机支持虚拟网关能力所有Leaf的网关接口共享同一个虚拟MAC这个是后面配置的关键点实验里必须有这一步。2. 实验环境准备虚拟设备选型和网络规划避坑很多初学者卡在第一步就放弃了因为VXLAN实验不像配个静态路由那么简单需要同时满足Overlay能通和Underlay能路由两个条件。我先说设备选型再说具体规划最后说三个我踩过的坑。2.1 用虚拟机模拟交换机和服务器实验全部在VMware Workstation上进行。Leaf和Spine用思科Nexus 9000系列交换机镜像跑在虚拟机里服务器则用最小化的Ubuntu Server虚拟机。为什么选Nexus 9000因为它对VXLAN的支持非常完整支持分布式网关、BGP EVPN、Anycast Gateway等全套特性而且命令行和物理设备完全一致实验经验可以直接迁移到生产环境。如果你手头有GNS3或者EVE-NG那更省事直接拖设备节点就能搭拓扑。不过要注意一点Workstation里跑交换机镜像网卡一定要选VMXNET3类型否则性能会非常差而且可能无法配置VXLAN隧道。这是第一个坑。服务器上跑虚拟机跑VXLAN其实还有另一条路直接用系统自带的VXLAN模块。Linux内核从3.7开始就原生支持VXLAN用ip link add vxlan0 type vxlan命令就能创建VXLAN接口。甚至不需要物理交换机在几台Linux虚拟机之间就能组成VXLAN网络。但我更推荐还是走交换机这一步因为生产环境里VXLAN基本都是交换机或软交换机承载把交换机的配置逻辑搞明白比单纯用Linux命令更接近真实场景。2.2 Underlay和Overlay双平面规划的细节实验里最花时间的其实是网络规划而不是命令行。我给大家一个通用原则Underlay网络用一套独立的IP段不要把Loopback地址复用成业务地址Overlay网络的IP段则要和Underlay段完全错开这样排查问题时一眼就能看出是哪个平面的流量。我自己的规划是这样的Underlay互连接口IP采用10.0.1.x/30、10.0.2.x/30这类掩码30位的点对点地址节约IPUnderlay的Loopback接口采用10.0.0.x/32专门作为BGP或OSPF的Router-ID以及VTEP源地址Overlay业务网段192.168.0.0/24和192.168.1.0/24模拟租户的两个二层网段有一个很容易踩的坑是VTEP源地址必须使用Loopback地址而不是物理接口地址。原因在于如果使用物理接口地址作为隧道源一旦该接口链路Down了所有VXLAN隧道都会中断而Loopback接口是逻辑接口只要设备本身还活着它永远可用。配合OSPF或BGP做ECMP等价多路径后流量会在多条物理链路上负载分担大大增强了网络的健壮性。2.3 三个前面没说透的规划坑坑一VNI号和VLAN ID不能想当然地相等。VNIVXLAN Network Identifier是24比特的虚拟网络标识VLAN ID是12比特的二层标识二者作用域完全不同。虽然很多实验里习惯让VNI 100对应VLAN 100但这纯属人为约定不是协议要求。你要在脑子里明确区分VLAN是终端接入交换机时的本地二层域VNI是VXLAN隧道里的全局虚拟网络标识。坑二组播组地址的规划。如果采用组播模式做BUM流量广播、未知单播、组播的泛洪需要给每个VNI规划一个组播组地址。这意味着Underlay网络必须开启PIM协议配置复杂度直线上升。我的建议是实验里先用静态配置头端复制列表Ingress Replication让每个VTEP显式知道邻居VTEP的地址绕过组播的配置后续想深入再单独玩组播。坑三MTU问题。VXLAN封装会额外增加50字节左右的开销外层IP头20字节UDP头8字节VXLAN头8字节可能还有外层以太网头14字节。如果物理链路的MTU是1500那一个标准的1500字节以太网帧封装后就变成1550字节超过物理链路的承载能力流量会被丢弃。这个问题的排查极其隐蔽——小包能通大包不通ping一个1472字节的包就失败。实验里我建议把Underlay所有接口的MTU设为1600或9000给封装留足余量。3. 一步步敲出VXLAN分布式网关的核心配置环境准备好之后就进入正题。我不打算罗列所有设备的全部命令而是挑出每台设备上最关键的配置片段并解释每一段的作用。你把它们按顺序贴到设备上就能复现整个实验。3.1 第一步Underlay路由先通分布式网关的前提是VTEP之间三层可达。所以第一件事是把OSPF配起来让Spine和Leaf的Loopback地址互相能通。Leaf-1上的关键配置如下Spine和Leaf-2类似只改IPfeature ospf interface loopback0 ip address 10.0.0.3/32 ip router ospf UNDERLAY area 0.0.0.0 interface Ethernet1/1 no switchport ip address 10.0.1.1/30 ip router ospf UNDERLAY area 0.0.0.0 no shutdown router ospf UNDERLAY router-id 10.0.0.3这里有个细节我在接口上同时配置了ip router ospf和router-id让Loopback地址自动宣告进OSPF这样其他Leaf就能通过OSPF学习到10.0.0.3/32这条主机路由。验证Underlay是否已经通了直接在Leaf上ping对端LoopbackLeaf-1# ping 10.0.0.4 source 10.0.0.3 64 bytes from 10.0.0.4: icmp_seq1 ttl253 time0.899 ms看到Reply就说明Underlay通了这是后面所有VXLAN配置的基础。3.2 第二步配置NVE接口和VXLAN隧道NVENetwork Virtualization Edge接口是Nexus交换机上承载VXLAN隧道的逻辑接口所有VXLAN封装和解封装都在这里发生。Leaf-1的配置feature nv overlay interface nve1 source-interface loopback0 member vni 100 ingress-replication protocol static peer-ip 10.0.0.4 member vni 200 ingress-replication protocol static peer-ip 10.0.0.4解释一下这段配置的含义。source-interface loopback0告诉交换机用哪个地址作为VXLAN隧道源前面说过必须用Loopback。member vni 100表示将VNI 100映射到这个NVE接口上同时用ingress-replication协议静态指定对端VTEP地址10.0.0.4意思就是这个VNI的所有广播、未知单播、组播流量都复制一份发给Leaf-2。这里还要注意一个对应关系Leaf-2上必须同样配置VNI 100和VNI 200并且peer-ip要指向Leaf-1的Loopback地址。VNI是全局标识两端的VTEP必须都认可同一个VNI隧道才能建立。如果Leaf-1配置了VNI 100而Leaf-2没配两边永远协商不出隧道。3.3 第三步创建VLAN并绑定VNI接下来是二层域映射。Leaf-1上创建VLAN 100和VLAN 200并分别映射到VNI 100和VNI 200vlan 100 vn-segment 100 vlan 200 vn-segment 200 interface Vlan100 no shutdown ip address 192.168.0.254/24 fabric forwarding mode anycast-gateway interface Vlan200 no shutdown ip address 192.168.1.254/24 fabric forwarding mode anycast-gateway这段配置里的fabric forwarding mode anycast-gateway就是分布式网关的精髓。它让Leaf-1和Leaf-2上的Vlan100接口在逻辑上共享同一个虚拟网关IP和虚拟网关MAC终端不管从哪个Leaf接入看到的网关都是同一个。这也是我之前强调的网关MAC一致性的落地点。同时还需要把连接服务器的物理接口加入VLANinterface Ethernet1/2 switchport mode trunk switchport trunk allowed vlan 100,200 no shutdown服务器侧通过trunk口把带VLAN Tag的流量送到Leaf。如果服务器上的虚拟机分别属于VLAN 100和VLAN 200那它们发出的流量就会在Leaf上被分别映射到VNI 100和VNI 200。3.4 第四步三层网关和路由打通到这一步VM-A192.168.0.10和VM-C192.168.1.10不能互通因为VLAN 100和VLAN 200之间还没走三层。我们在Leaf-1上配置两条静态路由指向对端VTEP意思就是要访问另一个VNI的网段请把流量封装进VXLAN发给对端VTEPip route 192.168.1.0/24 10.0.0.4命令很简单但它背后的逻辑值得展开说。Leaf-1从VM-A收到目的IP为192.168.1.10的数据包之后先查询路由表发现下一跳是10.0.0.4Leaf-2的Loopback地址于是把数据包做三层转发的同时又根据192.168.1.0/24这个网段对应的VNI 200在NVE接口上封装成VXLAN报文通过Underlay网络发给Leaf-2。Leaf-2解封装后再在Vlan200里二层转发给VM-C。整个过程对终端完全透明。Leaf-2上的静态路由则相反要把192.168.0.0/24路由到10.0.0.3ip route 192.168.0.0/24 10.0.0.3配置到这里整个分布式网关的骨架就完成了。你可以先做连通性测试VM-A ping VM-C的192.168.1.10应该能通。4. 分布式网关实验的实测记录和排查套路配置敲完之后光看配置不验证是没有意义的。这一节我用实测输出说话再分享我在这个实验里遇到的几个典型问题以及完整的排查链路。4.1 联通性测试逐条过我先在VM-A上ping VM-B同VNI同Leaf和VM-C跨VNI跨LeafrootVM-A:~# ping 192.168.0.20 PING 192.168.0.20 (192.168.0.20) 56(84) bytes of data. 64 bytes from 192.168.0.20: icmp_seq1 ttl64 time1.11 ms rootVM-A:~# ping 192.168.1.10 PING 192.168.1.10 (192.168.1.10) 56(84) bytes of data. 64 bytes from 192.168.1.10: icmp_seq1 ttl63 time0.890 ms注意看TTL值同VNI内pingTTL是64说明流量纯二层转发跨VNI pingTTL是63说明经过了一次三层转发Leaf-1充当网关这正是分布式网关在工作。再做一个更有意思的测试在Leaf-1上查看MAC地址表和隧道信息Leaf-1# show mac address-table Vlan Mac Address Type Ports/Move ---- ----------- -------- ------------- 100 0050.0000.0101 DYNAMIC Eth1/2 100 0050.0000.0102 DYNAMIC Eth1/2 100 0050.0000.0201 DYNAMIC nve1 100 0050.0000.0202 DYNAMIC nve1 200 0050.0000.0301 DYNAMIC nve1 Leaf-1# show nve vni Codes: CP - Control Plane DP - Data Plane UC - Unconfigured SA - Suppressed ACK SU - Suppressed Unknown Unicast Interface VNI Multicast-group State Mode --------- --------- ------------------ ----- ---- nve1 100 0.0.0.0 Up DP nve1 200 0.0.0.0 Up DP从MAC地址表可以看到Leaf-1学到VM-A和VM-B的MAC都来自物理端口Eth1/2而VM-C和VM-D的MAC来自nve1接口也就是说Leaf-1通过VXLAN隧道学到了远端VTEP下的MAC。这说明二层桥接工作正常VNI的映射也没毛病。4.2 大包ping不过去的经典迷局第一次实验时我随便用默认包大小ping跨VNI地址是通的但一测大数据传输就卡顿。后来才发现是MTU问题。具体排查过程供你参考先用ping -s 1472测发现通再用ping -s 1473测发现不通对比1472和1473这两个数字1472 28ICMP头8字节 IP头20字节 1500正好是物理MTU。1473 28 1501超过物理MTU但因为VXLAN封装还需要额外50字节所以实际能扛的最大payload是1500 - 28 - 50 1422字节结论Underlay MTU必须加大解决办法是把设备物理接口和服务器网卡的MTU统一改成9000同时保证虚拟机的虚拟网卡MTU也同步调整。这样才能避免VXLAN封装后超过底层承载。很多生产事故的根源就在这里。4.3 网关MAC飘移引发的配置复盘实验里我碰到过一个问题VM-A第一次ping网关192.168.0.254通了等一段时间再ping突然不通。排查后发现Leaf-1和Leaf-2上Vlan100的MAC地址不一致——Leaf-1配置了anycast-gateway但Leaf-2漏配了fabric forwarding mode anycast-gateway导致Leaf-2的Vlan100 MAC是它自己生成的VM-A的ARP缓存里记录的还是Leaf-1的MAC当流量经过Leaf-2的网关时目的MAC对不上直接被丢弃。这个问题的排查过程很有价值VM-A:~# ping 192.168.0.254 PING 192.168.0.254 (192.168.0.254) 56(84) bytes of data. --- 192.168.0.254 ping statistics --- 3 packets transmitted, 0 received, 100% packet loss VM-A:~# ip neigh 192.168.0.254 dev eth0 lladdr 0050.0000.8888 REACHABLEVM-A的ARP表里网关MAC是0050.0000.8888而Leaf-1上Vlan100的MAC却是0050.0000.7777明显不一致。处理方式就是让两端都启用anycast-gateway然后用同一个虚拟MAC。重新配置后再看两端Vlan100的MAC地址就一模一样了。这就是分布式网关看起来简单、细节藏得深的典型体现。4.4 一个实用的分层排错顺序最后分享我的排错习惯。VXLAN网络出问题我不会一上来就看抓包而是按下面这个顺序逐层排查第一层Underlay连通性。Leaf上ping对端Loopback地址如果不通查OSPF邻居状态第二层NVE隧道状态。show nve vni看VNI是否Upshow nve peers看对端VTEP是否在线第三层二层表项。show mac address-table看远端MAC是否从nve1口学到第四层三层路由。show ip route看远端VNI网段的路由是否存在第五层终端侧。查VM的IP配置、ARP缓存和默认网关这套顺序很像盖楼从地基往上查每一步依赖上一步。大多数VXLAN问题只要Underlay正常、NVE状态Up、路由表也正确最终都能定位到某个配置细节上。5. 实验做完之后的进阶方向和几点真话如果你已经成功复现了上面的实验说明你已经掌握了VXLAN分布式网关的核心逻辑。接下来有几个方向可以继续深挖每个都值得单独开篇写文章我先简单提一下。5.1 从静态配置走向BGP EVPN我实验里用的是ingress-replication协议静态指定对端VTEP这种方式配置简单但不具备自动发现和自动学习能力。生产环境里VXLAN通常搭配BGP EVPNEthernet Virtual Private Network使用。EVPN通过BGP协议在VTEP之间通告MAC地址和路由信息取代了数据平面泛洪学习的方式收敛速度更快还支持多活网关、水平分割等高级特性。把这两者结合起来才是数据中心里真正的主流方案。从实验角度你可以在现有拓扑上把OSPF Underlay换成BGP再增加EVPN地址族配置看看MAC地址表从动态学习变成通过BGP邻居学习的过程理解为什么EVPN被称为控制平面而VXLAN被称为数据平面。5.2 数据库式对比集中式网关和分布式网关我把两种方案的关键特性做了个对比表方便你记住差异对比维度集中式网关分布式网关网关位置一台核心设备所有Leaf交换机东西向流量路径全部绕到核心就近转发网关故障影响全网三层中断仅影响本地Leaf网关MAC单一设备配置所有Leaf共享虚拟MAC扩展性受限于核心设备能力随Leaf数量线性扩展配置复杂度低较高需anycast网关配合做实验的时候你完全可以人为把集中式网关设备关机对比一下两种方案的故障表现。我敢说体验过分布式网关的恢复速度之后你绝不会再想回到集中式时代。5.3 最后说几句实在话这个实验看似只是几条命令但背后涉及的几个概念——Overlay与Underlay的区分、控制平面与数据平面的关系、Anycast Gateway的作用——都是网络虚拟化领域的基石。我建议你做完实验后把每个命令都问一遍为什么。比如为什么VNI要用24位而不是16位为什么Underlay要跑OSPF或BGP为什么网关MAC必须一致能把这几个问题用自己的话讲清楚你才算真正吃透了VXLAN分布式网关。另外提一句操作上的小经验所有配置命令建议先在文本编辑器里写好再批量粘贴到设备上尽量避免逐条手敲。Nexus的配置一旦敲错比如VNI没匹配、接口没no shutdown排查起来特别耗时间。我第二次做这个实验时全程半小时搞定就是吃了预习命令的亏。希望这篇实验笔记能帮你推开通往VXLAN的大门。做完实验再回头去看BGP EVPN、VPC、多租户这些内容你会发现所有知识点都能串成一条线那种感觉比单纯背命令痛快多了。