EVE-NG MPLS VPN 综合实验手册

EVE-NG ・ Cisco IOS ・ 贴近现网工程实践

MPLS L3VPN + 路由反射器 + 双栈 6VPE + DMVPN
综合实验手册

以一台"运营商骨干 + 多客户 VPN + 企业 DMVPN 叠加网"为蓝本,15 台路由器从零搭起,打通 IPv4 / IPv6 双栈,覆盖 MP-BGP 多协议簇、路由反射器、Route-Target 约束、Add-Path / PIC、SoO / AS-Override、6PE / 6VPE、OSPF Sham-Link、DMVPN Phase 3 + IKEv2 加密、MPLS TE、QoS 与故障演练。

MPLS L3VPN / 6VPERoute ReflectorMP-BGP 多协议簇 RTC / Add-Path / PICIPv4 + IPv6 双栈DMVPN Phase 3 IKEv2 over GRESham-LinkMPLS TE / QoS故障演练
15台路由器
AS 65000运营商骨干
3个客户 VPN
2台路由反射器
10个实验阶段
≈8-12h完整通关耗时

第 0 章 · 阅读指南

0.1 这本手册适合谁

  • 已经会配 OSPF/BGP/静态路由,想系统啃下 MPLS L3VPN 的人;
  • 准备考 CCIE EI / SP,或做运营商、金融、大型企业网项目的工程师;
  • 需要在 EVE-NG 上复现一套"能讲清楚、能演示、能排错"的完整环境做内训的人。

0.2 读完你能获得什么

① 架构能力

能独立设计一套带 RR、双栈、多 VRF 的 MPLS 骨干,讲清每个设计决策的取舍。

② 配置能力

拿到一份客户需求(站点数、地址、双栈、是否有后门链路),能直接落成配置。

③ 排错能力

知道"Ping 不通"时应该先查 LDP 还是先查 RT,形成肌肉记忆般的排查路径。

0.3 怎么读

建议严格按顺序做。每个阶段结束都有验证清单必须全绿再往下走——MPLS VPN 的问题往往不是"某一步配错",而是"上一步没真正通,带病往下走,最后一团乱麻"。第 9 章提供了"最小可跑子集",如果你的机器内存不够 15 台全开,可以先跑核心 6 台。

0.4 约定与图例

标记含义
原理用大白话解释"为什么这么设计",赶时间也不能跳
注意配置里的坑,踩过的人都懂
版本命令与 IOS 版本相关,IOSv 上可能不支持,需换镜像
验证必须执行的检查命令与预期结果
10.0.0.21等宽字体 = 地址 / 配置 / 命令行输出

所有配置段落都可以一键复制(右上角按钮)。命令逐行粘贴即可,不需要连着注释一起粘——注释行以 !# 开头,IOS 会自动忽略。

第 1 章 · 总体架构设计

1.1 先讲清楚:这套网络在"演"什么

我们把现实世界压缩进一张拓扑里,角色如下:

  • 运营商 ISP(AS 65000):2 台 P 路由器只负责高速转发,4 台 PE 路由器负责接入客户,2 台 RR 只跑 BGP、不碰转发。这就是典型的"控制平面与转发平面分离"。
  • 客户 A(CORP-A,AS 65001):两个站点都要 IPv4 + IPv6,走 eBGP 与 PE 对接。两个站点用了同一个 AS 号——这是真实世界里最常见的麻烦,我们用 as-override 解决。
  • 客户 B(CORP-B,AS 65002):走 OSPF / OSPFv3 与 PE 对接,并且两个站点之间偷偷拉了一条后门链路。这条后门会让路由"抄近路"绕过 MPLS,我们用 Sham-Link 纠正。
  • 客户 C(BRANCH,AS 65003):总部 + 两个分支。MPLS VPN 只给它提供"底层可达",真正的业务流量跑在 DMVPN 加密 Overlay 上,分支之间可以动态建隧道直连(不用绕总部)。

1.2 全网拓扑

AS 65000 ・ 运营商 MPLS 骨干(OSPF + LDP + MP-BGP) 10.0.1.0/30 10.0.2.0/30 10.0.3.0/30 10.0.4.0/30 10.0.5.0/30 10.0.6.0/30 10.0.7.0/30 10.0.9.0/30 10.0.8.0/30 · PE1↔PE4 冗余 / TE 备份 PE110.0.0.21 PE210.0.0.22 PE310.0.0.23 PE410.0.0.24 P110.0.0.11 P210.0.0.12 RR110.0.0.1 RR210.0.0.2 CE-A1AS65001 站点1 CE-A2AS65001 站点2 CE-B1AS65002 站点1 CE-B2AS65002 站点2 SPOKE1AS65003 分支 SPOKE2AS65003 分支 HUBAS65003 总部 客户 B 后门链路 172.20.99.0/24(Sham-Link 实验用,第 5 章启用) PE 边缘 P 核心 RR 反射器 客户 A 客户 B DMVPN
图 1-1 全网逻辑拓扑(15 台路由器)

1.3 三个必须理解的设计决策

原理 为什么放两台 RR,而且它们不在转发路径上? iBGP 要求"全互联",N 台 PE 就需要 N(N-1)/2 条会话。4 台 PE 只要 6 条还能忍,40 台就是 780 条——不可维护。路由反射器让所有 PE 只跟 RR 建会话,由 RR 把路由"反射"给其他人。

关键点是:RR 只处理路由,不转发数据包。PE 从 RR 学到的 VPNv4 路由,下一跳仍然是原来那台 PE 的 loopback(所以 RR 上【绝对不要】配 next-hop-self),数据包走 LDP 隧道直达那台 PE,根本不经过 RR。这就是为什么 RR 可以挂在 P 路由器旁边、只给它 1 条上行链路。
原理 为什么 IPv6 不单独建一套 MPLS? 给 IPv6 再跑一遍 LDPv6 / RSVP-TE 是很重的事。工程上主流做法是 6VPE:MP-BGP 用 vpnv6 地址族传递客户的 IPv6 路由,但下一跳写成 IPv4-mapped 地址(::FFFF:10.0.0.21),于是 IPv6 数据包依然沿着 IPv4 的 LDP 隧道走。也就是说:核心只需要 IPv4 的 LDP,就能同时承载 IPv4 VPN 和 IPv6 VPN

本手册第 3 章还会额外演示 6PE(用 BGP 标签分发为 IPv6 公网路由建 LSP),让你看清 6PE 与 6VPE 的区别。
原理 为什么 DMVPN 要"架在 MPLS 之上"? MPLS VPN 是运营商的"专车",安全但贵、且分支之间必须绕总部。DMVPN 是企业在专车之上自己搭的"加密直连网":分支之间可以按需直接建隧道(Spoke-to-Spoke),流量还被 IKEv2/IPsec 加密。这种 MPLS 打底 + DMVPN 叠加 的架构在金融、连锁零售里极其常见。本实验里,DMVPN 的底层(NBMA 地址 172.16.100.0/24)就跑在 VRF BRANCH 这张 MPLS VPN 里。

1.4 设备角色清单

设备角色Loopback0 (v4 / v6)运行协议承担的实验点
RR1 / RR2路由反射器(Cluster 10.0.0.100)10.0.0.1 / fd00::1
10.0.0.2 / fd00::2
OSPF、MP-BGPRR、RTC、Add-Path、GR
P1 / P2核心 P(纯转发)10.0.0.11 / fd00::11
10.0.0.12 / fd00::12
OSPF、LDPLDP、IGP-LDP 同步、TE
PE1边缘 PE10.0.0.21 / fd00::21OSPF、LDP、MP-BGPVRF CORP-A、BRANCH、SoO、AS-Override
PE2边缘 PE10.0.0.22 / fd00::22同上VRF CORP-B(OSPF PE-CE)、Sham-Link
PE3边缘 PE10.0.0.23 / fd00::23同上VRF CORP-A 站点 2、BGP PIC
PE4边缘 PE10.0.0.24 / fd00::24同上VRF CORP-B、BRANCH Hub 侧、6PE
CE-A1 / CE-A2客户 A 站点(AS 65001)192.168.255.1 / .2eBGP 双栈同 AS 多站点、allowas-in 对比
CE-B1 / CE-B2客户 B 站点(AS 65002)172.20.255.1 / .2OSPFv2/OSPFv3后门链路、Sham-Link、DN 位
HUB / SPOKE1 / SPOKE2客户 C(AS 65003)172.16.100.1/.11/.12mGRE、NHRP、IPsec、EIGRPDMVPN Phase 3、双栈、加密

1.5 地址规划总表

地址规划看起来枯燥,但它是整个实验能不能一次跑通的分水岭。建议严格照抄,跑通之后再改成你自己的。

① 骨干链路(10.0.L.0/30 + fd00:L::/64)

链路号本端接口对端接口IPv4IPv6
L1PE1Gi0/0P1Gi0/010.0.1.0/30fd00:1::/64
L2PE2Gi0/0P1Gi0/110.0.2.0/30fd00:2::/64
L3PE3Gi0/0P2Gi0/010.0.3.0/30fd00:3::/64
L4PE4Gi0/0P2Gi0/110.0.4.0/30fd00:4::/64
L5P1Gi0/2P2Gi0/210.0.5.0/30fd00:5::/64
L6RR1Gi0/0P1Gi0/310.0.6.0/30fd00:6::/64
L7RR2Gi0/0P2Gi0/310.0.7.0/30fd00:7::/64
L8PE1Gi0/1PE4Gi0/110.0.8.0/30fd00:8::/64
L9RR1Gi0/1RR2Gi0/110.0.9.0/30fd00:9::/64

规律:网段第 3 字节 = 链路号;.1 = 表格里"本端",.2 = "对端"。IPv6 的 ::1 / ::2 同理。

② PE-CE 链路(10.1.X.0/30 + 2001:db8:1:X::/64)

本端(PE)接口对端(CE)IPv4IPv6VRF
PE1Gi0/2CE-A1 Gi0/010.1.1.0/302001:db8:1:1::/64CORP-A
PE2Gi0/1CE-B1 Gi0/010.1.2.0/302001:db8:1:2::/64CORP-B
PE3Gi0/1CE-A2 Gi0/010.1.3.0/302001:db8:1:3::/64CORP-A
PE4Gi0/2CE-B2 Gi0/010.1.4.0/302001:db8:1:4::/64CORP-B
PE1Gi0/3SPOKE1 Gi0/010.1.11.0/302001:db8:1:11::/64BRANCH
PE2Gi0/2SPOKE2 Gi0/010.1.12.0/302001:db8:1:12::/64BRANCH
PE4Gi0/3HUB Gi0/010.1.14.0/302001:db8:1:14::/64BRANCH

规律:PE 侧永远是 .1,CE 侧永远是 .2。

③ VRF / RD / RT 规划

VRF 名称客户RDRT(import/export)PE-CE 协议说明
CORP-A客户 A65000:10065000:100eBGP 双栈同 AS 两站点 → as-override
CORP-B客户 B65000:20065000:200OSPFv2 + OSPFv3有后门链路 → Sham-Link
BRANCH客户 C65000:30065000:300eBGP(underlay)DMVPN 的底层承载网

④ 客户业务地址

站点设备IPv4 LANIPv6 LAN用途
A 站点1CE-A1 Lo10192.168.11.0/242001:db8:a:11::/64客户 A 业务
A 站点2CE-A2 Lo10192.168.12.0/242001:db8:a:12::/64客户 A 业务
B 站点1CE-B1 Lo10172.20.11.0/242001:db8:b:11::/64客户 B 业务
B 站点2CE-B2 Lo10172.20.12.0/242001:db8:b:12::/64客户 B 业务
B 后门CE-B1↔CE-B2172.20.99.0/242001:db8:b:99::/64Sham-Link 实验
C 总部 LANHUB Lo10192.168.20.0/242001:db8:c:20::/64DMVPN 总部
C 分支1 LANSPOKE1 Lo10192.168.21.0/242001:db8:c:21::/64DMVPN 分支
C 分支2 LANSPOKE2 Lo10192.168.22.0/242001:db8:c:22::/64DMVPN 分支
C UnderlayLo100(VRF UNDERLAY)172.16.100.0/242001:db8:100:ffff::/64NBMA / 隧道源
C OverlayTunnel010.100.0.0/242001:db8:100::/64GRE 隧道内层

1.6 阶段路线图

阶段内容产出预计
EVE-NG 工程搭建、镜像与基础优化15 台设备可 Telnet、可保存40 min
骨干 IGP:OSPFv2 + OSPFv3 双栈所有 Loopback 互通30 min
LDP 标签分发 + 6PE 标签 BGPIPv4/IPv6 LSP 打通30 min
MP-BGP + 双 RR + RTCVPNv4/VPNv6 会话 Established45 min
6VPE 客户 A(eBGP 双栈)A 站点互 ping(v4+v6)40 min
客户 B(OSPF PE-CE + Sham-Link)后门链路不再"抄近路"45 min
DMVPN Phase 3 + IKEv2 + 双栈分支直连隧道、加密生效60 min
BGP/MPLS 高级特性工厂Add-Path、PIC、SoO、TE、QoS60 min
全网验证 + 8 个故障演练端到端验收通过50 min
扩展:Inter-AS / EVPN / SR 迁移知道下一步学什么20 min

第 2 章 · EVE-NG 环境搭建

2.1 镜像怎么选

镜像EVE-NG 模板名内存/台MPLS6VPEDMVPN评价
Cisco IOSv
vios-adventerprisek9-m
Cisco IOSv384–512 MB首选 轻、启动快、功能够
CSR1000v
csr1000v-universalk9
Cisco CSR1000v3–4 GB功能最新,但太吃内存,建议只给 DMVPN 三台用
Cisco IOLCisco IOL128–256 MB部分部分省资源神器,但特性不全,DMVPN IPv6 可能缺命令
Cisco IOS-XRvCisco XRv3 GB想练运营商真机命令可选,本手册以 IOS 语法为主
注意 关于 IOSv 的两个真实限制 ① 部分 IOSv 镜像的 ipv6 nhrp 命令不全。第 7 章如果发现 ipv6 nhrp map 打不出来,请把 HUB/SPOKE 三台换成 CSR1000v(或 IOS-XE 16.9+)。
② IOSv 对 mpls traffic-eng 的部分子命令支持不完整,第 8 章 TE 实验若报错属正常,理解原理即可。
③ 本手册所有配置以 IOS 15.6(2)T ~ 15.9(3)M 语法 为准,并标注了 IOS-XE 的差异。

2.2 主机资源规划

配置档内存CPU磁盘能跑什么
推荐32 GB8 核 + 开嵌套虚拟化120 GB SSD15 台全开,流畅
够用16 GB4 核80 GB SSD15 台全开(IOSv 设 384 MB),略卡
将就8 GB4 核60 GB只跑核心 8 台 + 客户 A(第 9.1 节有裁剪方案)

EVE-NG 节点内存修改:右键节点 → EditMemory 改成 384512CPUs 保持 1Idle-PC 见 2.4 节。

2.3 建工程与连线

  1. 新建 Lab:EVE-NG 主界面 → Add new lab → 名称 MPLS-VPN-LAB,Version 保持默认。
  2. 拖节点:左侧 Add an objectNode → 模板选 Cisco IOSv → 数量 15 → Save。然后逐个右键 Edit 改 Hostname 和 Icon。
  3. 连线:点工具栏插头图标,按 1.5 节的链路表逐条连接(先连骨干 L1–L9,再连 PE-CE)。连完可以点 More actions → Show/Hide interface names 核对。
  4. 启动:先只启动 P1 P2 RR1 RR2,等 2 分钟 CPU 降下来;再启动 PE1–PE4;最后启动所有 CE。不要 15 台同时 Start,否则 IOSv 的 crypto key 生成会拖死 CPU,出现大量 %SYS-3-CPUHOG 甚至误判崩溃。
完整连线对照表(照着连,一格不差)
本端设备本端接口对端设备对端接口网段备注
PE1Gi0/0P1Gi0/010.0.1.0/30骨干
PE1Gi0/1PE4Gi0/110.0.8.0/30冗余 / TE
PE1Gi0/2CE-A1Gi0/010.1.1.0/30CORP-A
PE1Gi0/3SPOKE1Gi0/010.1.11.0/30BRANCH
PE2Gi0/0P1Gi0/110.0.2.0/30骨干
PE2Gi0/1CE-B1Gi0/010.1.2.0/30CORP-B
PE2Gi0/2SPOKE2Gi0/010.1.12.0/30BRANCH
PE3Gi0/0P2Gi0/010.0.3.0/30骨干
PE3Gi0/1CE-A2Gi0/010.1.3.0/30CORP-A
PE4Gi0/0P2Gi0/110.0.4.0/30骨干
PE4Gi0/2CE-B2Gi0/010.1.4.0/30CORP-B
PE4Gi0/3HUBGi0/010.1.14.0/30BRANCH
P1Gi0/2P2Gi0/210.0.5.0/30核心横联
P1Gi0/3RR1Gi0/010.0.6.0/30RR 接入
P2Gi0/3RR2Gi0/010.0.7.0/30RR 接入
RR1Gi0/1RR2Gi0/110.0.9.0/30RR 互联
CE-B1Gi0/1CE-B2Gi0/1172.20.99.0/24后门(第 6 章才启用)

2.4 三个必做的优化(否则你会崩溃)

① 设置 idle-pc(CPU 从 100% 降到 5%)

IOSv 默认空转会吃满一个核,15 台就是 15 核。必须算 idle-pc:
右键节点 → Idle-PC → 等待计算 → 选一个带 * 的值 → Save
批量做法:SSH 到 EVE-NG,执行 /opt/unetlab/wrappers/unl_wrapper -a fix_permissions 后用 UI 逐个设置,或装 eve-ng-tools 批量刷。做完全体 CPU 占用应低于 30%。

