<p style="text-align:center;"> <img src="http://winteriscoming.cc/usr/uploads/2026/03/1084894582.png" alt="华三分布式EVPN网关拓扑图" style="max-width:100%;height:auto;border-radius:8px;box-shadow:0 2px 10px rgba(0,0,0,0.08);" /></p><h2>一、实验说明</h2><p>更适合小白食用<p><p> 这篇主要是记录一下我做的一个 H3C EVPN VXLAN 分布式网关实验,涉及 4 台设备:RTA、RTB、RTC、RTD。</p><p> 整体看下来,RTA 和 RTB 更像是接入侧 VTEP,主要负责二层业务接入、VSI 和 VXLAN 的绑定、分布式网关这些内容; RTC 这台更偏三层侧,主要看业务路由引入和三层互通;RTD 则是整个实验里的 EVPN 路由反射器(RR),负责把控制面路由组织起来。</p><p> 这套实验我感觉挺适合拿来入门 EVPN VXLAN,尤其是把 RR、VTEP、二层 VNI、三层 VNI 这些概念串起来看,会比单独背命令顺很多。</p><h2>二、设备角色说明</h2><ul> <li>RTA: 接入侧 VTEP,主要看二层业务、VXLAN 映射和分布式网关。</li> <li>RTB: 也是接入侧 VTEP,可以理解成和 RTA 对称的一侧,用来做跨 VXLAN 的二层互通。</li> <li>RTC: 这台更偏三层网关侧,重点看路由引入、L3 VNI 和三层互通。</li> <li>RTD: EVPN RR,也就是路由反射器,负责把几台设备的 EVPN 路由反射出去。</li></ul><h2>三、设备配置查看</h2><p>下面把几台设备的原始配置也放上来,点击文件名可以直接在当前页面弹窗查看,不用跳转:</p><ul> <li>查看 RTA.txt</li> <li>查看 RTB.txt</li> <li>查看 RTC.txt</li> <li>查看 RTD.txt</li></ul><h2>四、阅读建议</h2><p> 如果是第一次看这套配置,我建议不要一上来就直接从头到尾硬读,不然很容易被一堆命令绕进去。</p><ol> <li>先看 RTD,先把 RR 的邻居关系看清楚,知道谁和谁建了 EVPN 邻居,谁负责反射。</li> <li>再看 RTA 和 RTB,重点看 VSI、VNI、VTEP、分布式网关这些内容。</li> <li>最后看 RTC,把三层网关、L3 VNI、VPN 实例和业务互通串起来理解。</li></ol><p> 我自己看这类配置的时候,一般也是按这个顺序,不然很容易只见命令,不见整体逻辑。</p><h2>五、补充说明</h2><p> 下面这些点,是我觉得这套实验里最值得单独拎出来说的几个地方。很多时候不是命令难,而是概念容易混在一起。 所以这里我尽量按“人话”来整理一下,也方便后面自己回头看。</p><h3>1、group evpn internal 是什么意思</h3><p> 这个命令放在 BGP 下面看,其实就比较好理解了。</p><p> group evpn,可以理解成先建了一个名字叫 evpn 的邻居组; internal 表示这个组里的邻居都是 IBGP 邻居,也就是和本设备在同一个 AS 里。</p><p> 我的理解是,这个东西本质上就是为了省配置、也为了后面扩展方便。 比如有几台设备都要做 EVPN 邻居,很多公共属性其实是一样的,那就没必要一台一台单独敲,直接先建个组, 再把邻居拉进来就行。</p><p> 所以这里的重点不是“这条命令很神秘”,而是要明白:它本质上就是一个 IBGP 邻居模板组。</p><h3>2、peer evpn reflect-client 是干什么的</h3><p> 这个命令就很好理解了,关键点就两个字:反射。</p><p> RTD 在这里扮演的是 RR,也就是 EVPN 路由反射器。 peer evpn reflect-client 的意思,就是把这个邻居组里的设备都当成 RR Client。</p><p> 这样一来,RTA、RTB、RTC 不需要彼此全互联,它们只要都和 RTD 建邻就行。 某台设备把 EVPN 路由发给 RTD,RTD 再把这些路由反射给其他客户端。</p><p> 这个设计的好处很明显:</p><ul> <li>设备少的时候可能感受不明显;</li> <li>设备一多,如果全互联,邻居关系会非常乱;</li> <li>有了 RR 之后,控制面拓扑就清晰很多,扩容也方便。</li></ul><p> 所以我自己看这条命令的时候,通常不会死记“reflect-client”这个词,而是直接理解成: RTD 负责帮大家转发 EVPN 路由信息。</p><h3>3、vxlan tunnel mac-learning disable 的意义</h3><p> 这条命令如果只看字面,很容易觉得有点抽象。其实它想表达的意思很简单: 不要再依赖 VXLAN 隧道里的数据面报文去学习远端 MAC 了。</p><p> 传统 Flood-and-Learn 的思路,很多时候是靠报文来了再学; 但 EVPN 的思路更偏控制面,也就是通过 BGP EVPN 直接去分发 MAC/IP 可达信息。</p><p> 所以把这个功能关掉,可以理解成网络在明确告诉你:</p><ul> <li>远端 MAC 的学习,尽量别靠“听流量猜”;</li> <li>更希望通过 EVPN 控制面来学;</li> <li>这样泛洪会少一些,收敛和可控性也会更好一些。</li></ul><p> 这个点我觉得是 EVPN VXLAN 和传统 VXLAN 一个挺重要的区别。 你会发现,越往 EVPN 方向走,越强调“控制面提前知道”,而不是“数据面来了再学”。</p><h3>4、VSI / BD / VNI 到底是什么关系</h3><p> 这三个概念,是很多人一开始最容易混的地方。</p><p> 我现在更习惯这么理解:</p><ul> <li>VNI:就是 VXLAN 里的那个业务编号,可以理解成“隧道里带着走的标签”;</li> <li>VSI:设备本地的一个二层业务实例,理解成“这台设备上的一个虚拟交换域”就行;</li> <li>BD:桥接域,很多厂商会更常说这个词,本质上也是一个二层广播域的概念。</li></ul><p> 如果说得再直白一点:</p><p style="padding:10px 14px;background:#f6f8fa;border-left:4px solid #409eff;border-radius:6px;"> VSI / BD 更像是设备本地怎么看这个二层业务,VNI 更像是这个业务放到 VXLAN 隧道里之后对应的编号。</p><p> 所以很多时候,你会看到某个 VSI 下面去绑一个 VXLAN VNI。 这其实就是在说:把这个本地二层业务域,映射到某个 VXLAN 网络编号上。</p><p> 至于 VSI 和 BD,到底是不是完全一样,不同厂商实现会有些表达差异。 但在学习和看实验配置的时候,你完全可以先把它们都理解成“二层广播域”。</p><h3>5、二层 VNI 和三层 VNI 的区别</h3><p> 这个点真的很重要,很多时候一旦这里理顺了,后面的分布式网关、租户三层互通就顺了。</p><h4>(1)二层 VNI</h4><p> 二层 VNI 主要负责承载 二层业务。 你可以把它理解成:把同一个二层网段,通过 VXLAN 的方式延伸到不同设备上。</p><ul> <li>它对应的是二层广播域;</li> <li>更关注 MAC、ARP、主机二层可达;</li> <li>适合“同一网段跨设备延伸”的场景。</li></ul><h4>(2)三层 VNI</h4><p> 三层 VNI 就不一样了,它对应的已经不是简单的二层广播域,而是 一个租户的三层转发域。</p><ul> <li>它更偏向 VPN 实例、租户路由表这些概念;</li> <li>承载的是三层转发逻辑;</li> <li>适合不同子网之间的互通。</li></ul><h4>(3)我自己的记法</h4><p style="padding:10px 14px;background:#f6f8fa;border-left:4px solid #67c23a;border-radius:6px;"> 二层 VNI 管“同网段怎么延伸”,三层 VNI 管“不同网段怎么互通”。</p><p> 这么记我觉得最省脑子,也最不容易混。</p><h4>(4)再说得再通俗一点</h4><ul> <li>二层 VNI:更像是把一个 VLAN 的二层范围,通过 VXLAN 扩展到了别的设备;</li> <li>三层 VNI:更像是给一个租户准备了一套路由空间,让不同网段之间可以在 VXLAN 网络里转起来。</li></ul><h3>6、分布式网关和这些概念之间是什么关系</h3><p> 分布式网关这个东西,如果单独背定义,其实挺容易越背越绕。</p><p> 我自己的理解就是一句话:</p><p style="padding:10px 14px;background:#f6f8fa;border-left:4px solid #e6a23c;border-radius:6px;"> 让终端无论接到哪台 VTEP,上面都像有“同一个网关”在本地等着它。</p><p> 这样做的好处是,终端流量不用先绕去远端设备找网关,而是可以本地就完成网关转发。</p><p> 它通常会和这些东西一起配合:</p><ul> <li>二层 VNI:负责租户二层网段的延伸;</li> <li>三层 VNI:负责跨网段的三层转发;</li> <li>EVPN:负责把 MAC/IP 和路由信息发出去;</li> <li>VTEP:负责封装和解封装 VXLAN 报文。</li></ul><p> 所以整体逻辑可以简单理解成:</p><p style="padding:10px 14px;background:#f6f8fa;border-left:4px solid #f56c6c;border-radius:6px;"> 终端先接入本地 VTEP → 同网段流量靠二层 VNI 互通 → 跨网段流量在本地分布式网关做三层转发 → 再通过三层 VNI 和 EVPN 控制面把流量和路由带到对端。</p><h3>7、最后说一下我自己看这套配置时会重点盯哪些地方</h3><p> 如果后面我自己再回头看这套实验,我觉得最值得重点盯的还是下面这些点:</p><ul> <li>BGP EVPN 邻居关系:先看谁和谁建邻,谁是 RR,谁是 Client;</li> <li>VSI 配置:看每个业务二层域是怎么建的;</li> <li>VNI 绑定关系:看哪些是二层 VNI,哪些是三层 VNI;</li> <li>网关接口:看分布式网关地址是怎么落的;</li> <li>VPN 实例:看租户路由表是怎么组织的;</li> <li>EVPN 控制面:看 MAC/IP 和路由信息到底是怎么发布和学习的。</li></ul><p> 对我自己来说,这样去看会比只盯着单条命令更有效,因为命令本身其实只是表象,真正要弄明白的还是整套网络是怎么联动起来的。</p><div id="configModalMask" style="display:none;position:fixed;left:0;top:0;width:100%;height:100%;background:rgba(0,0,0,0.55);z-index:99998;"></div><div id="configModal" style="display:none;position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);width:82%;max-width:1120px;height:80%;background:#fff;border-radius:14px;box-shadow:0 10px 30px rgba(0,0,0,0.25);z-index:99999;overflow:hidden;"> <div style="height:60px;padding:0 20px;background:#f8f8f8;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-items:center;"> 配置文件 <div style="display:flex;align-items:center;gap:10px;"> 下载文件 <button type="button" onclick="copyConfigContent()" style="padding:8px 14px;background:#67c23a;color:#fff;border:none;border-radius:8px;font-size:14px;cursor:pointer;line-height:1;">复制内容</button> <span onclick="closeConfigModal()" style="cursor:pointer;font-size:34px;color:#666;line-height:1;margin-left:4px;">×</span> </div> </div> <div id="configModalScrollBox" style="height:calc(100% - 60px);overflow:auto;background:#fafafa;"> <pre id="configModalContent" style="margin:0;padding:22px;white-space:pre-wrap;word-break:break-word;font-family:Consolas,Monaco,'Courier New',monospace;font-size:14px;line-height:1.75;color:#222;">正在加载配置文件...</pre> </div></div><style>#configModalScrollBox::-webkit-scrollbar { width: 18px; height: 18px;}#configModalScrollBox::-webkit-scrollbar-track { background: #e5e7eb; border-radius: 10px;}#configModalScrollBox::-webkit-scrollbar-thumb { background: #9ca3af; border-radius: 10px; border: 3px solid #e5e7eb;}#configModalScrollBox::-webkit-scrollbar-thumb:hover { background: #6b7280;}#configModalScrollBox { scrollbar-width: auto; scrollbar-color: #9ca3af #e5e7eb;}</style><script>var currentConfigUrl = '';var currentConfigTitle = '';function openConfigModal(url, title) { currentConfigUrl = url; currentConfigTitle = title; document.getElementById('configModalTitle').innerText = title; document.getElementById('configModalContent').innerText = '正在加载配置文件...'; document.getElementById('configDownloadBtn').href = url; document.getElementById('configDownloadBtn').setAttribute('download', title); document.getElementById('configModalMask').style.display = 'block'; document.getElementById('configModal').style.display = 'block'; document.body.style.overflow = 'hidden'; fetch(url) .then(function(response) { if (!response.ok) { throw new Error('HTTP状态码:' + response.status); } return response.text(); }) .then(function(text) { document.getElementById('configModalContent').innerText = text; }) .catch(function(error) { document.getElementById('configModalContent').innerText = '配置文件加载失败\n\n可能原因:\n1. 文件路径不对\n2. 文件权限不足\n3. Web 服务未开放 txt 访问\n4. 文章内容中的 JS 被过滤\n\n错误信息:' + error; });}function closeConfigModal() { document.getElementById('configModalMask').style.display = 'none'; document.getElementById('configModal').style.display = 'none'; document.body.style.overflow = '';}function copyConfigContent() { var text = document.getElementById('configModalContent').innerText; if (!text || text === '正在加载配置文件...') { alert('当前没有可复制的配置内容'); return; } if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(text).then(function() { alert('配置内容已复制'); }).catch(function() { fallbackCopyText(text); }); } else { fallbackCopyText(text); }}function fallbackCopyText(text) { var textarea = document.createElement('textarea'); textarea.value = text; textarea.style.position = 'fixed'; textarea.style.left = '-9999px'; textarea.style.top = '0'; document.body.appendChild(textarea); textarea.focus(); textarea.select(); try { document.execCommand('copy'); alert('配置内容已复制'); } catch (err) { alert('复制失败,请手动复制'); } document.body.removeChild(textarea);}document.getElementById('configModalMask').onclick = closeConfigModal;document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { closeConfigModal(); }});</script>
最后修改:2026 年 03 月 16 日
© 允许规范转载