② 关闭 DNS 解析(输错命令不用等 30 秒)

全局基础模板 · 所有设备通用
!===========================================================
! 基础模板 BASE —— 15 台设备全部先刷这一份
!===========================================================
configure terminal
!
hostname RENAME-ME
!
no ip domain lookup
ip domain name lab.mpls
!
service timestamps debug datetime msec
service timestamps log datetime msec
service password-encryption
!
! --- 关闭烦人的控制台打断 ---
line con 0
 exec-timeout 0 0
 logging synchronous
 length 0
!
line vty 0 4
 exec-timeout 0 0
 logging synchronous
 transport input telnet ssh
 privilege level 15
 no login
!
! --- 关闭自动告警(IOSv 常见刷屏)---
no logging console
!
end
write memory

③ 打开 IPv6 与 CEF

每台都要 ipv6 unicast-routingip cef(默认开)。MPLS 设备还要 mpls label protocol ldp。忘了 ipv6 unicast-routing 是新手最常见的"IPv6 配了但不通"的原因。

2.5 批量刷配置的小技巧

15 台设备手工敲 hostname 很痛苦,推荐两种方式:

  • 方式 A(推荐):先在一台设备上把配置写好,show running-config 复制出来,然后在 EVE-NG 里右键节点 → Edit → 把配置粘贴进 Startup-config(需要先用 Nodes → Edit config 或 Web 的 Custom startup config)。重启即生效。
  • 方式 B:每台设备 write memory 后,在 EVE-NG 主界面 More actions → Export all CFGs 一次性导出全部配置做备份(强烈建议每完成一个阶段就导出一次,命名 stage3.zip)。回滚时 Import CFGs
  • 方式 C:熟练后用 Telnet 脚本批量下发(Python + telnetlib),附录 C 给了脚本框架。

2.6 建议的抓包点

EVE-NG 支持在任意链路上右键 → Capture 直接拉起 Wireshark。下面几个位置抓一次,理解会瞬间加深:

抓包位置能看到什么什么时候抓
PE1↔P1MPLS 标签头(0x8847)、双层标签栈、LDP Hello第 3 章建完 LDP
PE1↔CE-A1纯 IP 报文,没有 MPLS 标签第 5 章通业务后对比看
RR1↔P1BGP Update 携带 VPNv4 NLRI + Extended Community第 4 章建完 MP-BGP
SPOKE1↔SPOKE2 路径GRE 外层是 underlay IP,内层是 overlay IP / IPv6第 7 章 DMVPN Phase 3

第 3 章 · 骨干基础:IGP 与 LDP

原理 MPLS 骨干只需要做两件事 MPLS VPN 的转发依赖两个平面:
控制平面:IGP 让所有 Loopback 互相可达 → LDP 给每个 Loopback 发标签 → MP-BGP 用这些 Loopback 建会话、传 VPN 路由。
转发平面:PE 收到普通 IP 包 → 查 VRF 找到 VPN 路由 → 压入两层标签(外层=到对端 PE 的 LDP 标签,内层=对端 PE 分配的 VPN 标签)→ 核心 P 路由器只看外层标签做交换,完全不查 IP 路由表。

所以顺序必须是:先 IGP,再 LDP,最后 MP-BGP。IGP 不通,LDP 建不起来;LDP 不通,BGP 路由就算是"最优"也装不进转发表。

3.1 接口与寻址(P1 范例)

骨干接口统一用 /30,并强制 point-to-point 网络类型——省掉 DR/BDR 选举,收敛更快。IPv6 用 /64,与 IPv4 一一对应。

P1完整基础配置(IGP + LDP)
!===========================================================
! P1 —— 核心 P 路由器:只跑 IGP + LDP,不接客户
!===========================================================
configure terminal
!
hostname P1
!
ip cef
ipv6 unicast-routing
ipv6 cef
!
!---------- Loopback(LDP router-id 与 BGP next-hop 的载体)----------
interface Loopback0
 ip address 10.0.0.11 255.255.255.255
 ip ospf 1 area 0
 ipv6 address fd00::11/128
 ipv6 ospf 1 area 0
!
!---------- 到 PE1(链路 L1)----------
interface GigabitEthernet0/0
 description ## CORE: P1 Gi0/0  <-->  PE1 Gi0/0 ##
 ip address 10.0.1.2 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:1::2/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 mpls ip
 no shutdown
!
!---------- 到 PE2(链路 L2)----------
interface GigabitEthernet0/1
 description ## CORE: P1 Gi0/1  <-->  PE2 Gi0/0 ##
 ip address 10.0.2.2 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:2::2/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 mpls ip
 no shutdown
!
!---------- 到 P2(链路 L5,核心横联)----------
interface GigabitEthernet0/2
 description ## CORE: P1 Gi0/2  <-->  P2 Gi0/2 ##
 ip address 10.0.5.1 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:5::1/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 mpls ip
 no shutdown
!
!---------- 到 RR1(链路 L6)----------
interface GigabitEthernet0/3
 description ## CORE: P1 Gi0/3  <-->  RR1 Gi0/0 ##
 ip address 10.0.6.2 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:6::2/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 no shutdown
!
!---------- IGP:OSPFv2 ----------
router ospf 1
 router-id 10.0.0.11
 passive-interface Loopback0
 log-adjacency-changes
 auto-cost reference-bandwidth 100000
 timers throttle spf 50 200 5000
 timers throttle lsa 50 200 5000
!
!---------- IGP:OSPFv3(IPv6)----------
router ospfv3 1
 router-id 10.0.0.11
 log-adjacency-changes
!
!---------- MPLS / LDP ----------
mpls label protocol ldp
mpls ldp
 router-id Loopback0 force
 !
 ! 链路抖动时保住 LDP 会话,避免标签重新收敛(现网必备)
 session protection for CORE-LDP duration 120
 !
 ! IGP 与 LDP 同步:接口起来但 LDP 还没就绪时,OSPF 先不通告该链路
 ! 防止"黑洞":流量被 IGP 引到一条还没有标签的链路上
!
router ospf 1
 mpls ldp sync
!
!---------- 快速检测(可选但强烈推荐)----------
interface range GigabitEthernet0/0 - 3
 bfd interval 300 min_rx 300 multiplier 3
!
router ospf 1
 bfd all-interfaces
!
end
write memory
注意 四条容易翻车的点session protection for CORE-LDP 里的 CORE-LDP 是一个 ACL 名字,需要先定义: ip access-list standard CORE-LDP / permit 10.0.0.0 0.0.255.255。不想配 ACL 就直接写 session protection(对所有邻居生效)。
mpls ldp sync 会导致接口起来后 OSPF 邻居要等 LDP 收敛才 FULL,初学者常误以为"OSPF 挂了"。如果第一次跑想简化,可以先不加,第 8 章再加回来。
auto-cost reference-bandwidth 100000 必须在所有路由器上一致,否则开销计算错位。
④ 如果你的 IOS 不接受 router ospfv3 1 下的 router-id,请改成: router ospfv3 1 / address-family ipv6 unicast / router-id 10.0.0.11。同理,接口下也可用新语法 ospfv3 1 ipv6 area 0 替代 ipv6 ospf 1 area 0

3.2 P2 / RR1 / RR2 的骨干部分

结构完全对称,只需按地址表替换。下面给出可以直接粘的完整片段。

P2完整基础配置
configure terminal
hostname P2
ip cef
ipv6 unicast-routing
ipv6 cef
!
interface Loopback0
 ip address 10.0.0.12 255.255.255.255
 ip ospf 1 area 0
 ipv6 address fd00::12/128
 ipv6 ospf 1 area 0
!
interface GigabitEthernet0/0
 description ## P2 Gi0/0  <-->  PE3 Gi0/0 ##
 ip address 10.0.3.2 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:3::2/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 mpls ip
 no shutdown
!
interface GigabitEthernet0/1
 description ## P2 Gi0/1  <-->  PE4 Gi0/0 ##
 ip address 10.0.4.2 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:4::2/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 mpls ip
 no shutdown
!
interface GigabitEthernet0/2
 description ## P2 Gi0/2  <-->  P1 Gi0/2 ##
 ip address 10.0.5.2 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:5::2/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 mpls ip
 no shutdown
!
interface GigabitEthernet0/3
 description ## P2 Gi0/3  <-->  RR2 Gi0/0 ##
 ip address 10.0.7.2 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:7::2/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 no shutdown
!
router ospf 1
 router-id 10.0.0.12
 passive-interface Loopback0
 log-adjacency-changes
 auto-cost reference-bandwidth 100000
!
router ospfv3 1
 router-id 10.0.0.12
!
mpls label protocol ldp
mpls ldp
 router-id Loopback0 force
 session protection
!
end
write memory
RR1基础配置(BGP 部分见第 4 章)
configure terminal
hostname RR1
ip cef
ipv6 unicast-routing
ipv6 cef
!
interface Loopback0
 ip address 10.0.0.1 255.255.255.255
 ip ospf 1 area 0
 ipv6 address fd00::1/128
 ipv6 ospf 1 area 0
!
interface GigabitEthernet0/0
 description ## RR1 Gi0/0  <-->  P1 Gi0/3 ##
 ip address 10.0.6.1 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:6::1/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 no shutdown
!
interface GigabitEthernet0/1
 description ## RR1 Gi0/1  <-->  RR2 Gi0/1 ##
 ip address 10.0.9.1 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:9::1/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 no shutdown
!
router ospf 1
 router-id 10.0.0.1
 passive-interface Loopback0
 log-adjacency-changes
 auto-cost reference-bandwidth 100000
!
router ospfv3 1
 router-id 10.0.0.1
!
! RR 不在转发路径上,【不需要】启用 MPLS / LDP
! 这也是 RR 可以低成本部署的原因
!
end
write memory
RR2基础配置(BGP 部分见第 4 章)
configure terminal
hostname RR2
ip cef
ipv6 unicast-routing
ipv6 cef
!
interface Loopback0
 ip address 10.0.0.2 255.255.255.255
 ip ospf 1 area 0
 ipv6 address fd00::2/128
 ipv6 ospf 1 area 0
!
interface GigabitEthernet0/0
 description ## RR2 Gi0/0  <-->  P2 Gi0/3 ##
 ip address 10.0.7.1 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:7::1/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 no shutdown
!
interface GigabitEthernet0/1
 description ## RR2 Gi0/1  <-->  RR1 Gi0/1 ##
 ip address 10.0.9.2 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:9::2/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 no shutdown
!
router ospf 1
 router-id 10.0.0.2
 passive-interface Loopback0
 log-adjacency-changes
 auto-cost reference-bandwidth 100000
!
router ospfv3 1
 router-id 10.0.0.2
!
end
write memory

3.3 PE 路由器的骨干部分

PE 比 P 多了三样东西:VRF面向 CE 的接口MP-BGP。这一节只做骨干接口(VRF 和 BGP 放第 4、5 章)。四台 PE 结构一致,下面以 PE1 为例,其余三台给出差异表。

PE1骨干接口 + IGP + LDP(VRF / BGP 见后章)
configure terminal
hostname PE1
ip cef
ipv6 unicast-routing
ipv6 cef
!
mpls label protocol ldp
mpls ldp
 router-id Loopback0 force
 session protection
!
interface Loopback0
 ip address 10.0.0.21 255.255.255.255
 ip ospf 1 area 0
 ipv6 address fd00::21/128
 ipv6 ospf 1 area 0
!
!---------- 到 P1(L1)----------
interface GigabitEthernet0/0
 description ## PE1 Gi0/0  <-->  P1 Gi0/0 ##
 ip address 10.0.1.1 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:1::1/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 mpls ip
 no shutdown
!
!---------- 到 PE4(L8,冗余 / TE 备份路径)----------
! 注意:这条链路参与 IGP,会让 PE1-PE4 之间出现一条"不经 P"的直连路径
! 第 8 章做 MPLS TE 时会用它,前期先配好
interface GigabitEthernet0/1
 description ## PE1 Gi0/1  <-->  PE4 Gi0/1 ##
 ip address 10.0.8.1 255.255.255.252
 ip ospf network point-to-point
 ip ospf 1 area 0
 ipv6 address fd00:8::1/64
 ipv6 ospf network point-to-point
 ipv6 ospf 1 area 0
 mpls ip
 no shutdown
!
router ospf 1
 router-id 10.0.0.21
 passive-interface Loopback0
 log-adjacency-changes
 auto-cost reference-bandwidth 100000
!
router ospfv3 1
 router-id 10.0.0.21
!
end
write memory
设备骨干接口配置(照 PE1 改地址即可)
PE2Lo0 10.0.0.22 / fd00::22  Gi0/0 = 10.0.2.1/30 · fd00:2::1/64 → P1 Gi0/1
PE3Lo0 10.0.0.23 / fd00::23  Gi0/0 = 10.0.3.1/30 · fd00:3::1/64 → P2 Gi0/0
PE4Lo0 10.0.0.24 / fd00::24  Gi0/0 = 10.0.4.1/30 · fd00:4::1/64 → P2 Gi0/1
           Gi0/1 = 10.0.8.2/30 · fd00:8::2/64 → PE1 Gi0/1

3.4 6PE:用 BGP 给 IPv6 也建一条"标签隧道"

原理 6PE 和 6VPE 到底差在哪
  • 6PE:传递的是公网 IPv6 路由(全局表)。PE 用 address-family ipv6 + send-label 给 IPv6 前缀同时分发标签,下一跳写成 ::FFFF:10.0.0.21(IPv4-mapped),于是核心仍走 IPv4 LDP。适合"运营商要开 IPv6 上网业务"。
  • 6VPE:传递的是客户 VPN 的 IPv6 路由,用 vpnv6 地址族,带 RD/RT、放进 VRF。适合"客户要开 IPv6 专网"。
本实验两个都做:6PE 让骨干自己能跑 IPv6 公网6VPE 让客户的 IPv6 站点互通

在每台 PE 上追加(RR 上也要配套,见第 4 章):

PE16PE:BGP 标签分发
configure terminal
!
! 模拟一个"IPv6 公网客户",直接挂在 PE1 上
interface Loopback66
 description ## 6PE demo: 模拟 IPv6 公网前缀 ##
 ipv6 address 2001:db8:aaaa::1/64
!
router bgp 65000
 ! 关键:IPv6 单播地址族 + send-label,让 BGP 同时通告前缀和标签
 address-family ipv6 unicast
  network fd00::21/128
  network 2001:db8:aaaa::/64
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.1 send-label
  neighbor 10.0.0.2 activate
  neighbor 10.0.0.2 send-label
 exit-address-family
!
end
write memory
注意 6PE 最容易被忽略的一条 RR 上也必须配 send-label,否则 RR 反射时会把标签丢掉,PE 学到的 IPv6 路由没有标签 → 有路由但转发不通(典型"看得见、ping 不通")。第 4 章的 RR 配置里已经包含这一行,别删。

3.5 阶段验证(必须全绿

在继续之前,请逐条执行并核对结果。任何一条红了,先解决问题再看下一章。

命令预期结果
show ip ospf neighbor每台设备的每个骨干口都有 1 个 FULL 邻居;P1 应有 4 个(PE1/PE2/P2/RR1)
show ipv6 ospf neighbor与 v4 对等,状态 FULL
show ip route ospf能看到全部 8 个 /32 Loopback 路由(10.0.0.1/2/11/12/21-24)
show ipv6 route ospf能看到全部 fd00::X/128
show mpls ldp neighbor每个启了 mpls ip 的接口对端都出现,State = Operational
show mpls forwarding-table每个 10.0.0.X/32 都有出标签(Local/Outgoing 都有值)
ping 10.0.0.24 source 10.0.0.21PE1 → PE4 通(!!!!)
ping fd00::24 source fd00::21IPv6 通
traceroute 10.0.0.24 source 10.0.0.21中间跳数 = 2(PE1 → P1 → P2 → PE4)
参考输出 · P1 上的 LDP 邻居与标签表
P1# show mpls ldp neighbor
    Peer LDP Ident: 10.0.0.21:0; Local LDP Ident 10.0.0.11:0
        TCP connection: 10.0.0.21.646 - 10.0.0.11.23741
        State: Oper; Msgs sent/rcvd: 42/41; Downstream
        Up time: 00:12:33
        LDP discovery sources:
          GigabitEthernet0/0, Src IP addr: 10.0.1.1

P1# show mpls forwarding-table
Local      Outgoing   Prefix           Bytes Label   Outgoing   Next Hop
Label      Label      or Tunnel Id     Switched      interface
16         Pop Label  10.0.0.1/32      0             Gi0/3      10.0.6.1
17         Pop Label  10.0.0.21/32     0             Gi0/0      10.0.1.1
18         Pop Label  10.0.0.22/32     0             Gi0/1      10.0.2.1
19         19         10.0.0.12/32     0             Gi0/2      10.0.5.2
20         20         10.0.0.23/32     0             Gi0/2      10.0.5.2
21         21         10.0.0.24/32     0             Gi0/2      10.0.5.2
22         Pop Label  10.0.0.2/32      0             Gi0/2      10.0.5.2
看懂这张表 Pop Label 是什么意思? MPLS 有一个优化叫 PHP(倒数第二跳弹出):到 10.0.0.21 的包,P1 是"倒数第二跳",它直接把外层标签弹掉,PE1 收到的就是纯 IP 包,少查一次表。
10.0.0.24(PE4)对 P1 来说隔了 P2,所以 Outgoing 是 21——P1 把标签换成 21 再发给 P2。这就是"标签交换"。

3.6 排错速查

现象最可能的原因怎么确认
OSPF 卡在 EXSTART/EXCHANGE两端 MTU 不一致,或一端是 p2p 一端是 broadcastshow ip ospf neighbor 看 State;
debug ip ospf adj
LDP 邻居起不来① 接口没 mpls ip;② router-id 不可达show mpls ldp discovery
有 LDP 邻居但没标签Loopback 是 /32 吗?被 passive 了吗?show mpls ldp bindings
IPv6 邻居起不来忘了 ipv6 unicast-routing,或没配 router-idshow ipv6 ospf
配了 mpls ldp sync 后 OSPF 半天不 FULL正常现象!LDP 没就绪时 OSPF 会等show mpls ldp igp sync

第 4 章 · MP-BGP 与路由反射器

原理 MP-BGP 到底"多"在哪 普通 BGP 只能传 IPv4 单播路由。MP-BGP(Multiprotocol BGP)通过 地址族 Address Family同一条 TCP 会话同时承载多种路由:
vpnv4(客户的 IPv4)、vpnv6(客户的 IPv6)、ipv6 unicast(IPv6 公网,配 send-label 就是 6PE)、rtfilter(RT 约束,RFC 4684)等等。

好处是:你只需要维护 1 条 iBGP 会话 + N 个地址族,而不是为每种协议建一套邻居。

4.1 本实验启用的地址族一览

地址族作用谁需要关键命令
ipv4 unicast公网 IPv4(本实验基本为空,只为保持会话结构完整)PE + RRactivate
vpnv4 unicast核心:传递客户 IPv4 VPN 路由PE + RRsend-community extended
vpnv6 unicast核心:传递客户 IPv6 VPN 路由(6VPE)PE + RRsend-community extended
ipv6 unicast6PE:IPv6 公网路由 + 标签PE + RRsend-label
rtfilter unicastRTC:PE 告诉 RR"我只要哪些 RT"PE + RRdefault-originate(RR 侧)
ipv4 vrf CORP-A …PE-CE 的 eBGP(每 VRF 一个)仅 PEas-override 等

4.2 路由反射器的正确打开方式

✅ 应该做的
  • 所有 PE 只与 RR 建会话
  • 同集群的两台 RR 用相同的 cluster-id
  • RR 之间建立普通 iBGP 会话
  • RR 上 不改下一跳(默认行为,别手贱加 next-hop-self)
  • RR 上启用 send-community extended
❌ 千万别做的
  • next-hop-self —— 会把流量引到 RR 上,RR 不在转发路径 → 黑洞
  • 在 RR 上开 VRF / 接客户 —— RR 就该只做路由分发
  • 两个 RR 用不同 cluster-id 却声称"互为备份" —— 会破坏防环
  • 忘记 route-reflector-client —— PE 收不到其他 PE 的路由
原理 同集群双 RR 为什么不会环路? BGP 用两个属性防环:ORIGINATOR_ID(路由始发者的 router-id)和 CLUSTER_LIST(经过的集群列表)。
两台 RR 配置相同bgp cluster-id 10.0.0.100,那么 RR1 反射给 RR2 的路由里已经带了 {10.0.0.100},RR2 一看"我自己就在这个集群里",直接丢弃 → 不会无限反射。
PE 会同时收到 RR1 和 RR2 发来的同一条路由,BGP 按正常选路规则挑一条最优的,另一条作为备份(配合 Add-Path 还能都装进转发表,见 4.5)。

4.3 RR1 / RR2 完整 BGP 配置

RR1MP-BGP + 路由反射器(完整)
configure terminal
!
ip bgp-community new-format
ip extcommunity-list standard EXT-ALL permit rt 65000:.*
!
router bgp 65000
 bgp router-id 10.0.0.1
 !
 ! ---- 集群 ID:RR1 / RR2 必须【完全相同】----
 bgp cluster-id 10.0.0.100
 !
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 !
 ! ---- NSF / Graceful Restart:RR 重启时 PE 不撤销路由 ----
 bgp graceful-restart
 bgp graceful-restart restart-time 120
 bgp graceful-restart stalepath-time 360
 !
 ! ---- Add-Path:允许向 PE 通告多条等价/备份路径 ----
 bgp additional-paths select all
 !
 !================ 邻居:peer-group 统一管理 ================!
 ! PE 客户端组
 neighbor IBGP-CLIENT peer-group
 neighbor IBGP-CLIENT remote-as 65000
 neighbor IBGP-CLIENT update-source Loopback0
 neighbor IBGP-CLIENT password 0 MplsLab@2026
 neighbor IBGP-CLIENT timers 5 15
 neighbor IBGP-CLIENT transport connection-mode active
 !
 ! 另一台 RR(非客户端,普通 iBGP)
 neighbor IBGP-RR peer-group
 neighbor IBGP-RR remote-as 65000
 neighbor IBGP-RR update-source Loopback0
 neighbor IBGP-RR password 0 MplsLab@2026
 neighbor IBGP-RR timers 5 15
 !
 ! ---- 成员绑定 ----
 neighbor 10.0.0.2  peer-group IBGP-RR        ! RR2
 neighbor 10.0.0.21 peer-group IBGP-CLIENT    ! PE1
 neighbor 10.0.0.22 peer-group IBGP-CLIENT    ! PE2
 neighbor 10.0.0.23 peer-group IBGP-CLIENT    ! PE3
 neighbor 10.0.0.24 peer-group IBGP-CLIENT    ! PE4
 !
 !================ 地址族 ================!
 !
 !--- 1) IPv4 公网单播(保持会话结构)---
 address-family ipv4 unicast
  neighbor IBGP-CLIENT activate
  neighbor IBGP-CLIENT send-community both
  neighbor IBGP-CLIENT route-reflector-client
  neighbor IBGP-RR activate
  neighbor IBGP-RR send-community both
 exit-address-family
 !
 !--- 2) VPNv4:客户 IPv4 路由(重点)---
 address-family vpnv4 unicast
  neighbor IBGP-CLIENT activate
  neighbor IBGP-CLIENT send-community extended
  neighbor IBGP-CLIENT route-reflector-client
  neighbor IBGP-RR activate
  neighbor IBGP-RR send-community extended
  ! Add-Path:把备份路径也发给 PE,供 PIC 快速切换
  neighbor IBGP-CLIENT advertise additional-paths all
  neighbor IBGP-CLIENT additional-paths send
  neighbor IBGP-CLIENT additional-paths receive
 exit-address-family
 !
 !--- 3) VPNv6:客户 IPv6 路由(6VPE)---
 address-family vpnv6 unicast
  neighbor IBGP-CLIENT activate
  neighbor IBGP-CLIENT send-community extended
  neighbor IBGP-CLIENT route-reflector-client
  neighbor IBGP-RR activate
  neighbor IBGP-RR send-community extended
  neighbor IBGP-CLIENT advertise additional-paths all
  neighbor IBGP-CLIENT additional-paths send
  neighbor IBGP-CLIENT additional-paths receive
 exit-address-family
 !
 !--- 4) 6PE:IPv6 公网 + 标签(关键:send-label 不能少)---
 address-family ipv6 unicast
  neighbor IBGP-CLIENT activate
  neighbor IBGP-CLIENT send-label
  neighbor IBGP-CLIENT route-reflector-client
  neighbor IBGP-RR activate
  neighbor IBGP-RR send-label
 exit-address-family
 !
 !--- 5) RTC:Route Target Constraint ---!
 ! PE 只向 RR 订阅"我感兴趣的 RT",RR 不再给 PE 推无关路由
 ! 大规模网络(几百个 VRF)能显著降低 RR 和 PE 的负担
 address-family rtfilter unicast
  neighbor IBGP-CLIENT activate
  neighbor IBGP-CLIENT send-community extended
  neighbor IBGP-CLIENT route-reflector-client
  ! 向所有客户端通告"默认过滤"(接收全部),
  ! 这样即使 PE 没显式订阅也能正常工作;PE 侧再细化
  neighbor IBGP-CLIENT default-originate
  neighbor IBGP-RR activate
  neighbor IBGP-RR send-community extended
 exit-address-family
 !
end
write memory
RR2MP-BGP + 路由反射器(与 RR1 对称)
configure terminal
ip bgp-community new-format
!
router bgp 65000
 bgp router-id 10.0.0.2
 bgp cluster-id 10.0.0.100          ! 与 RR1 一致!
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 bgp graceful-restart
 bgp graceful-restart restart-time 120
 bgp graceful-restart stalepath-time 360
 bgp additional-paths select all
 !
 neighbor IBGP-CLIENT peer-group
 neighbor IBGP-CLIENT remote-as 65000
 neighbor IBGP-CLIENT update-source Loopback0
 neighbor IBGP-CLIENT password 0 MplsLab@2026
 neighbor IBGP-CLIENT timers 5 15
 neighbor IBGP-CLIENT transport connection-mode active
 !
 neighbor IBGP-RR peer-group
 neighbor IBGP-RR remote-as 65000
 neighbor IBGP-RR update-source Loopback0
 neighbor IBGP-RR password 0 MplsLab@2026
 neighbor IBGP-RR timers 5 15
 !
 neighbor 10.0.0.1  peer-group IBGP-RR        ! RR1
 neighbor 10.0.0.21 peer-group IBGP-CLIENT
 neighbor 10.0.0.22 peer-group IBGP-CLIENT
 neighbor 10.0.0.23 peer-group IBGP-CLIENT
 neighbor 10.0.0.24 peer-group IBGP-CLIENT
 !
 address-family ipv4 unicast
  neighbor IBGP-CLIENT activate
  neighbor IBGP-CLIENT send-community both
  neighbor IBGP-CLIENT route-reflector-client
  neighbor IBGP-RR activate
  neighbor IBGP-RR send-community both
 exit-address-family
 !
 address-family vpnv4 unicast
  neighbor IBGP-CLIENT activate
  neighbor IBGP-CLIENT send-community extended
  neighbor IBGP-CLIENT route-reflector-client
  neighbor IBGP-RR activate
  neighbor IBGP-RR send-community extended
  neighbor IBGP-CLIENT advertise additional-paths all
  neighbor IBGP-CLIENT additional-paths send
  neighbor IBGP-CLIENT additional-paths receive
 exit-address-family
 !
 address-family vpnv6 unicast
  neighbor IBGP-CLIENT activate
  neighbor IBGP-CLIENT send-community extended
  neighbor IBGP-CLIENT route-reflector-client
  neighbor IBGP-RR activate
  neighbor IBGP-RR send-community extended
  neighbor IBGP-CLIENT advertise additional-paths all
  neighbor IBGP-CLIENT additional-paths send
  neighbor IBGP-CLIENT additional-paths receive
 exit-address-family
 !
 address-family ipv6 unicast
  neighbor IBGP-CLIENT activate
  neighbor IBGP-CLIENT send-label
  neighbor IBGP-CLIENT route-reflector-client
  neighbor IBGP-RR activate
  neighbor IBGP-RR send-label
 exit-address-family
 !
 address-family rtfilter unicast
  neighbor IBGP-CLIENT activate
  neighbor IBGP-CLIENT send-community extended
  neighbor IBGP-CLIENT route-reflector-client
  neighbor IBGP-CLIENT default-originate
  neighbor IBGP-RR activate
  neighbor IBGP-RR send-community extended
 exit-address-family
 !
end
write memory
注意 关于 peer-group 与 peer-template peer-group 是老写法,兼容性最好(IOSv 一定支持)。现代 IOS / IOS-XE 推荐用 template peer-session + template peer-policy,配置更灵活、修改时不需要重建会话。第 8.4 节给了 template 版本,跑通之后建议切换过去练一遍。

4.4 PE 侧的 MP-BGP 骨架

四台 PE 的这一段完全一致(除 router-id)。先配这个,第 5、6 章再往里加 VRF。

PE1MP-BGP 核心部分(VRF 部分见第 5 章)
configure terminal
ip bgp-community new-format
!
router bgp 65000
 bgp router-id 10.0.0.21
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 !
 ! ---- Graceful Restart:BGP 进程重启 / 主备倒换时保持转发 ----
 bgp graceful-restart
 bgp graceful-restart restart-time 120
 bgp graceful-restart stalepath-time 360
 !
 ! ---- Add-Path + PIC:备份路径直接写进 CEF,故障切换 < 50ms ----
 bgp additional-paths select all
 bgp recursion host
 !
 ! ---- 与两台 RR 建会话 ----
 neighbor 10.0.0.1 remote-as 65000
 neighbor 10.0.0.1 update-source Loopback0
 neighbor 10.0.0.1 password 0 MplsLab@2026
 neighbor 10.0.0.1 timers 5 15
 !
 neighbor 10.0.0.2 remote-as 65000
 neighbor 10.0.0.2 update-source Loopback0
 neighbor 10.0.0.2 password 0 MplsLab@2026
 neighbor 10.0.0.2 timers 5 15
 !
 !--- IPv4 公网单播 ---!
 address-family ipv4 unicast
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.2 activate
  no auto-summary
  no synchronization
 exit-address-family
 !
 !--- VPNv4 ---!
 address-family vpnv4 unicast
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.1 send-community extended
  neighbor 10.0.0.2 activate
  neighbor 10.0.0.2 send-community extended
  ! 接收 RR 发来的多条路径 + 把备份路径装进转发表(BGP PIC Edge)
  bgp additional-paths receive
  bgp additional-paths send
  bgp additional-paths install
 exit-address-family
 !
 !--- VPNv6(6VPE)---!
 address-family vpnv6 unicast
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.1 send-community extended
  neighbor 10.0.0.2 activate
  neighbor 10.0.0.2 send-community extended
  bgp additional-paths receive
  bgp additional-paths send
  bgp additional-paths install
 exit-address-family
 !
 !--- 6PE:发布自己的 IPv6 loopback 与演示前缀 ---!
 address-family ipv6 unicast
  network fd00::21/128
  network 2001:db8:aaaa::/64
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.1 send-label
  neighbor 10.0.0.2 activate
  neighbor 10.0.0.2 send-label
 exit-address-family
 !
 !--- RTC:订阅我关心的 RT ---!
 ! PE1 上只有 CORP-A 和 BRANCH,所以只订阅这两个 RT
 address-family rtfilter unicast
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.2 activate
 exit-address-family
 !
end
write memory
设备差异点
PE2router-id 10.0.0.22;6PE 发布 fd00::22/128
PE3router-id 10.0.0.23;6PE 发布 fd00::23/128
PE4router-id 10.0.0.24;6PE 发布 fd00::24/128

4.5 RTC(Route Target Constraint)到底省了什么

原理 用大白话说 没有 RTC 时,RR 会把 所有 VPN 路由发给 所有 PE,PE 收到后再用本地的 import RT 过滤——路由其实已经传过来了,只是没装表。想象一个网里有 500 个 VRF、20 万台主机:RR 要发 20 万条给每台 PE,纯浪费。

有了 RTC,PE 会先发一条"订阅消息"(rtfilter NLRI):"我只对 RT 65000:10065000:300 感兴趣"。RR 收到后直接不发其他 RT 的路由。

判断 RTC 有没有生效,就看 PE 上 show bgp vpnv4 all 有没有别的客户的路由——没有就对了。
可选:在 PE 上显式声明订阅的 RT
! 在 PE1 上:只接收 CORP-A(65000:100) 与 BRANCH(65000:300) 的路由
configure terminal
router bgp 65000
 address-family rtfilter unicast
  neighbor 10.0.0.1 default-originate route-map RM-RTC-OUT
  neighbor 10.0.0.2 default-originate route-map RM-RTC-OUT
 exit-address-family
!
route-map RM-RTC-OUT permit 10
 match ip extcommunity RT-SUBSCRIBE
!
ip extcommunity-list standard RT-SUBSCRIBE permit rt 65000:100
ip extcommunity-list standard RT-SUBSCRIBE permit rt 65000:300

4.6 阶段验证

命令(在 RR1 / PE1 上执行)预期结果
show bgp all summaryvpnv4 / vpnv6 / ipv6 / rtfilter 各地址族下 PE 邻居都是 Established(数字不为 0)
show bgp vpnv4 unicast all summaryRR1 上看到 4 个 PE 邻居,状态 Established
show bgp rtfilter unicast能看到 RTC 的 NLRI
show bgp ipv6 unicast labels6PE 生效:fd00::2x/128 都有 in/out label
show bgp vpnv4 all neighbors 10.0.0.1Next hop is not changed、Extended Community 能力协商成功
参考输出 · RR1 的 BGP 汇总
RR1# show bgp all summary
For address family: IPv4 Unicast
Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.0.0.2        4 65000      38      39        2    0    0 00:16:11        0
10.0.0.21       4 65000      37      38        2    0    0 00:16:05        0
10.0.0.22       4 65000      37      38        2    0    0 00:16:03        0
10.0.0.23       4 65000      36      37        2    0    0 00:15:58        0
10.0.0.24       4 65000      36      37        2    0    0 00:15:55        0

For address family: VPNv4 Unicast
Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.0.0.21       4 65000      37      38        6    0    0 00:16:05        4
10.0.0.22       4 65000      37      38        6    0    0 00:16:03        2
10.0.0.23       4 65000      36      37        6    0    0 00:15:58        4
10.0.0.24       4 65000      36      37        6    0    0 00:15:55        2

For address family: VPNv6 Unicast
Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.0.0.21       4 65000      37      38        4    0    0 00:16:05        2

For address family: IPv6 Unicast
Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.0.0.21       4 65000      37      38        3    0    0 00:16:05        1

For address family: RT Filter
Neighbor        V    AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.0.0.21       4 65000      37      38        2    0    0 00:16:05        1
排错 邻居卡在 Active / Idle 的三板斧show tcp brief 看 TCP 179 有没有起来 —— 起不来是底层不可达(IGP 问题)或 update-source 配错。
② 两端密码不一致 → 会话反复 Up/Down,debug bgp all 会看到 BAD Message
③ 一端 no bgp default ipv4-unicast 另一端没配 activate → 地址族协商不上,show bgp vpnv4 all summary 里那个族根本不出现邻居。这是新手第一名。

第 5 章 · 客户 A:6VPE + eBGP 双栈接入

原理 一个 VRF 就是一台"虚拟路由器" PE 上创建 VRF = 切出一张独立的路由表。把接口 Gi0/2 放进 VRF CORP-A,从此这个口收到的包就只查 CORP-A 的表,与公网、与其他客户完全隔离。

三个概念别搞混:
  • RD(Route Distinguisher):给路由加前缀,解决"两个客户都用 192.168.1.0/24"的地址冲突问题。它只在骨干传递时用,不决定路由进哪个 VRF。
  • RT(Route Target):真正的"准入证"。export RT 是我在发出去时贴的标签,import RT 是我愿意接收哪些标签。这才决定路由进哪个 VRF。
  • SoO(Site of Origin):标记路由"从哪个站点来",防止同一个站点从两条链路学到的路由又被灌回自己(多宿主防环)。

5.1 PE1:VRF CORP-A + 双栈 eBGP

PE1VRF 定义 + 接口绑定 + PE-CE eBGP
configure terminal
!===========================================================
! 1) 定义 VRF(IPv4 / IPv6 双栈)
!===========================================================
vrf definition CORP-A
 rd 65000:100
 !
 address-family ipv4
  route-target export 65000:100
  route-target import 65000:100
 exit-address-family
 !
 address-family ipv6
  route-target export 65000:100
  route-target import 65000:100
 exit-address-family
!
!===========================================================
! 2) 把接口放进 VRF
!    注意:先配 vrf forwarding,再配 IP!
!    顺序反了 IOS 会把已配的 IP 清掉(经典大坑)
!===========================================================
interface GigabitEthernet0/2
 description ## PE1 Gi0/2  <-->  CE-A1 Gi0/0  (VRF CORP-A) ##
 vrf forwarding CORP-A
 ip address 10.1.1.1 255.255.255.252
 ipv6 address 2001:db8:1:1::1/64
 no shutdown
!
!===========================================================
! 3) PE-CE 路由:eBGP,同一条会话同时承载 v4 + v6
!===========================================================
ip community-list standard CL-CORPA permit 65001:1001
!
route-map RM-CORPA-A1-IN permit 10
 description ## 从 CE-A1 收到的路由打上本地优先级与团体属性 ##
 set local-preference 200
 set community 65000:1001 additive
!
route-map RM-CORPA-A1-OUT permit 10
 description ## 默认允许全部下发;需要过滤时在这里加 match ##
!
router bgp 65000
 !
 !---------- IPv4 ----------
 address-family ipv4 vrf CORP-A
  neighbor 10.1.1.2 remote-as 65001
  neighbor 10.1.1.2 activate
  neighbor 10.1.1.2 description ** CE-A1 **
  !
  ! 安全:TTL=1,防伪造的远距离 eBGP 会话
  neighbor 10.1.1.2 ttl-security hops 1
  !
  ! 客户的两个站点都用 AS 65001,BGP 会因"AS_PATH 里已有自己"而丢弃路由
  ! as-override 把客户 AS 号替换成运营商 AS,绕过这个限制
  neighbor 10.1.1.2 as-override
  !
  ! SoO:标记这是"站点 101"的路由,配合多宿主防环
  neighbor 10.1.1.2 soo 65000:101
  !
  ! 团体属性(标准 + 扩展都要发)
  neighbor 10.1.1.2 send-community both
  !
  ! 保护:最多收 100 条,到 80% 告警,超了断 10 分钟后自动恢复
  neighbor 10.1.1.2 maximum-prefix 100 80 restart 10
  !
  neighbor 10.1.1.2 route-map RM-CORPA-A1-IN in
  neighbor 10.1.1.2 route-map RM-CORPA-A1-OUT out
  !
  no auto-summary
  no synchronization
 exit-address-family
 !
 !---------- IPv6 ----------
 ! 关键设计:用【IPv4 会话】承载 IPv6 路由。
 ! 这样 VPNv6 的下一跳是 ::FFFF:10.0.0.21(IPv4-mapped),
 ! 可以直接沿 IPv4 LDP 隧道走,核心不需要 IPv6 标签分发。
 address-family ipv6 vrf CORP-A
  neighbor 10.1.1.2 remote-as 65001
  neighbor 10.1.1.2 activate
  neighbor 10.1.1.2 as-override
  neighbor 10.1.1.2 send-community both
 exit-address-family
 !
end
write memory
注意 vrf forwarding 的"清 IP"陷阱 如果接口上已经有 IP 地址,再敲 vrf forwarding CORP-A,IOS 会提示 % Interface IP address removed 并把地址清空。
正确顺序:先 vrf forwarding → 再 ip address / ipv6 address
如果想避免这个坑,用新版写法 vrf forwarding CORP-A ipv4(IOS 15.x+ 支持),有些版本可以保留地址。
原理 为什么 IPv6 会话要用 IPv4 建? 如果 PE-CE 用 IPv6 地址建 eBGP 会话,那么 PE 通告给远端的 VPNv6 路由下一跳就是纯 IPv6 地址,对端 PE 必须在核心有一条 IPv6 的 LSP 才能递归解析——这就要求核心跑 LDPv6 或 SRv6,复杂度上一个台阶。

改用 IPv4 会话承载 IPv6 前缀(业界称 IPv6 over IPv4 BGP session),下一跳自动变成 ::FFFF:10.0.0.21,核心只需 IPv4 LDP。这是生产环境最主流的 6VPE 部署方式。

如果你确实想练 IPv6 传输,可以在核心加: mpls ldp / address-family ipv6 + 接口下启用 IPv6 地址族(IOS-XE 语法,IOSv 支持度有限,版本)。

5.2 PE3:CORP-A 的站点 2

PE3VRF CORP-A 站点 2
configure terminal
vrf definition CORP-A
 rd 65000:100
 address-family ipv4
  route-target export 65000:100
  route-target import 65000:100
 exit-address-family
 address-family ipv6
  route-target export 65000:100
  route-target import 65000:100
 exit-address-family
!
interface GigabitEthernet0/1
 description ## PE3 Gi0/1  <-->  CE-A2 Gi0/0 ##
 vrf forwarding CORP-A
 ip address 10.1.3.1 255.255.255.252
 ipv6 address 2001:db8:1:3::1/64
 no shutdown
!
route-map RM-CORPA-A2-IN permit 10
 set local-preference 200
 set community 65000:1002 additive
!
route-map RM-CORPA-A2-OUT permit 10
!
router bgp 65000
 address-family ipv4 vrf CORP-A
  neighbor 10.1.3.2 remote-as 65001
  neighbor 10.1.3.2 activate
  neighbor 10.1.3.2 ttl-security hops 1
  neighbor 10.1.3.2 as-override
  neighbor 10.1.3.2 soo 65000:102
  neighbor 10.1.3.2 send-community both
  neighbor 10.1.3.2 maximum-prefix 100 80 restart 10
  neighbor 10.1.3.2 route-map RM-CORPA-A2-IN in
  neighbor 10.1.3.2 route-map RM-CORPA-A2-OUT out
 exit-address-family
 !
 address-family ipv6 vrf CORP-A
  neighbor 10.1.3.2 remote-as 65001
  neighbor 10.1.3.2 activate
  neighbor 10.1.3.2 as-override
  neighbor 10.1.3.2 send-community both
 exit-address-family
!
end
write memory

5.3 CE-A1 / CE-A2 配置

CE-A1客户 A 站点 1(AS 65001)
configure terminal
hostname CE-A1
ip cef
ipv6 unicast-routing
ipv6 cef
!
interface GigabitEthernet0/0
 description ## CE-A1 Gi0/0  <-->  PE1 Gi0/2 ##
 ip address 10.1.1.2 255.255.255.252
 ipv6 address 2001:db8:1:1::2/64
 no shutdown
!
interface Loopback0
 ip address 192.168.255.1 255.255.255.255
 ipv6 address 2001:db8:a:ff::1/128
!
interface Loopback10
 description ## 站点 1 业务网段 ##
 ip address 192.168.11.1 255.255.255.0
 ipv6 address 2001:db8:a:11::1/64
!
router bgp 65001
 bgp router-id 192.168.255.1
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 neighbor 10.1.1.1 remote-as 65000
 neighbor 10.1.1.1 password 0 CeA1@2026
 neighbor 10.1.1.1 timers 10 30
 !
 address-family ipv4 unicast
  network 192.168.11.0 mask 255.255.255.0
  network 192.168.255.1 mask 255.255.255.255
  neighbor 10.1.1.1 activate
  neighbor 10.1.1.1 send-community both
  ! 若运营商未做 as-override,在这里用 allowas-in 自救:
  ! neighbor 10.1.1.1 allowas-in 1
  no auto-summary
  no synchronization
 exit-address-family
 !
 address-family ipv6 unicast
  network 2001:db8:a:11::/64
  network 2001:db8:a:ff::1/128
  neighbor 10.1.1.1 activate
  neighbor 10.1.1.1 send-community both
 exit-address-family
!
end
write memory
CE-A2客户 A 站点 2(AS 65001 —— 与站点 1 相同!)
configure terminal
hostname CE-A2
ip cef
ipv6 unicast-routing
ipv6 cef
!
interface GigabitEthernet0/0
 description ## CE-A2 Gi0/0  <-->  PE3 Gi0/1 ##
 ip address 10.1.3.2 255.255.255.252
 ipv6 address 2001:db8:1:3::2/64
 no shutdown
!
interface Loopback0
 ip address 192.168.255.2 255.255.255.255
 ipv6 address 2001:db8:a:ff::2/128
!
interface Loopback10
 description ## 站点 2 业务网段 ##
 ip address 192.168.12.1 255.255.255.0
 ipv6 address 2001:db8:a:12::1/64
!
router bgp 65001
 bgp router-id 192.168.255.2
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 neighbor 10.1.3.1 remote-as 65000
 neighbor 10.1.3.1 password 0 CeA2@2026
 neighbor 10.1.3.1 timers 10 30
 !
 address-family ipv4 unicast
  network 192.168.12.0 mask 255.255.255.0
  network 192.168.255.2 mask 255.255.255.255
  neighbor 10.1.3.1 activate
  neighbor 10.1.3.1 send-community both
  no auto-summary
  no synchronization
 exit-address-family
 !
 address-family ipv6 unicast
  network 2001:db8:a:12::/64
  network 2001:db8:a:ff::2/128
  neighbor 10.1.3.1 activate
  neighbor 10.1.3.1 send-community both
 exit-address-family
!
end
write memory
看懂 as-override 在这里干了什么 CE-A2 发出 192.168.12.0/24,AS_PATH = 65001
PE3 收下 → 转成 VPNv4(RD 65000:100 前缀)→ 经 RR 反射 → PE1 收到 → 换个 VPN 标签后发给 CE-A1。
如果没有 as-override:发给 CE-A1 时 AS_PATH 仍是 65001,而 CE-A1 自己就是 AS 65001,BGP 的防环规则(AS_PATH 里出现自己的 AS)会直接丢弃这条路由 —— 站点 1 就学不到站点 2。
有了 as-override:PE1 把 AS_PATH 里的 65001 替换成运营商的 65000,变成 65000 65000,CE-A1 欣然接受。

替代方案是 CE 侧配 neighbor x.x.x.x allowas-in 1(允许自己的 AS 在路径里出现 1 次)。运营商侧用 as-override,客户侧用 allowas-in,两者效果相同,区别只在谁改配置。

5.4 客户 A 验证

命令预期结果
show ip vrf interfacesGi0/2 在 CORP-A 下
show bgp vpnv4 unicast vrf CORP-A能看到 192.168.12.0/24(RD 前缀形式 65000:100:192.168.12.0),下一跳 10.0.0.23
show bgp vpnv6 unicast vrf CORP-A能看到 2001:db8:a:12::/64
show ip route vrf CORP-AB 标志的 192.168.12.0/24
show ipv6 route vrf CORP-AB 标志的 2001:db8:a:12::/64
ping vrf CORP-A 192.168.12.1 source 192.168.11.1在 CE-A1 上执行:ping 192.168.12.1 source lo10 → !!!!!
ping 2001:db8:a:12::1 source 2001:db8:a:11::1IPv6 也通
traceroute 192.168.12.1 source lo10第 1 跳 10.1.1.1,第 2 跳 = 对端 PE 的 PE-CE 地址,看不到骨干 IP(被 MPLS 隐藏)
参考输出 · PE1 上的 VPNv4 表与标签
PE1# show bgp vpnv4 unicast vrf CORP-A
BGP table version is 12, local router ID is 10.0.0.21
   Network          Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 65000:100 (default for vrf CORP-A)
*> 192.168.11.0     10.1.1.2                 0           0 65001 i
*>i192.168.12.0     10.0.0.23                0    100      0 65000 65000 i
*> 192.168.255.1/32 10.1.1.2                 0           0 65001 i
*>i192.168.255.2/32 10.0.0.23                0    100      0 65000 65000 i

PE1# show bgp vpnv4 unicast vrf CORP-A 192.168.12.0
BGP routing table entry for 65000:100:192.168.12.0/24, version 9
Paths: (1 available, best #1)
  Advertised to update-groups: 2
  65000 65000, imported path from 65000:100:192.168.12.0/24 (global)
    10.0.0.23 (metric 30) from 10.0.0.1 (10.0.0.1)
      Origin IGP, metric 0, localpref 100, valid, internal, best
      Extended Community: RT:65000:100 SoO:65000:102:0
      Originator: 10.0.0.23, Cluster list: 10.0.0.100
      mpls labels in/out nolabel/23

PE1# show ip cef vrf CORP-A 192.168.12.0
192.168.12.0/24, epoch 0, flags rib only nolabel, rib defined all labels
  recursive via 10.0.0.23
    nexthop 10.0.1.2 GigabitEthernet0/0 label 21 23   <-- 外层21 / 内层23

PE1# show ipv6 cef vrf CORP-A 2001:db8:a:12::/64
2001:db8:a:12::/64
  recursive via ::FFFF:10.0.0.23        <-- IPv4-mapped 下一跳
    nexthop 10.0.1.2 GigabitEthernet0/0 label 21 24
看懂 这条 CEF 输出就是 MPLS VPN 的全部秘密 nexthop 10.0.1.2 Gi0/0 label 21 23
· 21 = 外层(传输)标签,由 LDP 分配,含义是"到 10.0.0.23(PE3)去"。P 路由器只看这个。
· 23 = 内层(VPN)标签,由 PE3 的 MP-BGP 分配,含义是"这是 CORP-A 的包"。只有 PE3 会看。
· IPv6 那条里下一跳是 ::FFFF:10.0.0.23,但压的同样是沿 IPv4 LDP 的标签 21 24 —— 这就是 6VPE 的精髓。

5.5 进阶:Hub & Spoke / 中央服务型 VPN

真实客户常要求"所有分支都能访问数据中心,但分支之间不能互访"。做法是用两个 RT + Hub 站点上的两个 VRF(或使用 import map):

思路示例(在 Hub 所在 PE 上)
! 分支(spoke)侧 VRF:导出 SPOKE-RT,只导入 HUB-RT
vrf definition CORP-SPOKE
 rd 65000:110
 address-family ipv4
  route-target export 65000:111          ! SPOKE 路由贴 111
  route-target import 65000:222          ! 只接收 HUB 发来的 222
 exit-address-family
!
! 总部(hub)侧 VRF:导出 HUB-RT,导入 SPOKE-RT
vrf definition CORP-HUB
 rd 65000:120
 address-family ipv4
  route-target export 65000:222          ! HUB 路由贴 222
  route-target import 65000:111          ! 接收所有 SPOKE
  route-target import 65000:222
 exit-address-family
!
! 效果:spoke→hub 通,hub→spoke 通,spoke→spoke 不通(因为 spoke 不 import 111)

第 6 章 · 客户 B:OSPF PE-CE 与 Sham-Link

原理 为什么 IGP 做 PE-CE 比 BGP 麻烦 BGP 自带 AS_PATH 防环,天然适配"多站点经第三方骨干互联"。而 OSPF 没有这种机制,PE 把 MP-BGP 路由重分发进 OSPF 时,必须自己解决环路问题,于是有了三个关键设计:

① DN 位(Down Bit):PE 生成 Type-3/5/7 LSA 时置位 DN。另一个 PE 收到带 DN 位的 LSA 直接忽略,不重分发回 BGP → 防止"CE1 → PE1 → 骨干 → PE2 → CE2 → 后门 → CE1"的环路。
② Domain-ID:两台 PE 的 domain-id 相同时,BGP 路由重分发进 OSPF 生成 Type-3 Summary LSA(而不是 Type-5 External);不同则生成 Type-5。相同 domain-id 让客户看到的路由"更像原生 OSPF"。
③ Route-Tag(VPN Route Tag):PE 给外部 LSA 打上由 AS 号算出的 tag,另一个 PE 见到这个 tag 就丢弃,是 DN 位之外的第二道保险。

注意 如果 CE 本身也是一台 PE(VRF-Lite 场景),它同样会忽略 DN 位,导致路由丢失。此时要在 CE 的 OSPF 进程下加 capability vrf-lite

6.1 后门链路带来的麻烦

MPLS VPN 骨干(AS 65000) CE-B1172.20.11.0/24 CE-B2172.20.12.0/24 PE2 PE4 后门链路 172.20.99.0/24(OSPF Area 0) 问题:OSPF 的区域内路由(O)永远优于区域间(O IA)/外部(O E2) → 后门链路是"区域内",MPLS 侧是"区域间/外部",流量【必然】抄近路走后门,MPLS 白买了
图 6-1 后门链路导致的次优路径
原理 Sham-Link 就是一条"假的区域内链路" Sham-Link 在两个 PE 之间建立一条伪链路(底层其实是 MPLS 隧道),并把它宣告进 OSPF Area 0。这样一来:
· PE2 和 PE4 在 OSPF 眼里变成了直连邻居,互相通告 Type-1/Type-2(区域内)LSA
· MPLS 路径的路由类型从 "O IA / O E2" 升级为 "O",与后门链路同类型,可以公平比较 cost
· 我们把 Sham-Link cost 设成 10,后门链路 cost 设成 1000 → 流量乖乖走 MPLS;后门链路断掉时才自动切换过去。

Sham-Link 的端点必须是 /32 的 loopback,放进 VRF,且只能通过 MP-BGP 通告(绝不能同时被 OSPF 通告,否则"先有鸡还是先有蛋")。

6.2 PE2 配置(站点 1)

PE2VRF CORP-B + OSPF/OSPFv3 PE-CE + Sham-Link
configure terminal
!===========================================================
! 1) VRF
!===========================================================
vrf definition CORP-B
 rd 65000:200
 address-family ipv4
  route-target export 65000:200
  route-target import 65000:200
 exit-address-family
 address-family ipv6
  route-target export 65000:200
  route-target import 65000:200
 exit-address-family
!
!===========================================================
! 2) Sham-Link 端点:/32 环回,放进 VRF,【只由 BGP 通告】
!===========================================================
interface Loopback200
 description ## Sham-Link endpoint (VRF CORP-B) ##
 vrf forwarding CORP-B
 ip address 172.31.255.2 255.255.255.255
 ipv6 address 2001:db8:200::2/128
!
!===========================================================
! 3) 客户接口
!===========================================================
interface GigabitEthernet0/1
 description ## PE2 Gi0/1  <-->  CE-B1 Gi0/0 ##
 vrf forwarding CORP-B
 ip address 10.1.2.1 255.255.255.252
 ip ospf network point-to-point
 ip ospf 200 area 0
 ipv6 address 2001:db8:1:2::1/64
 ospfv3 200 ipv6 area 0
 no shutdown
!
!===========================================================
! 4) OSPFv2(VRF)
!===========================================================
router ospf 200 vrf CORP-B
 router-id 172.31.255.2
 !
 ! domain-id 与 PE4 保持一致 → 生成 Type-3 而不是 Type-5
 domain-id 0.0.0.200
 !
 ! 把 MP-BGP 学到的客户路由重分发进 OSPF,发给 CE
 redistribute bgp 65000 subnets
 !
 ! ---- Sham-Link(源 本端 / 目的 PE4 端点 / cost)----
 area 0 sham-link 172.31.255.2 172.31.255.4 cost 10
 !
 network 10.1.2.0 0.0.0.3 area 0
!
!===========================================================
! 5) OSPFv3(VRF)—— 注意语法与 OSPFv2 不同
!===========================================================
router ospfv3 200
 !
 address-family ipv6 unicast vrf CORP-B
  router-id 172.31.255.2
  redistribute bgp 65000 include-connected
  area 0 sham-link 2001:db8:200::2 2001:db8:200::4 cost 10
 exit-address-family
!
!===========================================================
! 6) MP-BGP:把 OSPF 学到的客户路由带上 RT 发布出去
!===========================================================
router bgp 65000
 !
 address-family ipv4 vrf CORP-B
  ! Sham-Link 端点必须【只用 network 通告】,不要 redistribute connected
  network 172.31.255.2 mask 255.255.255.255
  redistribute ospf 200 match internal external 1 external 2
  no auto-summary
  no synchronization
 exit-address-family
 !
 address-family ipv6 vrf CORP-B
  network 2001:db8:200::2/128
  redistribute ospf 200 include-connected
 exit-address-family
!
end
write memory

6.3 PE4 配置(站点 2)

PE4VRF CORP-B 站点 2(对称配置)
configure terminal
vrf definition CORP-B
 rd 65000:200
 address-family ipv4
  route-target export 65000:200
  route-target import 65000:200
 exit-address-family
 address-family ipv6
  route-target export 65000:200
  route-target import 65000:200
 exit-address-family
!
interface Loopback200
 description ## Sham-Link endpoint (VRF CORP-B) ##
 vrf forwarding CORP-B
 ip address 172.31.255.4 255.255.255.255
 ipv6 address 2001:db8:200::4/128
!
interface GigabitEthernet0/2
 description ## PE4 Gi0/2  <-->  CE-B2 Gi0/0 ##
 vrf forwarding CORP-B
 ip address 10.1.4.1 255.255.255.252
 ip ospf network point-to-point
 ip ospf 200 area 0
 ipv6 address 2001:db8:1:4::1/64
 ospfv3 200 ipv6 area 0
 no shutdown
!
router ospf 200 vrf CORP-B
 router-id 172.31.255.4
 domain-id 0.0.0.200
 redistribute bgp 65000 subnets
 area 0 sham-link 172.31.255.4 172.31.255.2 cost 10
 network 10.1.4.0 0.0.0.3 area 0
!
router ospfv3 200
 address-family ipv6 unicast vrf CORP-B
  router-id 172.31.255.4
  redistribute bgp 65000 include-connected
  area 0 sham-link 2001:db8:200::4 2001:db8:200::2 cost 10
 exit-address-family
!
router bgp 65000
 address-family ipv4 vrf CORP-B
  network 172.31.255.4 mask 255.255.255.255
  redistribute ospf 200 match internal external 1 external 2
 exit-address-family
 address-family ipv6 vrf CORP-B
  network 2001:db8:200::4/128
  redistribute ospf 200 include-connected
 exit-address-family
!
end
write memory
版本 OSPFv3 Sham-Link 的可用性 OSPFv3 的 Sham-Link 在部分 IOS 版本上支持不完整。如果 PE 上出现 % Sham-link not supported 或邻居起不来,请跳过 IPv6 的 Sham-Link,只保留 IPv4 的(IPv4 部分一定能跑)。
另外 OSPFv3 在 VRF 中必须用 router ospfv3 <pid> + address-family ipv6 unicast vrf <name> 的写法,接口用 ospfv3 <pid> ipv6 area 0不能用老的 ipv6 ospf 200 area 0(它不支持 VRF)。

6.4 CE-B1 / CE-B2 配置(含后门链路)

CE-B1客户 B 站点 1(AS 65002)
configure terminal
hostname CE-B1
ip cef
ipv6 unicast-routing
ipv6 cef
!
interface GigabitEthernet0/0
 description ## CE-B1 Gi0/0  <-->  PE2 Gi0/1  (MPLS 主用) ##
 ip address 10.1.2.2 255.255.255.252
 ip ospf network point-to-point
 ip ospf 200 area 0
 ipv6 address 2001:db8:1:2::2/64
 ospfv3 200 ipv6 area 0
 no shutdown
!
interface GigabitEthernet0/1
 description ## CE-B1 Gi0/1  <-->  CE-B2 Gi0/1  (后门链路) ##
 ip address 172.20.99.1 255.255.255.0
 ipv6 address 2001:db8:b:99::1/64
 ! 关键:把后门链路的 cost 调高,让它只在 MPLS 故障时接管
 ip ospf 200 area 0
 ip ospf cost 1000
 ospfv3 200 ipv6 area 0
 ipv6 ospf cost 1000
 no shutdown
!
interface Loopback0
 ip address 172.20.255.1 255.255.255.255
 ip ospf 200 area 0
 ipv6 address 2001:db8:b:ff::1/128
 ospfv3 200 ipv6 area 0
!
interface Loopback10
 description ## 站点 1 业务网段 ##
 ip address 172.20.11.1 255.255.255.0
 ip ospf 200 area 0
 ipv6 address 2001:db8:b:11::1/64
 ospfv3 200 ipv6 area 0
!
router ospf 200
 router-id 172.20.255.1
 passive-interface Loopback0
 log-adjacency-changes
!
router ospfv3 200
 router-id 172.20.255.1
!
end
write memory
CE-B2客户 B 站点 2(AS 65002)
configure terminal
hostname CE-B2
ip cef
ipv6 unicast-routing
ipv6 cef
!
interface GigabitEthernet0/0
 description ## CE-B2 Gi0/0  <-->  PE4 Gi0/2  (MPLS 主用) ##
 ip address 10.1.4.2 255.255.255.252
 ip ospf network point-to-point
 ip ospf 200 area 0
 ipv6 address 2001:db8:1:4::2/64
 ospfv3 200 ipv6 area 0
 no shutdown
!
interface GigabitEthernet0/1
 description ## CE-B2 Gi0/1  <-->  CE-B1 Gi0/1  (后门链路) ##
 ip address 172.20.99.2 255.255.255.0
 ipv6 address 2001:db8:b:99::2/64
 ip ospf 200 area 0
 ip ospf cost 1000
 ospfv3 200 ipv6 area 0
 ipv6 ospf cost 1000
 no shutdown
!
interface Loopback0
 ip address 172.20.255.2 255.255.255.255
 ip ospf 200 area 0
 ipv6 address 2001:db8:b:ff::2/128
 ospfv3 200 ipv6 area 0
!
interface Loopback10
 description ## 站点 2 业务网段 ##
 ip address 172.20.12.1 255.255.255.0
 ip ospf 200 area 0
 ipv6 address 2001:db8:b:12::1/64
 ospfv3 200 ipv6 area 0
!
router ospf 200
 router-id 172.20.255.2
 passive-interface Loopback0
 log-adjacency-changes
!
router ospfv3 200
 router-id 172.20.255.2
!
end
write memory
注意 后门链路先别急着连 建议先不接 CE-B1↔CE-B2 这条线(或先 shutdown),把 MPLS 路径跑通、确认客户 B 站点互通之后,再 no shutdown 制造"后门"现象,最后加 Sham-Link 修好。
这样你才能亲眼看到下面这个对比:
· 无 Sham-Link + 后门 UP → show ip route 里对端 LAN 是 O(区域内),下一跳是 172.20.99.x(走后门)
· 有 Sham-Link + 后门 UP → 变成 O 但下一跳是 10.1.2.1(走 MPLS)

6.5 验证:Sham-Link 是否真的生效

命令预期结果
show ip ospf sham-links状态 UP,源 172.31.255.2 → 目的 172.31.255.4,cost 10
show ip ospf neighbor能看到 172.31.255.4 这个"虚拟邻居"(接口显示为 OSPF_SL0)
show ip route 172.20.12.0标记为 O(区域内),下一跳 10.1.2.1(走 MPLS)
traceroute 172.20.12.1 source lo10第 1 跳 10.1.2.1(PE2),看不到 172.20.99.x
show ipv6 route 2001:db8:b:12::/64下一跳走 MPLS 侧(若 v6 Sham-Link 起不来,这里会走后门,属正常)
参考输出 · Sham-Link 状态
PE2# show ip ospf sham-links
Sham Link OSPF_SL0 to address 172.31.255.4 is up
Area 0 source address 172.31.255.2
  Run as demand circuit
  DoNotAge LSA allowed. Cost of using 10 State POINT_TO_POINT,
  Timer intervals configured, Hello 10, Dead 40, Wait 40,
    Hello due in 00:00:03
    Adjacency State FULL (Hello suppressed)
    Index 2/2, retransmission queue length 0, number of retransmission 0
    First 0x0(0)/0x0(0) Next 0x0(0)/0x0(0)

PE2# show ip route vrf CORP-B 172.20.12.0
Routing entry for 172.20.12.0/24
  Known via "ospf 200", distance 110, metric 11, type intra area   <-- 区域内!
  Last update from 10.1.2.2 on GigabitEthernet0/1, 00:00:21 ago
  Routing Descriptor Blocks:
  * 10.1.2.2, from 172.20.255.2, 00:00:21 ago, via GigabitEthernet0/1
      Route metric is 11, traffic share count is 1

6.6 故障演练:后门接管

  1. 在 CE-B1 上执行 interface Gi0/0 / shutdown(模拟 MPLS 接入中断)
  2. show ip route 172.20.12.0 —— 路由应该自动切换到 172.20.99.2(后门),类型仍是 O,cost 变成 1001
  3. ping 172.20.12.1 source lo10 仍然通(业务没断)
  4. 恢复 no shutdown,等 OSPF 收敛,路由应切回 10.1.2.1

这就是企业买 MPLS 还留一条廉价备份线的原因——花钱买的是"主用路径可控",而不是"唯一路径"

第 7 章 · DMVPN:MPLS 之上的加密叠加网

原理 DMVPN 三句话讲清楚 ① mGRE(多点 GRE):Hub 的一个 Tunnel 接口可以同时跟 N 个 Spoke 通信,不用为每个 Spoke 建一条隧道。
② NHRP(下一跳解析协议):Spoke 上线时向 Hub 注册"我的隧道内网 IP ↔ 我的公网/底层 IP"。Spoke 想访问另一个 Spoke 时,问 Hub:"172.16.100.12 在哪?" Hub 回答"底层地址是 X",于是 Spoke 之间动态建立直连隧道
③ Phase 3:Hub 用 ip nhrp redirect 告诉 Spoke "你可以直连",Spoke 用 ip nhrp shortcut 接受这个建议并缓存 —— 结果是分支间流量不绕总部,延迟和带宽都大幅改善。

本实验的特殊之处:NHRP 的"底层地址"不是公网 IP,而是 MPLS VPN 里的 172.16.100.0/24。也就是说 DMVPN 的 underlay 跑在 VRF BRANCH 上 —— 这正是"MPLS 打底 + DMVPN 加密叠加"的真实架构。
Underlay:MPLS L3VPN(VRF BRANCH)· 172.16.100.0/24 NHRP 注册 / GRE 封装用的地址层,由运营商提供 any-to-any 可达 Overlay:DMVPN mGRE + IPsec · Tunnel0 IPv4 10.100.0.0/24 | IPv6 2001:db8:100::/64 | EIGRP 100 承载业务路由 HUB(总部) SPOKE1 SPOKE2 Phase 3 动态直连隧道(NHRP Redirect + Shortcut) MTU 提示:MPLS(4-8B) + GRE(24B) + IPsec(~52B) → Tunnel 的 ip mtu 设 1400,tcp adjust-mss 1360
图 7-1 DMVPN 的 Underlay / Overlay 分层

7.1 PE 侧:VRF BRANCH 与 underlay eBGP

先让三台 DMVPN 路由器的 172.16.100.x/32 在 MPLS VPN 里互相可达。

PE1VRF BRANCH(接 SPOKE1)
configure terminal
vrf definition BRANCH
 rd 65000:300
 address-family ipv4
  route-target export 65000:300
  route-target import 65000:300
 exit-address-family
 address-family ipv6
  route-target export 65000:300
  route-target import 65000:300
 exit-address-family
!
interface GigabitEthernet0/3
 description ## PE1 Gi0/3  <-->  SPOKE1 Gi0/0 ##
 vrf forwarding BRANCH
 ip address 10.1.11.1 255.255.255.252
 ipv6 address 2001:db8:1:11::1/64
 no shutdown
!
router bgp 65000
 address-family ipv4 vrf BRANCH
  neighbor 10.1.11.2 remote-as 65003
  neighbor 10.1.11.2 activate
  neighbor 10.1.11.2 ttl-security hops 1
  ! 三个站点都是 AS 65003,本例让 CE 侧用 allowas-in 解决
  ! (对比:CORP-A 用的是运营商侧 as-override)
  neighbor 10.1.11.2 send-community both
  neighbor 10.1.11.2 maximum-prefix 50 80 restart 5
  neighbor 10.1.11.2 default-originate
 exit-address-family
 address-family ipv6 vrf BRANCH
  neighbor 10.1.11.2 remote-as 65003
  neighbor 10.1.11.2 activate
 exit-address-family
!
end
write memory
设备接口 / 地址
PE2Gi0/2 = 10.1.12.1/30 · 2001:db8:1:12::1/64 → SPOKE2(其余同上,neighbor 10.1.12.2)
PE4Gi0/3 = 10.1.14.1/30 · 2001:db8:1:14::1/64 → HUB(neighbor 10.1.14.2)
注意 为什么这里用 allowas-in 而不是 as-override? 两种方法都能解决"多站点同 AS",这里故意换一种写法让你对比:
· as-override运营商侧配置):PE 把客户 AS 号替换成自己的 AS。客户什么都不用改,适合运营商托管模式。
· allowas-in 1客户侧配置):CE 允许 AS_PATH 里出现自己的 AS 最多 1 次。适合客户自己管设备、运营商不给改配置的场景。
真实项目里两者只用其一,同时配会掩盖问题、调试困难。

7.2 IPsec / IKEv2(三台完全一致)

HUB / SPOKE1 / SPOKE2加密配置(先配,三台相同)
configure terminal
!===========================================================
! IKEv2 + IPsec:为 GRE 流量加密(transport 模式,省 20 字节)
!===========================================================
crypto ikev2 proposal DMVPN-PROP
 encryption aes-cbc-256
 integrity sha256
 group 14
!
crypto ikev2 policy DMVPN-POL
 proposal DMVPN-PROP
!
crypto ikev2 keyring DMVPN-KEYRING
 peer ANY
  address 0.0.0.0 0.0.0.0
  pre-shared-key local MplsLab@2026
  pre-shared-key remote MplsLab@2026
!
crypto ikev2 profile DMVPN-IKEV2
 match identity remote address 0.0.0.0
 authentication remote pre-share
 authentication local pre-share
 keyring local DMVPN-KEYRING
 dpd 40 5 on-demand
!
crypto ipsec transform-set DMVPN-TS esp-aes 256 esp-sha256-hmac
 mode transport
!
crypto ipsec profile DMVPN-PROF
 set transform-set DMVPN-TS
 set ikev2-profile DMVPN-IKEV2
!
end
write memory
注意 两个加密相关的坑mode transport 用于 GRE over IPsec(GRE 已经加了外层 IP 头,不需要再加一个)。如果写成 mode tunnel 会多 20 字节开销,容易触发分片。
② 预共享密钥里如果有 @ 等特殊字符,IOS 可能报错。出问题就换成纯字母数字。
③ IOSv 的 esp-sha256-hmac 可能需要较高版本;不支持就退回 esp-sha-hmac

7.3 HUB 配置

HUBDMVPN Phase 3 双栈 Hub(完整)
configure terminal
hostname HUB
ip cef
ipv6 unicast-routing
ipv6 cef
!
!===========================================================
! Front-door VRF:underlay 专用(FVRF),隧道与 LAN 在全局表(IVRF)
! 这是 DMVPN 的标准做法:underlay 与 overlay 路由表彻底分离
!===========================================================
vrf definition UNDERLAY
 rd 65003:100
 address-family ipv4
 exit-address-family
 address-family ipv6
 exit-address-family
!
!---------- underlay 上行口 ----------
interface GigabitEthernet0/0
 description ## HUB Gi0/0  <-->  PE4 Gi0/3 ##
 vrf forwarding UNDERLAY
 ip address 10.1.14.2 255.255.255.252
 ipv6 address 2001:db8:1:14::2/64
 no shutdown
!
!---------- NHRP / GRE 的源地址 ----------
interface Loopback100
 description ## DMVPN NBMA source ##
 vrf forwarding UNDERLAY
 ip address 172.16.100.1 255.255.255.255
 ipv6 address 2001:db8:100:ffff::1/128
!
!---------- 总部业务网段 ----------
interface Loopback10
 description ## HQ LAN ##
 ip address 192.168.20.1 255.255.255.0
 ipv6 address 2001:db8:c:20::1/64
!
!===========================================================
! DMVPN 隧道:一个 Tunnel 同时跑 IPv4 + IPv6(双栈单隧道)
!===========================================================
interface Tunnel0
 description ## DMVPN Phase3 - Dual Stack ##
 bandwidth 10000
 !
 !---- IPv4 overlay ----
 ip address 10.100.0.1 255.255.255.0
 no ip redirects
 ip mtu 1400
 ip tcp adjust-mss 1360
 ip nhrp authentication DMVPNKEY
 ip nhrp network-id 100
 ip nhrp holdtime 300
 ip nhrp map multicast dynamic        ! Hub:接受所有 Spoke 的动态组播映射
 ip nhrp redirect                     ! Phase 3:告诉 Spoke "你可以直连"
 !
 !---- IPv6 overlay(走 IPv4 传输的 mGRE)----
 ipv6 address 2001:db8:100::1/64
 ipv6 mtu 1400
 ipv6 nhrp authentication DMVPNKEY
 ipv6 nhrp network-id 100
 ipv6 nhrp holdtime 300
 ipv6 nhrp map multicast dynamic
 ipv6 nhrp redirect
 !
 !---- 隧道参数 ----
 tunnel source Loopback100
 tunnel vrf UNDERLAY                  ! 关键:underlay 查表用 UNDERLAY VRF
 tunnel mode gre multipoint
 tunnel key 100
 tunnel protection ipsec profile DMVPN-PROF
!
!===========================================================
! Overlay 路由:EIGRP 命名模式(双栈)
!===========================================================
router eigrp DMVPN
 !
 address-family ipv4 unicast autonomous-system 100
  af-interface Tunnel0
   no split-horizon                   ! Hub 必须关水平分割,否则 Spoke 学不到彼此
   no next-hop-self                   ! Phase 3 必须,保留 Spoke 真实下一跳
   summary-address 192.168.20.0/24
  exit-af-interface
  network 10.100.0.0 0.0.0.255
  network 192.168.20.0 0.0.0.255
  ! 若邻居起不来,在地址族下补一句:no shutdown
 exit-address-family
 !
 address-family ipv6 unicast autonomous-system 100
  af-interface Tunnel0
   no split-horizon
   no next-hop-self
  exit-af-interface
  network 2001:db8:100::/64
  network 2001:db8:c:20::/64
 exit-address-family
!
!===========================================================
! Underlay 路由:把 Lo100 通告进 MPLS VPN
!===========================================================
router bgp 65003
 bgp router-id 172.16.100.1
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 !
 address-family ipv4 unicast vrf UNDERLAY
  network 172.16.100.1 mask 255.255.255.255
  neighbor 10.1.14.1 remote-as 65000
  neighbor 10.1.14.1 activate
  neighbor 10.1.14.1 ttl-security hops 1
  neighbor 10.1.14.1 allowas-in 1        ! 三个站点同 AS 65003
  neighbor 10.1.14.1 send-community both
 exit-address-family
 !
end
write memory

7.4 SPOKE1 配置

SPOKE1DMVPN 分支(SPOKE2 见差异表)
configure terminal
hostname SPOKE1
ip cef
ipv6 unicast-routing
ipv6 cef
!  ! (IPsec 配置见 7.2,三台相同)
!
vrf definition UNDERLAY
 rd 65003:100
 address-family ipv4
 exit-address-family
 address-family ipv6
 exit-address-family
!
interface GigabitEthernet0/0
 description ## SPOKE1 Gi0/0  <-->  PE1 Gi0/3 ##
 vrf forwarding UNDERLAY
 ip address 10.1.11.2 255.255.255.252
 ipv6 address 2001:db8:1:11::2/64
 no shutdown
!
interface Loopback100
 vrf forwarding UNDERLAY
 ip address 172.16.100.11 255.255.255.255
 ipv6 address 2001:db8:100:ffff::11/128
!
interface Loopback10
 description ## Branch-1 LAN ##
 ip address 192.168.21.1 255.255.255.0
 ipv6 address 2001:db8:c:21::1/64
!
interface Tunnel0
 description ## DMVPN Phase3 - Spoke ##
 bandwidth 10000
 !
 ip address 10.100.0.11 255.255.255.0
 no ip redirects
 ip mtu 1400
 ip tcp adjust-mss 1360
 ip nhrp authentication DMVPNKEY
 ip nhrp network-id 100
 ip nhrp holdtime 300
 ! NHS = 下一跳服务器(Hub),nbma = Hub 的 underlay 地址
 ip nhrp nhs 10.100.0.1 nbma 172.16.100.1 multicast
 ip nhrp shortcut                     ! Phase 3:接受 Hub 的直连建议
 ip nhrp registration timeout 60
 !
 ipv6 address 2001:db8:100::11/64
 ipv6 mtu 1400
 ipv6 nhrp authentication DMVPNKEY
 ipv6 nhrp network-id 100
 ipv6 nhrp holdtime 300
 ipv6 nhrp nhs 2001:db8:100::1
 ipv6 nhrp map 2001:db8:100::1/128 172.16.100.1
 ipv6 nhrp map multicast 172.16.100.1
 ipv6 nhrp shortcut
 !
 tunnel source Loopback100
 tunnel vrf UNDERLAY
 tunnel mode gre multipoint
 tunnel key 100
 tunnel protection ipsec profile DMVPN-PROF
!
router eigrp DMVPN
 address-family ipv4 unicast autonomous-system 100
  af-interface Tunnel0
   no split-horizon
   no next-hop-self
  exit-af-interface
  network 10.100.0.0 0.0.0.255
  network 192.168.21.0 0.0.0.255
 exit-address-family
 address-family ipv6 unicast autonomous-system 100
  af-interface Tunnel0
   no split-horizon
   no next-hop-self
  exit-af-interface
  network 2001:db8:100::/64
  network 2001:db8:c:21::/64
 exit-address-family
!
router bgp 65003
 bgp router-id 172.16.100.11
 no bgp default ipv4-unicast
 address-family ipv4 unicast vrf UNDERLAY
  network 172.16.100.11 mask 255.255.255.255
  neighbor 10.1.11.1 remote-as 65000
  neighbor 10.1.11.1 activate
  neighbor 10.1.11.1 ttl-security hops 1
  neighbor 10.1.11.1 allowas-in 1
  neighbor 10.1.11.1 send-community both
 exit-address-family
!
end
write memory
SPOKE2 差异点
上行口 / 地址Gi0/0 = 10.1.12.2/30 · 2001:db8:1:12::2/64 → PE2 Gi0/2
NBMA 源Loopback100 = 172.16.100.12/32 · 2001:db8:100:ffff::12/128
隧道地址10.100.0.12/24 · 2001:db8:100::12/64
业务 LAN192.168.22.1/24 · 2001:db8:c:22::1/64
eBGP 邻居neighbor 10.1.12.1 remote-as 65000

7.5 DMVPN 验证

命令预期结果
show ip nhrpHub 上能看到 10.100.0.11 / 10.100.0.12 的动态映射,NBMA 地址 172.16.100.x
show ipv6 nhrp brief能看到 2001:db8:100::11/128 映射到 NBMA 172.16.100.11
show crypto ikev2 sa状态 READY,每个 Spoke 一条
show crypto ipsec sa | i encrypt|decrypt|pkts加解密计数在增长(说明真的在加密,不是明文 GRE)
show ip eigrp neighborsHub 上有 2 个邻居(Tunnel0)
show dmvpn总览:Type: Hub / Spoke,State: UP,Int: Tun0
ping 192.168.22.1 source lo10SPOKE1 → SPOKE2 的 LAN 通
traceroute 192.168.22.1 source lo10第一次经过 Hub(10.100.0.1),第二次起直接到 10.100.0.12 —— Phase 3 生效!
show ip nhrp shortcut能看到 Spoke 缓存的直连 shortcut 条目
参考输出 · Hub 上的 NHRP 与加密会话
HUB# show dmvpn
Legend: Attrb --> S - Static, D - Dynamic, I - Incomplete
        N - NATed, L - Local, X - No Socket
        # Ent --> Number of NHRP entries with same NBMA peer
Tunnel0, Type:Hub, NHRP Peers:2,
 # Ent  Peer NBMA Addr Peer Tunnel Add State  UpDn Tm Attrb
 ----- --------------- --------------- ----- -------- -----
     1 172.16.100.11      10.100.0.11    UP 00:14:22     D
     1 172.16.100.12      10.100.0.12    UP 00:14:05     D

HUB# show ipv6 nhrp brief
Target             Via            NBMA            Mode   Intfc   Claimed
2001:db8:100::11/128 2001:db8:100::11 172.16.100.11  dynamic Tu0    <-->
2001:db8:100::12/128 2001:db8:100::12 172.16.100.12  dynamic Tu0    <-->

HUB# show crypto ikev2 sa
 IPv4 Crypto IKEv2  SA
Tunnel-id Local                 Remote                fvrf/ivrf            Status
1         172.16.100.1/500      172.16.100.11/500     UNDERLAY/none        READY
2         172.16.100.1/500      172.16.100.12/500     UNDERLAY/none        READY

SPOKE1# show ip nhrp shortcut
10.100.0.12/32 via 10.100.0.12
   Tunnel0 created 00:00:41, expire 00:04:19
   Type: dynamic, Flags: router nhop rib
   NBMA address: 172.16.100.12
   Preference: 255
看懂 怎么证明 Phase 3 生效了 在 SPOKE1 上连续执行两次 traceroute 192.168.22.1 source lo10
· 第 1 次:路由表里还没有 SPOKE2 的直连信息 → 包先发给 Hub → Hub 转发并回一个 NHRP Redirect
· 第 2 次:SPOKE1 已经通过 NHRP 解析到 SPOKE2 的 NBMA 地址,直接建隧道 → traceroute 只有一跳 10.100.0.12
如果第二次还是经过 Hub,检查:① Hub 有没有 ip nhrp redirect;② Spoke 有没有 ip nhrp shortcut;③ EIGRP 有没有 no next-hop-self

7.6 排错速查

现象原因排查
NHRP 注册不上underlay 不通(172.16.100.x 互不可达)ping vrf UNDERLAY 172.16.100.1 source lo100
underlay 不通VRF BRANCH 的 RT 不一致 / eBGP 没起来 / allowas-in 没配show bgp vpnv4 unicast vrf BRANCH
隧道 UP 但业务不通MTU 太大导致分片被丢调小 ip mtu 到 1350 试试
IPsec SA 起不来keyring / profile / PSK 不一致debug crypto ikev2
EIGRP 邻居起不来ip nhrp map multicast 没配(组播发不出去)② 地址族被 shutdownshow ip nhrp;show eigrp address-family
IPv6 NHRP 无条目版本 IOSv 不支持 ipv6 nhrp换 CSR1000v / IOS-XE 16.9+
Spoke 间流量仍绕 Hub缺 redirect / shortcut / no next-hop-self见 7.5 的说明
进阶 DMVPN 与 MPLS 的分工与切换 本实验中 MPLS VPN(VRF BRANCH)只提供 underlay 可达,业务流量全部走加密的 DMVPN overlay。
真实项目里通常还会做备份路径:当 DMVPN 隧道 down 掉时,把流量切回 MPLS 明文路径(毕竟比断网强)。做法是:
① 在 CE 上把业务网段通告进 VRF BRANCH(用 route-map 打上更差的 community / 更长的 AS-PATH);
② 用 IP SLA 探测隧道对端,配合 track + 浮动静态路由实现切换;
③ 或者直接依赖 EIGRP:隧道 down → 路由消失 → 走 MPLS 学到的备份路由。
注意权衡:一旦把明文路由也发布出去,就有"绕过加密"的合规风险,金融行业一般不允许,需要根据等保/合规要求决定。

第 8 章 · 高级特性工厂

这一章的每一节都相互独立,可以按需挑着做。每一项都是现网里真会用到的东西,配完之后记得 write memory 并导出配置备份。

8.1 BGP 特性速查表

特性解决什么问题配置位置与命令本实验用在哪
as-override客户多站点用同一 AS 号,路由被 AS_PATH 防环丢弃PE:address-family ipv4 vrf X
neighbor Y as-override
客户 A(已配)
allowas-in同上,但改在客户侧CE:neighbor X allowas-in 1DMVPN underlay(已配)
SoO多宿主站点路由被"绕一圈又回来"PE:neighbor Y soo 65000:101客户 A(已配)
local-as客户被并购、AS 号要临时换,又不能改 CEneighbor Y local-as 65002 no-prepend replace-as可选练习
maximum-prefix客户误发布全表把 PE 打爆neighbor Y maximum-prefix 100 80 restart 10已配
ttl-security防伪造的远距离 eBGP 会话(GTSM)neighbor Y ttl-security hops 1已配
Graceful RestartBGP 进程重启 / 主备倒换时转发不断bgp graceful-restart已配
Add-Path同一个前缀通告多条路径,供快速切换bgp additional-paths select/ send/receive/install已配
BGP PIC故障时不等 BGP 重新收敛,直接切备份路径(<50ms)bgp recursion host + additional-paths install已配
Best ExternaliBGP 与 eBGP 两条路都有时,把最好的 eBGP 也通告出去address-family X
bgp advertise-best-external
可选练习
Dampening抑制频繁震荡的路由bgp dampening 15 750 2000 60可选练习
remove-private-as发布给公网时去掉私有 AS 号neighbor Y remove-private-as可选练习
条件通告"只有某条路由存在时才通告另一条"neighbor Y advertise-map A exist-map B可选练习
路由聚合压缩路由表规模aggregate-address 192.168.0.0/16 summary-only可选练习

8.2 Add-Path 与 BGP PIC:把收敛时间从秒级压到毫秒级

原理 普通 BGP 的"浪费" RR 可能知道去往 192.168.12.0/24 有两条路(经 PE3 和经 PE4),但按规则只把最优的一条发给 PE。等最优路径断了,PE 才发现"我没有备份",然后等 RR 重新发一条更新 —— 这中间是秒级的中断。

Add-Path 让 RR 把两条都发过来(用 Path ID 区分);PIC 让 PE 把备份路径预先写进 CEF 转发表。故障发生时,硬件直接切换到已装好的备份下一跳,不需要等 BGP 重新计算 —— 中断时间降到 50ms 以内,和 IGP 收敛一个量级。
验证 PIC 是否装了备份路径
! 在 PE1 上查看:同一前缀应有 2 个 path(best + backup)
PE1# show bgp vpnv4 unicast vrf CORP-A 192.168.12.0
Paths: (2 available, best #1, table CORP-A)
  Additional-path
  ...
  Path #2:  by 10.0.0.24 ...  (backup / repair path)

! 看 CEF 里有没有 repair 路径 —— 有就说明 PIC 生效
PE1# show ip cef vrf CORP-A 192.168.12.0 detail
192.168.12.0/24, epoch 0, flags rib only nolabel, rib defined all labels
  recursive via 10.0.0.23
    nexthop 10.0.1.2 GigabitEthernet0/0 label 21 23
  recursive via 10.0.0.24           <-- 备份下一跳(repair)
    nexthop 10.0.8.2 GigabitEthernet0/1 label 19 25

! 也可以看 BGP 的 PIC 统计
PE1# show bgp vpnv4 unicast all | include PIC

8.3 从 peer-group 升级到 peer-template

peer-group 的缺点是改一个参数会重建组里所有会话。peer-template 把"会话参数"(transport、timer、password)和"策略参数"(route-map、send-community)分开,继承关系更灵活。

RR1peer-template 版本(替换 peer-group 写法)
router bgp 65000
 !
 !---------- 会话模板:只管"怎么连" ----------
 template peer-session IBGP-SESSION
  remote-as 65000
  update-source Loopback0
  password 0 MplsLab@2026
  timers 5 15
  transport connection-mode active
 exit-peer-session
 !
 template peer-session IBGP-RR-SESSION
  inherit peer-session IBGP-SESSION
  version 4
 exit-peer-session
 !
 !---------- 策略模板:只管"发什么" ----------
 template peer-policy IBGP-POLICY
  send-community extended
  route-reflector-client
  advertise additional-paths all
 exit-peer-policy
 !
 template peer-policy IBGP-RR-POLICY
  send-community extended
 exit-peer-policy
 !
 !---------- 邻居引用模板 ----------
 neighbor 10.0.0.21 inherit peer-session IBGP-SESSION
 neighbor 10.0.0.22 inherit peer-session IBGP-SESSION
 neighbor 10.0.0.23 inherit peer-session IBGP-SESSION
 neighbor 10.0.0.24 inherit peer-session IBGP-SESSION
 neighbor 10.0.0.2  inherit peer-session IBGP-RR-SESSION
 !
 address-family vpnv4 unicast
  neighbor 10.0.0.21 inherit peer-policy IBGP-POLICY
  neighbor 10.0.0.22 inherit peer-policy IBGP-POLICY
  neighbor 10.0.0.23 inherit peer-policy IBGP-POLICY
  neighbor 10.0.0.24 inherit peer-policy IBGP-POLICY
  neighbor 10.0.0.2  inherit peer-policy IBGP-RR-POLICY
 exit-address-family
 !
 address-family vpnv6 unicast
  neighbor 10.0.0.21 inherit peer-policy IBGP-POLICY
  neighbor 10.0.0.22 inherit peer-policy IBGP-POLICY
  neighbor 10.0.0.23 inherit peer-policy IBGP-POLICY
  neighbor 10.0.0.24 inherit peer-policy IBGP-POLICY
  neighbor 10.0.0.2  inherit peer-policy IBGP-RR-POLICY
 exit-address-family
!
! 验证:
!   show bgp template peer-session
!   show bgp template peer-policy

8.4 MPLS TE:给流量指定一条"专用车道"

原理 IGP 的短板与 TE 的补位 OSPF/IS-IS 只会算"最短路径",于是所有流量都挤在最优链路上,旁边那条贵的链路闲着 —— 典型的鱼形问题
MPLS TE 用 RSVP-TE 建立一条显式路径的隧道(可以手工指定经过哪些路由器),然后把流量"引"进这条隧道(autoroute announcestatic route),还能预留带宽。

本实验用 PE1↔PE4 的直连链路(L8)做演示:默认流量走 PE1→P1→P2→PE4,我们用 TE 隧道强制走 PE1→PE4 直连。
PE1MPLS TE 隧道
configure terminal
!---------- 全局开启 TE ----------
mpls traffic-eng tunnels
!
!---------- 骨干接口启用 TE + RSVP 带宽 ----------
interface GigabitEthernet0/0
 mpls traffic-eng tunnels
 ip rsvp bandwidth 100000
!
interface GigabitEthernet0/1
 mpls traffic-eng tunnels
 ip rsvp bandwidth 100000
!
!---------- IGP 通告 TE 信息(OSPF 需要 Opaque LSA)----------
router ospf 1
 mpls traffic-eng router-id Loopback0
 mpls traffic-eng area 0
!
!---------- 显式路径:强制走 PE1 → PE4 直连 ----------
ip explicit-path name VIA-DIRECT enable
 next-address 10.0.8.2
!
!---------- 隧道接口 ----------
interface Tunnel100
 description ## MPLS TE: PE1 -> PE4 (via direct link) ##
 ip unnumbered Loopback0
 tunnel destination 10.0.0.24
 tunnel mode mpls traffic-eng
 tunnel mpls traffic-eng bandwidth 50000
 tunnel mpls traffic-eng priority 5 5
 tunnel mpls traffic-eng path-option 1 explicit name VIA-DIRECT
 tunnel mpls traffic-eng path-option 2 dynamic
 ! 把 TE 隧道放进 IGP 计算(注意:这只影响本端出流量)
 tunnel mpls traffic-eng autoroute announce
 no shutdown
!
end
write memory
TE 验证命令
PE1# show mpls traffic-eng tunnels brief
Signalling Summary:
    LSP Tunnels Process:  running
    Passive LSP Listener: running
    RSVP Process:         running
    Forwarding:           enabled
TUNNEL NAME         DESTINATION      UP IF     DOWN IF   STATE/PROT
PE1_t100            10.0.0.24        -         Gi0/1     up/up

PE1# show mpls traffic-eng tunnels tunnel100
    Name: PE1_t100                      (Tunnel100) Destination: 10.0.0.24
    Status: Admin: up   Oper: up   Path: valid   Signalling: connected
      path option 1, (Explicit Path) type explicit VIA-DIRECT (Basis for Setup)
    Config Parameters:
      Bandwidth: 50000    kbps (Global)  Priority: 5  5   Affinity: 0x0/0xFFFF
      AutoRoute announce: enabled  LockDown: disabled   Policy class: not set
    Shortest Unconstrained Path Info:
      Path Weight: 30 (TE)
      Explicit Route: 10.0.8.1 10.0.8.2 10.0.0.24
    History:
      Tunnel has been up for: 00:03:12
版本 IOSv 的 TE 支持度 部分 IOSv 镜像对 mpls traffic-engip rsvp bandwidth 支持不全(可能报 % Invalid input)。遇到就跳过,理解原理即可 —— 真机上这些命令是标准的。
要完整练 TE,建议用 CSR1000v(IOS-XE 16.9+)IOS-XRv

8.5 QoS over MPLS:让 EXP 位在骨干里被尊重

原理 为什么 MPLS 需要"预处理" PE 收到客户包时能看到 DSCP,但一旦压上 MPLS 标签,中间的 P 路由器只看标签,看不清里面的 IP 头。
两件事必须做:
标记:在 PE 入方向把 DSCP 映射到 MPLS EXP(标签里的 3 位 CoS),P 路由器据此调度;
qos pre-classify:如果流量是从隧道/加密接口进来的,PE 看到的已经是封装后的包,原始 DSCP 在最内层。加 qos pre-classify 让设备"先看一眼原始包"再做分类。
PE1QoS 标记 + 隧道预处理
configure terminal
!---------- 1) 分类 ----------
class-map match-any CM-VOICE
 match dscp ef
class-map match-any CM-VIDEO
 match dscp af41 af42 af43
class-map match-any CM-CRITICAL
 match dscp af31 af32 af33
!
!---------- 2) 标记:把 DSCP 映射到 MPLS EXP ----------
policy-map PM-MPLS-MARK
 class CM-VOICE
  set mpls experimental imposition 5
  police 2000000 conform-action transmit exceed-action drop
 class CM-VIDEO
  set mpls experimental imposition 4
 class CM-CRITICAL
  set mpls experimental imposition 3
 class class-default
  set mpls experimental imposition 0
!
!---------- 3) 应用到客户接口(入方向)----------
interface GigabitEthernet0/2
 vrf forwarding CORP-A
 service-policy input PM-MPLS-MARK
!
!---------- 4) 出方向:按 EXP 调度(LLQ 给语音)----------
policy-map PM-CORE-OUT
 class CM-VOICE
  priority percent 20
 class CM-VIDEO
  bandwidth percent 25
 class CM-CRITICAL
  bandwidth percent 15
 class class-default
  fair-queue
!
interface GigabitEthernet0/0
 service-policy output PM-CORE-OUT
!
!---------- 5) 隧道 / 加密场景:先解封装再分类 ----------
! 对 DMVPN 的 Hub/Spoke(在 HUB 上配)
interface Tunnel0
 qos pre-classify
!
end
write memory
验证
PE1# show policy-map interface GigabitEthernet0/2
 GigabitEthernet0/2
  Service-policy input: PM-MPLS-MARK
    Class-map: CM-VOICE (match-any)
      1243 packets, 132158 bytes
      5 minute offered rate 4000 bps, drop rate 0 bps
      Match: dscp ef (46)
      QoS Set:
        mpls experimental imposition 5

! 抓包验证:在 PE1-P1 链路上抓包,MPLS 头的 EXP 字段应为 5
! Wireshark 过滤:mpls && mpls.exp == 5

8.6 LDP 与 MPLS 的加固项

核心设备(P 与 PE)通用加固
configure terminal
!
! ① LDP 会话保护:链路短暂抖动时不重建 LDP 会话(避免标签重收敛)
mpls ldp
 session protection
 ! 或限定范围 + 保护时长:
 ! session protection for CORE-LDP duration 120
!
! ② LDP 与 IGP 同步:IGP 通告某链路前,先确认 LDP 已就绪
router ospf 1
 mpls ldp sync
 ! 等待超时(秒),超时后不再等待,避免永久卡住
 mpls ldp sync holddown 30
!
! ③ 接受定向 Hello(Targeted LDP):用于 LDP over TE、L2VPN、mLDP
mpls ldp
 discovery targeted-hello accept from CORE-LDP
 discovery targeted-hello interval 10
 discovery targeted-hello holdtime 90
!
! ④ 隐藏核心拓扑:转发时不把 IP TTL 复制到 MPLS TTL
!    这样 traceroute 从客户侧看不到骨干有几跳(安全 + 美观)
no mpls ip propagate-ttl forwarded
! 本地产生的包仍然复制 TTL(便于自己排错)
mpls ip propagate-ttl local
!
! ⑤ TTL 到期时在哪里弹标签:pop 1 表示在倒数第一跳(更贴近真实)
mpls ip ttl-expiration pop 1
!
! ⑥ 提高接口 MPLS MTU(标签栈会变长,双层标签 +8 字节)
interface GigabitEthernet0/0
 mtu 9216
 mpls mtu 9200
!
! ⑦ 加快 LDP 检测
mpls ldp
 discovery hello interval 5
 discovery hello holdtime 15
!
end
write memory
注意 改 MTU 会重置接口 修改 mtu 会导致接口 flapping(OSPF 邻居重建)。建议一开始搭建时就配好,不要在业务运行中改。
另外:EVE-NG 里所有设备的 MTU 必须端到端一致,只改一台反而会造成 OSPF 卡在 EXSTART。

8.7 MPLS OAM:像 ping IP 一样 ping 标签隧道

这是排错利器。当"Ping 不通"时,先用 OAM 确认 LSP 本身有没有问题,再往上查 BGP。

MPLS OAM 命令
! ① LSP Ping:验证到某台 PE 的标签路径是否可达(数据平面)
PE1# ping mpls ipv4 10.0.0.24/32
Sending 5, 100-byte MPLS Echos to 10.0.0.24/32,
     timeout is 2 seconds, send interval is 0 msec:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/2/4 ms

! ② LSP Traceroute:逐跳显示标签交换路径(能看到每一跳用了什么标签)
PE1# traceroute mpls ipv4 10.0.0.24/32
Tracing MPLS Label Switched Path to 10.0.0.24/32, timeout is 2 seconds
  0 10.0.1.1 MRU 1500 [Labels: 21 Exp: 0]
L 1 10.0.1.2 MRU 1500 [Labels: 21 Exp: 0] 3 ms
L 2 10.0.5.2 MRU 1500 [Labels: 21 Exp: 0] 4 ms
! 3 10.0.4.1 5 ms            <-- 到达 PE4

! ③ 带源地址(VRF 场景常用)
PE1# ping mpls ipv4 10.0.0.24/32 source 10.0.0.21

! ④ 验证 VPN 标签(两层标签)
PE1# ping mpls ipv4 10.0.0.24/32 verbose

! ⑤ IPv6 LSP(6PE 场景)
PE1# ping mpls ipv6 fd00::24/128

! ⑥ 查看 LSP 树(拓扑视角)
PE1# show mpls ldp bindings 10.0.0.24 32
PE1# show mpls forwarding-table 10.0.0.24 32 detail

第 9 章 · 全网验收与故障演练

9.1 端到端验收清单

把下面这张表跑一遍,全绿才算通关。建议在 CE 上执行(因为最终用户体验在 CE 侧)。

#验证项命令 / 操作预期
1骨干 IGP v4P1# show ip route ospf | i /328 条 /32
2骨干 IGP v6P1# show ipv6 route ospf | i /1288 条 /128
3LDPP1# show mpls ldp neighbor | i Oper≥3 个 Operational
4LSP 连通PE1# ping mpls ipv4 10.0.0.24/32!!!!!
56PE 标签PE1# show bgp ipv6 unicast labelsfd00::2x 都有 label
6MP-BGP 会话RR1# show bgp all summary5 个 AF 全 Established
7客户 A v4CE-A1# ping 192.168.12.1 source lo10!!!!!
8客户 A v6CE-A1# ping 2001:db8:a:12::1 source lo10!!!!!
9客户 A 路径隐藏CE-A1# traceroute 192.168.12.1 source lo10看不到 10.0.x 骨干地址
10客户 B v4CE-B1# ping 172.20.12.1 source lo10!!!!!(走 MPLS)
11客户 B v6CE-B1# ping 2001:db8:b:12::1 source lo10!!!!!
12Sham-LinkPE2# show ip ospf sham-links状态 UP
13DMVPN underlaySPOKE1# ping vrf UNDERLAY 172.16.100.12 source lo100!!!!!
14DMVPN overlay v4SPOKE1# ping 192.168.22.1 source lo10!!!!!
15DMVPN overlay v6SPOKE1# ping 2001:db8:c:22::1 source lo10!!!!!
16IPsec 加密SPOKE1# show crypto ipsec sa | i pkts计数持续增长
17Phase 3 直连SPOKE1# traceroute 192.168.22.1 source lo10(跑两次)第 2 次只有 1 跳
18VPN 隔离CE-A1# ping 172.20.11.1 source lo10不通(这是对的!)
19RR 冗余shutdown RR1 后重跑 #7仍然通
20配置保存每台 write memory + EVE-NG Export all CFGs拿到 lab-final.zip
重点 第 18 项"不通"才是正确答案 客户 A 的客户 B 互相 ping 不通,恰恰证明 VRF 隔离生效了。很多新手会把它当 bug 查半天。
如果需要互通,必须走"公共 VRF / 防火墙 / NAT"这类受控出口(Extranet VPN),那是另一个主题。

9.2 故障演练:8 个场景

每个场景都按 注入 → 观察 → 分析 → 恢复 四步做。务必先备份配置Export all CFGs)。

场景 1:骨干链路中断(PE1 ↔ P1)

  1. 注入PE1(config)# interface Gi0/0 / shutdown
  2. 观察show ip ospf neighbor 掉一个;show mpls forwarding-table 里到 PE3/PE4 的下一跳变成 Gi0/1(走 PE1-PE4 直连)
  3. 分析:IGP 重算 → LDP 重建标签 → BGP 下一跳可达性重新解析。客户业务可能中断几秒(取决于 BFD 是否启用)。启用 BFD 后应 < 1s。
  4. 恢复no shutdown,确认路由回到原路径

场景 2:单台 RR 宕机

  1. 注入:EVE-NG 里 Stop RR1(或直接 RR1# reload
  2. 观察PE1# show bgp vpnv4 all summary 只剩 10.0.0.2 一个邻居;但业务 ping 完全不受影响
  3. 分析:这就是双 RR 的价值 —— 控制平面有冗余,转发平面本来就不经过 RR。
    如果配了 bgp graceful-restart,RR 重启期间 PE 会保留"stale path",连路由抖动都不会有。
  4. 恢复:启动 RR1,等会话重建

场景 3:LDP 断了但 IGP 还在(最经典的"黑洞")

  1. 注入P1(config)# interface Gi0/2 / no mpls ip(去掉核心横联的 LDP,但 OSPF 还在)
  2. 观察ping 10.0.0.24 依然通(IGP 通),但 CE-A1# ping 192.168.12.1 不通
    PE1# show ip cef vrf CORP-A 192.168.12.0 会发现标签没解析出来
  3. 分析:这是 MPLS 黑洞 —— 控制平面说"可达",数据平面没有标签,包被丢弃。
    预防手段就是 mpls ldp igp sync:让 OSPF 在 LDP 没就绪前不通告这条链路,从源头避免黑洞。装上之后再试一次,OSPF 会自动避开 Gi0/2。
  4. 恢复:加回 mpls ip

场景 4:RT 配错

  1. 注入PE3(config-vrf-af)# no route-target export 65000:100
    PE3(config-vrf-af)# route-target export 65000:999
  2. 观察PE1# show bgp vpnv4 unicast vrf CORP-A 里 192.168.12.0/24 消失;但 PE3# show bgp vpnv4 all 里还在(本地有)
  3. 分析:路由发出去了,但对端 import RT 匹配不上 → 不进 VRF。
    定位口诀:① 本地有 Remote 没有 → 查 export RT;② Remote 收到但不进表 → 查 import RT;③ 根本没收到 → 查 RTC / 会话。
  4. 恢复:改回 65000:100,clear bgp vpnv4 unicast 10.0.0.1 soft 加速

场景 5:去掉 as-override

  1. 注入PE1(config-router-af)# no neighbor 10.1.1.2 as-override
  2. 观察:CE-A1 上学不到 192.168.12.0/24;debug bgp updates 能看到 DENIED due to: AS-PATH contains our own AS
  3. 恢复:加回 as-override,或在 CE-A1 上加 neighbor 10.1.1.1 allowas-in 1 对比效果

场景 6:Sham-Link 未配时启用后门链路

  1. 注入PE2(config-router)# no area 0 sham-link ...;CE-B1/CE-B2 的 Gi0/1 no shutdown
  2. 观察CE-B1# show ip route 172.20.12.0 → 下一跳 172.20.99.2,类型是 O(区域内)
  3. 分析:OSPF 区域内路由永远优先,客户流量绕过 MPLS 走后门(通常后门是低带宽的廉价线路,会拥塞)
  4. 恢复:加回 Sham-Link,路由改走 MPLS

场景 7:DMVPN underlay 中断

  1. 注入PE1(config)# interface Gi0/3 / shutdown(SPOKE1 的 MPLS 接入断了)
  2. 观察show ip nhrp 条目老化消失;show crypto ikev2 sa 会话 down;show ip route 192.168.22.0 路由消失
  3. 分析:underlay 一断,NHRP 无法维持注册,隧道随之 down。这正是"MPLS 打底"的风险 —— 底层单点
    真实项目里分支通常有 双上行(MPLS + Internet VPN),DMVPN 可以在两条 underlay 上各建一套隧道(Dual Cloud DMVPN)。
  4. 恢复no shutdown,看 NHRP 重新注册(约 30-60 秒)

场景 8:MTU / 分片导致的"能 ping 通但打不开网页"

  1. 注入:把 Tunnel0 的 ip mtu 改回 1500(no ip mtu 1400),并去掉 ip tcp adjust-mss
  2. 观察:小包 ping 通,但大包 ping 192.168.22.1 size 1500 df-bit 不通
  3. 分析:MPLS(8B) + GRE(24B) + IPsec(~52B) ≈ 84B 开销,1500 的包封装后超 MTU,DF 位又不允许分片 → 被丢。
    TCP 更惨:握手能过,一传数据就卡死(典型"网页打不开但 QQ 能上")。
  4. 恢复ip mtu 1400 + ip tcp adjust-mss 1360

9.3 MPLS VPN 排错决策树

从"Ping 不通"开始,一步一步缩小范围
客户 CE 上 ping 对端 LAN 不通
   │
   ├─① CE 本地有路由吗?  show ip route <对端LAN>
   │     └─ 没有 → 查 PE-CE 协议(eBGP/OSPF 邻居、network 语句、重分发)
   │
   ├─② PE 的 VRF 表里有这条路由吗?  show ip route vrf <VRF> <对端LAN>
   │     ├─ 没有 → 查本端 PE 有没有从 CE 学到(show bgp vpnv4 unicast vrf X)
   │     │          └─ 学到了但没装表 → 下一跳不可达(回 ④)
   │     └─ 有 → 继续 ③
   │
   ├─③ 对端 PE 有这条 VPNv4 路由吗?  show bgp vpnv4 unicast all | i <前缀>
   │     ├─ 完全没有 → 查 RT(export/import 是否匹配)、查 RTC 订阅
   │     ├─ 有但本端收不到 → 查 RR:
   │     │     show bgp vpnv4 unicast all neighbors 10.0.0.1 received-routes
   │     │     如果 RR 上也没有 → 源 PE 没发出(回 RT / 重分发)
   │     └─ 都有 → 继续 ④
   │
   ├─④ 下一跳可达吗?  show ip cef vrf X <前缀>    ← 有无 "label A B"
   │     ├─ 没有标签 → LDP 问题!
   │     │     show mpls ldp neighbor      (邻居在不在)
   │     │     show mpls forwarding-table  (有没有出标签)
   │     │     ping mpls ipv4 <对端PE>/32  (LSP 通不通)
   │     └─ 有标签 → 继续 ⑤
   │
   ├─⑤ 数据平面真的通吗?
   │     ping mpls ipv4 <对端PE-lo0>/32          → 不通:LDP/LSP 故障
   │     traceroute mpls ipv4 <对端PE-lo0>/32    → 看在哪一跳断
   │     抓包看 PE-CE 与 P 链路上的标签栈
   │
   └─⑥ 单向通 / 双向不通?
         检查回程路由、ACL、VRF 接口绑定、CE 上是否有默认路由

【三句口诀】
   控制平面看 BGP(show bgp vpnv4 / show ip route vrf)
   转发平面看标签(show mpls forwarding-table / show ip cef vrf)
   两层都对还不通 → 一定是 ACL / MTU / NAT

第 10 章 · 下一步:从 MPLS VPN 走向更远

10.1 Inter-AS MPLS VPN:两个运营商怎么对接

本实验只有一个 AS。现实中一个跨国企业的站点可能分属不同运营商,于是有了三种对接方式:

方式怎么做优点缺点适用场景
Option A
(背靠背 VRF)
两个 ASBR 之间用多个子接口/VRF互连,每个 VPN 一条链路,互相当对方是 CE(跑普通 eBGP / OSPF)最简单、最安全、故障域隔离好ASBR 上要为每个 VPN 建一条逻辑链路,扩展性差(几百个 VPN 就崩溃)VPN 数量少(< 50)、要求严格隔离
Option B
(eBGP 重分发标签 VPN 路由)
两个 ASBR 之间只建一条 eBGP 会话,直接交换带标签的 VPNv4 路由(MP-eBGP)扩展性好,ASBR 上不需要 VRFASBR 要保存全部 VPN 路由,压力大;需要互相信任 RT 规划主流做法,中大型运营商间对接
Option C
(多跳 eBGP 分发标签)
两个 AS 的 RR 之间直接建多跳 eBGP 传 VPN 路由;ASBR 之间只用 eBGP 交换各自 PE 的 loopback + 标签(send-label)ASBR 不存 VPN 路由,扩展性最好,端到端一条 LSP最复杂,跨域排错困难;需要标签连续超大运营商、跨国骨干
Option C 的关键配置片段(概念演示)
!---------- ASBR1(AS 65000 侧)----------
router bgp 65000
 ! 向对端 ASBR 通告【本 AS 内 PE 的 loopback + 标签】
 address-family ipv4 unicast
  network 10.0.0.21 mask 255.255.255.255
  network 10.0.0.22 mask 255.255.255.255
  neighbor 192.0.2.2 remote-as 65100
  neighbor 192.0.2.2 activate
  neighbor 192.0.2.2 send-label           ! 关键:带标签发布
 exit-address-family
!
!---------- RR1 与对端 RR 建多跳 eBGP,直接交换 VPNv4 ----------
router bgp 65000
 neighbor 10.100.100.2 remote-as 65100
 neighbor 10.100.100.2 ebgp-multihop 255
 neighbor 10.100.100.2 update-source Loopback0
 !
 address-family vpnv4 unicast
  neighbor 10.100.100.2 activate
  neighbor 10.100.100.2 send-community extended
  ! 跨域时下一跳不能改,否则标签链断裂
  neighbor 10.100.100.2 next-hop-unchanged
 exit-address-family

10.2 EVPN:MPLS VPN 的现代继任者

原理 EVPN 与 L3VPN 的关系 传统 L3VPN(本手册做的)是"为三层互联设计的,后来勉强支持二层"。EVPN 反过来:用 BGP 的 l2vpn evpn 地址族统一承载二层(VPWS/E-LAN)和三层(EVPN IRB)业务,控制平面学习 MAC/IP,不再依赖数据平面泛洪。

核心优势:
· All-Active 多归属:CE 双上行到两台 PE,两条链路同时转发(传统 VPLS 只能主备);
· Aliasing + 快速收敛:一条链路故障,流量瞬间切到另一条;
· ARP/ND 抑制:PE 本地代答,把广播风暴挡在骨干之外;
· 一套控制平面搞定 L2 + L3:运维复杂度大幅下降。
EVPN 地址族示意(在 RR / PE 上加)
router bgp 65000
 address-family l2vpn evpn
  neighbor 10.0.0.1 activate
  neighbor 10.0.0.1 send-community both
 exit-address-family
!
! 二层实例(EVI)
l2vpn evpn instance 100 vlan-based
 rd 65000:100
 route-target export 65000:100
 route-target import 65000:100

10.3 向 Segment Routing 迁移

SR 是 MPLS 的"简化版":砍掉 LDP 和 RSVP-TE 两个协议,标签由 IGP(OSPF/IS-IS)或 BGP 直接分发,源路由(一条有序的标签列表)写在包头里。

对比项传统 MPLS(本实验)SR-MPLSSRv6
标签分发协议LDP / RSVP-TEIGP(SRGB)+ BGPIPv6 扩展头(SID)
需要维护的协议数3(IGP + LDP + BGP)2(IGP + BGP)2(IGP + BGP)
状态每台 LSR 维护每条 LSP 状态只在入口维护,中间无状态同左
TE 能力RSVP-TE,复杂SR-TE,天然支持最强(网络编程)
数据平面MPLSMPLS纯 IPv6,无需 MPLS
本实验迁移成本改 IGP + 去掉 LDP,BGP 层几乎不动需 IPv6 骨干,改动大
感受一下 SR-MPLS 的配置量(IS-IS 举例)
! 传统 MPLS 需要:IGP + LDP + (TE 时还要 RSVP)
! SR-MPLS 只需在 IGP 里加几行:
router isis CORE
 net 49.0001.0100.0000.0021.00
 is-type level-2-only
 metric-style wide
 segment-routing mpls
 !
 address-family ipv4 unicast
  segment-routing mpls
 exit-address-family
!
segment-routing mpls
 global-block 16000 23999          ! SRGB
 !
 connected-prefix-sid-map
  address-family ipv4
   10.0.0.21/32 index 21          ! Node-SID = 16000 + 21
  exit-address-family
!
! 结果:不再需要 mpls ldp / mpls ip / rsvp,标签由 IGP 分发

10.4 学完这个实验,下一步该练什么

🔧 深化动手

· 把 IGP 从 OSPF 换成 IS-IS(运营商主流)
· 加一对 ASBR,练 Inter-AS Option B
· 加第 3 个 RR,练分层 RRConfederation
· 用 Ansible/Python 批量下发本实验的全部配置

📚 知识补全

· RFC 4364(BGP/MPLS IP VPNs)—— 本实验的理论基石
· RFC 4659(6VPE)、RFC 4798(6PE)
· RFC 4684(RTC)、RFC 7911(Add-Path)
· RFC 7432(EVPN)、RFC 8402(Segment Routing)

附录

附录 A · 命令速查表

想看什么命令
OSPF 邻居show ip ospf neighbor / show ipv6 ospf neighbor
LDP 邻居show mpls ldp neighbor / show mpls ldp discovery
标签绑定show mpls ldp bindings / show mpls forwarding-table
LSP 连通性ping mpls ipv4 <prefix> / traceroute mpls ipv4 <prefix>
BGP 全地址族汇总show bgp all summary
VPNv4 路由show bgp vpnv4 unicast all / show bgp vpnv4 unicast vrf <VRF>
VPNv6 路由show bgp vpnv6 unicast vrf <VRF>
6PE 标签show bgp ipv6 unicast labels
RTCshow bgp rtfilter unicast
Add-Path / PICshow ip cef vrf <VRF> <prefix> detail
VRF 与接口show ip vrf / show ip vrf interfaces / show ip vrf detail
VRF 路由表show ip route vrf <VRF> / show ipv6 route vrf <VRF>
VRF 连通性测试ping vrf <VRF> <ip> / traceroute vrf <VRF> <ip>
CEF(看标签栈)show ip cef vrf <VRF> <prefix> detail
Sham-Linkshow ip ospf sham-links
DMVPN 总览show dmvpn / show ip nhrp / show ipv6 nhrp brief
NHRP 直连缓存show ip nhrp shortcut
IPsecshow crypto ikev2 sa / show crypto ipsec sa
QoSshow policy-map interface <intf>
TEshow mpls traffic-eng tunnels brief
软清 BGP(不中断)clear bgp vpnv4 unicast <peer> soft [in|out]
强制刷新路由clear ip bgp * soft / clear ip route vrf <VRF> *

附录 B · 配置从哪里复制

设备所在章节说明
基础模板(15 台通用)2.4hostname / 关闭 DNS / line vty
P1 / P23.1 · 3.2完整配置
RR1 / RR23.2(基础)+ 4.3(BGP)两段拼起来即完整
PE13.3(骨干)+ 4.4(BGP)+ 5.1(VRF CORP-A)
+ 7.1(VRF BRANCH)
章节里已标注拼接位置
PE23.3 + 4.4 + 6.2(CORP-B)+ 7.1(BRANCH)同上
PE33.3 + 4.4 + 5.2(CORP-A 站点 2)
PE43.3 + 4.4 + 6.3(CORP-B 站点 2)+ 7.1(BRANCH)
CE-A1 / CE-A25.3完整配置
CE-B1 / CE-B26.4完整配置(含后门链路)
HUB / SPOKE1 / SPOKE27.2(IPsec)+ 7.3 / 7.4(隧道)IPsec 段三台相同
注意 内存不够?用这个裁剪方案 如果机器只能跑 8 台左右,按这个最小子集做,核心知识点一个不少
P1 · P2 · RR1 · PE1 · PE3 · CE-A1 · CE-A2(7 台)
保留:OSPF + LDP + MP-BGP + RR + VPNv4/VPNv6 + as-override。
砍掉:PE2/PE4(客户 B 与 DMVPN)、RR2(冗余)、CE-B(Sham-Link)、PE1-PE4 直连链路。
等机器升级了再按章节加回来 —— 地址规划是统一的,直接加节点即可,不用改现有配置。

附录 C · 批量下发配置脚本(Python)

如果你不想手工敲 15 台,可以用下面这个框架。把每台设备的配置存成 cfg/PE1.txt 这样的文件,脚本通过 Telnet 逐行下发。

bulk_push.py(需要 pip install telnetlib3 或用标准库改造)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
EVE-NG 批量下发 Cisco 配置
用法:python bulk_push.py cfg/PE1.txt 10.0.0.21
前提:EVE-NG 的 Management Cloud 已桥接到宿主机网段,设备可达且开启 telnet
"""
import sys, time, telnetlib

HOST_MAP = {
    "P1":       "10.0.0.11",
    "P2":       "10.0.0.12",
    "RR1":      "10.0.0.1",
    "RR2":      "10.0.0.2",
    "PE1":      "10.0.0.21",
    "PE2":      "10.0.0.22",
    "PE3":      "10.0.0.23",
    "PE4":      "10.0.0.24",
}
USER = ""          # EVE-NG 的 IOSv 默认无用户名密码
PASSWORD = ""
ENABLE = ""

def push(host, lines):
    tn = telnetlib.Telnet(host, 23, timeout=10)
    tn.read_until(b"Router>", timeout=10)
    tn.write(b"enable\n")
    tn.read_until(b"#", timeout=5)
    tn.write(b"configure terminal\n")
    tn.read_until(b"(config)#", timeout=5)
    for ln in lines:
        s = ln.rstrip("\n")
        if not s.strip() or s.strip().startswith("!"):
            continue                      # 跳过空行与注释
        tn.write(s.encode("ascii") + b"\n")
        time.sleep(0.05)
    tn.write(b"end\n")
    tn.write(b"write memory\n")
    time.sleep(1)
    tn.write(b"exit\n")
    print(f"[OK] {host} 推送完成")

if __name__ == "__main__":
    name = sys.argv[1]                    # 例如 PE1
    host = HOST_MAP[name]
    with open(f"cfg/{name}.txt", encoding="utf-8") as f:
        push(host, f.readlines())

附录 D · 常见问题 FAQ

Q1:RR 上要不要启用 MPLS / LDP?

不要。RR 只做路由分发,不在转发路径上。PE 学到的 VPNv4 路由下一跳是对端 PE 的 loopback,数据包沿 LDP 隧道直达对端 PE,压根不经过 RR。
唯一例外:如果 RR 同时又是一台 P 路由器(现网常见"RR 合设"),那它作为 P 当然要跑 LDP —— 但那是因为它是 P,不是因为它是 RR。

Q2:VPNv4 路由学到了,但 CE 之间 ping 不通,最可能是什么?

按概率排序:
LDP 没通 —— 有路由没标签,数据包被丢弃(MPLS 黑洞)。用 ping mpls ipv4 <对端PE>/32 一测便知。
RR 上加了 next-hop-self —— 下一跳被改成 RR,而 RR 不在转发路径 → 黑洞。
RT 不匹配 —— 路由压根没进对端 VRF。
MTU —— 小包通大包不通。

Q3:为什么我配了 IPv6 但完全不通?

99% 是忘了 ipv6 unicast-routing。这条命令不开,设备收到 IPv6 包直接丢弃,show ipv6 route 也是空的。
其次常见的是 OSPFv3 没有 router-id(IPv4 loopback 存在时会自动选,但显式配置更稳)。

Q4:as-override 和 allowas-in 能同时配吗?

不建议。两者解决的都是"多站点同 AS",同时配会掩盖问题,将来排错时分不清到底是哪条规则放行的。约定俗成:运营商侧用 as-override,客户侧用 allowas-in,二选一。

Q5:Sham-Link 必须配吗?

只有同时满足以下两点才必须配:
① PE-CE 用 OSPF(不是 BGP);
② 同一 VPN 的两个站点之间存在后门链路
如果用的是 eBGP 做 PE-CE(像客户 A),或者根本没有后门链路,就不需要。现实中"总部和分部之间拉了条 IPsec VPN 做备份"非常常见,所以 Sham-Link 是必考题。

Q6:DMVPN 的 tunnel source 能用物理接口吗?

可以,但强烈建议用 loopback。原因:
① 物理接口 down 了隧道就断,loopback 只要还有一条路可达就不断(更稳);
② 多上行(MPLS + Internet)时,loopback 可以让两条 underlay 复用同一个 NBMA 地址,实现 Dual Cloud DMVPN。
代价是必须在 underlay 里通告这个 /32(本实验通过 VRF UNDERLAY 的 eBGP 发布)。

Q7:EVE-NG 里设备 CPU 一直 100% 怎么办?

① 设置 idle-pc(第 2.4 节),这是最有效的手段;
② 减少同时启动的节点数,分批启动;
③ 关掉不必要的服务:no ip http serverno cdp runno service tcp-small-servers
④ 关闭日志刷屏:no logging console
⑤ 确认宿主机 BIOS 里开启了虚拟化支持(VT-x / AMD-V),并在 VMware/VirtualBox 里勾选"虚拟化 Intel VT-x"。

Q8:配置存了,下次打开 EVE-NG 又没了?

三个检查点:
① 每台设备上执行了 write memory(或 copy running-config startup-config);
② EVE-NG 关闭 lab 前不要直接断电,用 Stop All NodesClose Lab
③ 有的镜像需要确认 nvram 可写。最保险的做法是定期 More actions → Export all CFGs 导出 zip 备份。