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 与故障演练。
第 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 全网拓扑
1.3 三个必须理解的设计决策
关键点是:RR 只处理路由,不转发数据包。PE 从 RR 学到的 VPNv4 路由,下一跳仍然是原来那台 PE 的 loopback(所以 RR 上【绝对不要】配
next-hop-self),数据包走 LDP 隧道直达那台 PE,根本不经过 RR。这就是为什么 RR 可以挂在 P 路由器旁边、只给它 1 条上行链路。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 的区别。
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-BGP | RR、RTC、Add-Path、GR |
| P1 / P2 | 核心 P(纯转发) | 10.0.0.11 / fd00::11 10.0.0.12 / fd00::12 | OSPF、LDP | LDP、IGP-LDP 同步、TE |
| PE1 | 边缘 PE | 10.0.0.21 / fd00::21 | OSPF、LDP、MP-BGP | VRF CORP-A、BRANCH、SoO、AS-Override |
| PE2 | 边缘 PE | 10.0.0.22 / fd00::22 | 同上 | VRF CORP-B(OSPF PE-CE)、Sham-Link |
| PE3 | 边缘 PE | 10.0.0.23 / fd00::23 | 同上 | VRF CORP-A 站点 2、BGP PIC |
| PE4 | 边缘 PE | 10.0.0.24 / fd00::24 | 同上 | VRF CORP-B、BRANCH Hub 侧、6PE |
| CE-A1 / CE-A2 | 客户 A 站点(AS 65001) | 192.168.255.1 / .2 | eBGP 双栈 | 同 AS 多站点、allowas-in 对比 |
| CE-B1 / CE-B2 | 客户 B 站点(AS 65002) | 172.20.255.1 / .2 | OSPFv2/OSPFv3 | 后门链路、Sham-Link、DN 位 |
| HUB / SPOKE1 / SPOKE2 | 客户 C(AS 65003) | 172.16.100.1/.11/.12 | mGRE、NHRP、IPsec、EIGRP | DMVPN Phase 3、双栈、加密 |
1.5 地址规划总表
地址规划看起来枯燥,但它是整个实验能不能一次跑通的分水岭。建议严格照抄,跑通之后再改成你自己的。
① 骨干链路(10.0.L.0/30 + fd00:L::/64)
| 链路号 | 本端 | 接口 | 对端 | 接口 | IPv4 | IPv6 |
|---|---|---|---|---|---|---|
| L1 | PE1 | Gi0/0 | P1 | Gi0/0 | 10.0.1.0/30 | fd00:1::/64 |
| L2 | PE2 | Gi0/0 | P1 | Gi0/1 | 10.0.2.0/30 | fd00:2::/64 |
| L3 | PE3 | Gi0/0 | P2 | Gi0/0 | 10.0.3.0/30 | fd00:3::/64 |
| L4 | PE4 | Gi0/0 | P2 | Gi0/1 | 10.0.4.0/30 | fd00:4::/64 |
| L5 | P1 | Gi0/2 | P2 | Gi0/2 | 10.0.5.0/30 | fd00:5::/64 |
| L6 | RR1 | Gi0/0 | P1 | Gi0/3 | 10.0.6.0/30 | fd00:6::/64 |
| L7 | RR2 | Gi0/0 | P2 | Gi0/3 | 10.0.7.0/30 | fd00:7::/64 |
| L8 | PE1 | Gi0/1 | PE4 | Gi0/1 | 10.0.8.0/30 | fd00:8::/64 |
| L9 | RR1 | Gi0/1 | RR2 | Gi0/1 | 10.0.9.0/30 | fd00:9::/64 |
规律:网段第 3 字节 = 链路号;.1 = 表格里"本端",.2 = "对端"。IPv6 的 ::1 / ::2 同理。
② PE-CE 链路(10.1.X.0/30 + 2001:db8:1:X::/64)
| 本端(PE) | 接口 | 对端(CE) | IPv4 | IPv6 | VRF |
|---|---|---|---|---|---|
| PE1 | Gi0/2 | CE-A1 Gi0/0 | 10.1.1.0/30 | 2001:db8:1:1::/64 | CORP-A |
| PE2 | Gi0/1 | CE-B1 Gi0/0 | 10.1.2.0/30 | 2001:db8:1:2::/64 | CORP-B |
| PE3 | Gi0/1 | CE-A2 Gi0/0 | 10.1.3.0/30 | 2001:db8:1:3::/64 | CORP-A |
| PE4 | Gi0/2 | CE-B2 Gi0/0 | 10.1.4.0/30 | 2001:db8:1:4::/64 | CORP-B |
| PE1 | Gi0/3 | SPOKE1 Gi0/0 | 10.1.11.0/30 | 2001:db8:1:11::/64 | BRANCH |
| PE2 | Gi0/2 | SPOKE2 Gi0/0 | 10.1.12.0/30 | 2001:db8:1:12::/64 | BRANCH |
| PE4 | Gi0/3 | HUB Gi0/0 | 10.1.14.0/30 | 2001:db8:1:14::/64 | BRANCH |
规律:PE 侧永远是 .1,CE 侧永远是 .2。
③ VRF / RD / RT 规划
| VRF 名称 | 客户 | RD | RT(import/export) | PE-CE 协议 | 说明 |
|---|---|---|---|---|---|
| CORP-A | 客户 A | 65000:100 | 65000:100 | eBGP 双栈 | 同 AS 两站点 → as-override |
| CORP-B | 客户 B | 65000:200 | 65000:200 | OSPFv2 + OSPFv3 | 有后门链路 → Sham-Link |
| BRANCH | 客户 C | 65000:300 | 65000:300 | eBGP(underlay) | DMVPN 的底层承载网 |
④ 客户业务地址
| 站点 | 设备 | IPv4 LAN | IPv6 LAN | 用途 |
|---|---|---|---|---|
| A 站点1 | CE-A1 Lo10 | 192.168.11.0/24 | 2001:db8:a:11::/64 | 客户 A 业务 |
| A 站点2 | CE-A2 Lo10 | 192.168.12.0/24 | 2001:db8:a:12::/64 | 客户 A 业务 |
| B 站点1 | CE-B1 Lo10 | 172.20.11.0/24 | 2001:db8:b:11::/64 | 客户 B 业务 |
| B 站点2 | CE-B2 Lo10 | 172.20.12.0/24 | 2001:db8:b:12::/64 | 客户 B 业务 |
| B 后门 | CE-B1↔CE-B2 | 172.20.99.0/24 | 2001:db8:b:99::/64 | Sham-Link 实验 |
| C 总部 LAN | HUB Lo10 | 192.168.20.0/24 | 2001:db8:c:20::/64 | DMVPN 总部 |
| C 分支1 LAN | SPOKE1 Lo10 | 192.168.21.0/24 | 2001:db8:c:21::/64 | DMVPN 分支 |
| C 分支2 LAN | SPOKE2 Lo10 | 192.168.22.0/24 | 2001:db8:c:22::/64 | DMVPN 分支 |
| C Underlay | Lo100(VRF UNDERLAY) | 172.16.100.0/24 | 2001:db8:100:ffff::/64 | NBMA / 隧道源 |
| C Overlay | Tunnel0 | 10.100.0.0/24 | 2001:db8:100::/64 | GRE 隧道内层 |
1.6 阶段路线图
| 阶段 | 内容 | 产出 | 预计 |
|---|---|---|---|
| ① | EVE-NG 工程搭建、镜像与基础优化 | 15 台设备可 Telnet、可保存 | 40 min |
| ② | 骨干 IGP:OSPFv2 + OSPFv3 双栈 | 所有 Loopback 互通 | 30 min |
| ③ | LDP 标签分发 + 6PE 标签 BGP | IPv4/IPv6 LSP 打通 | 30 min |
| ④ | MP-BGP + 双 RR + RTC | VPNv4/VPNv6 会话 Established | 45 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、QoS | 60 min |
| ⑨ | 全网验证 + 8 个故障演练 | 端到端验收通过 | 50 min |
| ⑩ | 扩展:Inter-AS / EVPN / SR 迁移 | 知道下一步学什么 | 20 min |
第 2 章 · EVE-NG 环境搭建
2.1 镜像怎么选
| 镜像 | EVE-NG 模板名 | 内存/台 | MPLS | 6VPE | DMVPN | 评价 |
|---|---|---|---|---|---|---|
| Cisco IOSv vios-adventerprisek9-m | Cisco IOSv | 384–512 MB | ✅ | ✅ | ✅ | 首选 轻、启动快、功能够 |
| CSR1000v csr1000v-universalk9 | Cisco CSR1000v | 3–4 GB | ✅ | ✅ | ✅ | 功能最新,但太吃内存,建议只给 DMVPN 三台用 |
| Cisco IOL | Cisco IOL | 128–256 MB | ✅ | 部分 | 部分 | 省资源神器,但特性不全,DMVPN IPv6 可能缺命令 |
| Cisco IOS-XRv | Cisco XRv | 3 GB | ✅ | ✅ | ✅ | 想练运营商真机命令可选,本手册以 IOS 语法为主 |
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 GB | 8 核 + 开嵌套虚拟化 | 120 GB SSD | 15 台全开,流畅 |
| 够用 | 16 GB | 4 核 | 80 GB SSD | 15 台全开(IOSv 设 384 MB),略卡 |
| 将就 | 8 GB | 4 核 | 60 GB | 只跑核心 8 台 + 客户 A(第 9.1 节有裁剪方案) |
EVE-NG 节点内存修改:右键节点 → Edit → Memory 改成 384 或 512;CPUs 保持 1;Idle-PC 见 2.4 节。
2.3 建工程与连线
- 新建 Lab:EVE-NG 主界面 →
Add new lab→ 名称MPLS-VPN-LAB,Version 保持默认。 - 拖节点:左侧
Add an object→Node→ 模板选Cisco IOSv→ 数量15→ Save。然后逐个右键Edit改 Hostname 和 Icon。 - 连线:点工具栏插头图标,按 1.5 节的链路表逐条连接(先连骨干 L1–L9,再连 PE-CE)。连完可以点
More actions → Show/Hide interface names核对。 - 启动:先只启动
P1 P2 RR1 RR2,等 2 分钟 CPU 降下来;再启动PE1–PE4;最后启动所有 CE。不要 15 台同时 Start,否则 IOSv 的 crypto key 生成会拖死 CPU,出现大量%SYS-3-CPUHOG甚至误判崩溃。
| 完整连线对照表(照着连,一格不差) | |||||
|---|---|---|---|---|---|
| 本端设备 | 本端接口 | 对端设备 | 对端接口 | 网段 | 备注 |
| PE1 | Gi0/0 | P1 | Gi0/0 | 10.0.1.0/30 | 骨干 |
| PE1 | Gi0/1 | PE4 | Gi0/1 | 10.0.8.0/30 | 冗余 / TE |
| PE1 | Gi0/2 | CE-A1 | Gi0/0 | 10.1.1.0/30 | CORP-A |
| PE1 | Gi0/3 | SPOKE1 | Gi0/0 | 10.1.11.0/30 | BRANCH |
| PE2 | Gi0/0 | P1 | Gi0/1 | 10.0.2.0/30 | 骨干 |
| PE2 | Gi0/1 | CE-B1 | Gi0/0 | 10.1.2.0/30 | CORP-B |
| PE2 | Gi0/2 | SPOKE2 | Gi0/0 | 10.1.12.0/30 | BRANCH |
| PE3 | Gi0/0 | P2 | Gi0/0 | 10.0.3.0/30 | 骨干 |
| PE3 | Gi0/1 | CE-A2 | Gi0/0 | 10.1.3.0/30 | CORP-A |
| PE4 | Gi0/0 | P2 | Gi0/1 | 10.0.4.0/30 | 骨干 |
| PE4 | Gi0/2 | CE-B2 | Gi0/0 | 10.1.4.0/30 | CORP-B |
| PE4 | Gi0/3 | HUB | Gi0/0 | 10.1.14.0/30 | BRANCH |
| P1 | Gi0/2 | P2 | Gi0/2 | 10.0.5.0/30 | 核心横联 |
| P1 | Gi0/3 | RR1 | Gi0/0 | 10.0.6.0/30 | RR 接入 |
| P2 | Gi0/3 | RR2 | Gi0/0 | 10.0.7.0/30 | RR 接入 |
| RR1 | Gi0/1 | RR2 | Gi0/1 | 10.0.9.0/30 | RR 互联 |
| CE-B1 | Gi0/1 | CE-B2 | Gi0/1 | 172.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-routing 和 ip 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↔P1 | MPLS 标签头(0x8847)、双层标签栈、LDP Hello | 第 3 章建完 LDP |
| PE1↔CE-A1 | 纯 IP 报文,没有 MPLS 标签 | 第 5 章通业务后对比看 |
| RR1↔P1 | BGP Update 携带 VPNv4 NLRI + Extended Community | 第 4 章建完 MP-BGP |
| SPOKE1↔SPOKE2 路径 | GRE 外层是 underlay IP,内层是 overlay IP / IPv6 | 第 7 章 DMVPN Phase 3 |
第 3 章 · 骨干基础:IGP 与 LDP
① 控制平面: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 —— 核心 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 memorysession 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 的骨干部分
结构完全对称,只需按地址表替换。下面给出可以直接粘的完整片段。
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 memoryconfigure 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 memoryconfigure 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 memory3.3 PE 路由器的骨干部分
PE 比 P 多了三样东西:VRF、面向 CE 的接口、MP-BGP。这一节只做骨干接口(VRF 和 BGP 放第 4、5 章)。四台 PE 结构一致,下面以 PE1 为例,其余三台给出差异表。
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 改地址即可) |
|---|---|
| PE2 | Lo0 10.0.0.22 / fd00::22 Gi0/0 = 10.0.2.1/30 · fd00:2::1/64 → P1 Gi0/1 |
| PE3 | Lo0 10.0.0.23 / fd00::23 Gi0/0 = 10.0.3.1/30 · fd00:3::1/64 → P2 Gi0/0 |
| PE4 | Lo0 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:传递的是公网 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 专网"。
在每台 PE 上追加(RR 上也要配套,见第 4 章):
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 memorysend-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.21 | PE1 → PE4 通(!!!!) |
| ping fd00::24 source fd00::21 | IPv6 通 |
| traceroute 10.0.0.24 source 10.0.0.21 | 中间跳数 = 2(PE1 → P1 → P2 → PE4) |
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.210.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 一端是 broadcast | show 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-id | show ipv6 ospf |
配了 mpls ldp sync 后 OSPF 半天不 FULL | 正常现象!LDP 没就绪时 OSPF 会等 | show mpls ldp igp sync |
第 4 章 · MP-BGP 与路由反射器
vpnv4(客户的 IPv4)、vpnv6(客户的 IPv6)、ipv6 unicast(IPv6 公网,配 send-label 就是 6PE)、rtfilter(RT 约束,RFC 4684)等等。好处是:你只需要维护 1 条 iBGP 会话 + N 个地址族,而不是为每种协议建一套邻居。
4.1 本实验启用的地址族一览
| 地址族 | 作用 | 谁需要 | 关键命令 |
|---|---|---|---|
| ipv4 unicast | 公网 IPv4(本实验基本为空,只为保持会话结构完整) | PE + RR | activate |
| vpnv4 unicast | 核心:传递客户 IPv4 VPN 路由 | PE + RR | send-community extended |
| vpnv6 unicast | 核心:传递客户 IPv6 VPN 路由(6VPE) | PE + RR | send-community extended |
| ipv6 unicast | 6PE:IPv6 公网路由 + 标签 | PE + RR | send-label |
| rtfilter unicast | RTC:PE 告诉 RR"我只要哪些 RT" | PE + RR | default-originate(RR 侧) |
| ipv4 vrf CORP-A … | PE-CE 的 eBGP(每 VRF 一个) | 仅 PE | as-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 的路由
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 配置
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 memoryconfigure 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 memorytemplate peer-session + template peer-policy,配置更灵活、修改时不需要重建会话。第 8.4 节给了 template 版本,跑通之后建议切换过去练一遍。4.4 PE 侧的 MP-BGP 骨架
四台 PE 的这一段完全一致(除 router-id)。先配这个,第 5、6 章再往里加 VRF。
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| 设备 | 差异点 |
|---|---|
| PE2 | router-id 10.0.0.22;6PE 发布 fd00::22/128 |
| PE3 | router-id 10.0.0.23;6PE 发布 fd00::23/128 |
| PE4 | router-id 10.0.0.24;6PE 发布 fd00::24/128 |
4.5 RTC(Route Target Constraint)到底省了什么
有了 RTC,PE 会先发一条"订阅消息"(
rtfilter NLRI):"我只对 RT 65000:100 和 65000:300 感兴趣"。RR 收到后直接不发其他 RT 的路由。判断 RTC 有没有生效,就看 PE 上
show bgp vpnv4 all 有没有别的客户的路由——没有就对了。! 在 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:3004.6 阶段验证
| 命令(在 RR1 / PE1 上执行) | 预期结果 |
|---|---|
| show bgp all summary | vpnv4 / vpnv6 / ipv6 / rtfilter 各地址族下 PE 邻居都是 Established(数字不为 0) |
| show bgp vpnv4 unicast all summary | RR1 上看到 4 个 PE 邻居,状态 Established |
| show bgp rtfilter unicast | 能看到 RTC 的 NLRI |
| show bgp ipv6 unicast labels | 6PE 生效:fd00::2x/128 都有 in/out label |
| show bgp vpnv4 all neighbors 10.0.0.1 | 看 Next hop is not changed、Extended Community 能力协商成功 |
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 1show 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 双栈接入
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
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 memoryvrf forwarding CORP-A,IOS 会提示 % Interface IP address removed 并把地址清空。正确顺序:先
vrf forwarding → 再 ip address / ipv6 address。如果想避免这个坑,用新版写法
vrf forwarding CORP-A ipv4(IOS 15.x+ 支持),有些版本可以保留地址。改用 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
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 memory5.3 CE-A1 / CE-A2 配置
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 memoryconfigure 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 memory192.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 interfaces | Gi0/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-A | 有 B 标志的 192.168.12.0/24 |
| show ipv6 route vrf CORP-A | 有 B 标志的 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::1 | IPv6 也通 |
| traceroute 192.168.12.1 source lo10 | 第 1 跳 10.1.1.1,第 2 跳 = 对端 PE 的 PE-CE 地址,看不到骨干 IP(被 MPLS 隐藏) |
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 24nexthop 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):
! 分支(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
① 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 后门链路带来的麻烦
· 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)
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 memory6.3 PE4 配置(站点 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% 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 配置(含后门链路)
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 memoryconfigure 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 memoryshutdown),把 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 起不来,这里会走后门,属正常) |
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 16.6 故障演练:后门接管
- 在 CE-B1 上执行
interface Gi0/0 / shutdown(模拟 MPLS 接入中断) - 看
show ip route 172.20.12.0—— 路由应该自动切换到 172.20.99.2(后门),类型仍是O,cost 变成 1001 ping 172.20.12.1 source lo10仍然通(业务没断)- 恢复
no shutdown,等 OSPF 收敛,路由应切回 10.1.2.1
这就是企业买 MPLS 还留一条廉价备份线的原因——花钱买的是"主用路径可控",而不是"唯一路径"。
第 7 章 · DMVPN:MPLS 之上的加密叠加网
② 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 加密叠加"的真实架构。7.1 PE 侧:VRF BRANCH 与 underlay eBGP
先让三台 DMVPN 路由器的 172.16.100.x/32 在 MPLS VPN 里互相可达。
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| 设备 | 接口 / 地址 |
|---|---|
| PE2 | Gi0/2 = 10.1.12.1/30 · 2001:db8:1:12::1/64 → SPOKE2(其余同上,neighbor 10.1.12.2) |
| PE4 | Gi0/3 = 10.1.14.1/30 · 2001:db8:1:14::1/64 → HUB(neighbor 10.1.14.2) |
·
as-override(运营商侧配置):PE 把客户 AS 号替换成自己的 AS。客户什么都不用改,适合运营商托管模式。·
allowas-in 1(客户侧配置):CE 允许 AS_PATH 里出现自己的 AS 最多 1 次。适合客户自己管设备、运营商不给改配置的场景。真实项目里两者只用其一,同时配会掩盖问题、调试困难。
7.2 IPsec / IKEv2(三台完全一致)
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 memorymode transport 用于 GRE over IPsec(GRE 已经加了外层 IP 头,不需要再加一个)。如果写成 mode tunnel 会多 20 字节开销,容易触发分片。② 预共享密钥里如果有
@ 等特殊字符,IOS 可能报错。出问题就换成纯字母数字。③ IOSv 的
esp-sha256-hmac 可能需要较高版本;不支持就退回 esp-sha-hmac。7.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 memory7.4 SPOKE1 配置
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 |
| 业务 LAN | 192.168.22.1/24 · 2001:db8:c:22::1/64 |
| eBGP 邻居 | neighbor 10.1.12.1 remote-as 65000 |
7.5 DMVPN 验证
| 命令 | 预期结果 |
|---|---|
| show ip nhrp | Hub 上能看到 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 neighbors | Hub 上有 2 个邻居(Tunnel0) |
| show dmvpn | 总览:Type: Hub / Spoke,State: UP,Int: Tun0 |
| ping 192.168.22.1 source lo10 | SPOKE1 → 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# 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: 255traceroute 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 没配(组播发不出去)② 地址族被 shutdown | show 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 隧道 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 1 | DMVPN underlay(已配) |
| SoO | 多宿主站点路由被"绕一圈又回来" | PE:neighbor Y soo 65000:101 | 客户 A(已配) |
| local-as | 客户被并购、AS 号要临时换,又不能改 CE | neighbor 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 Restart | BGP 进程重启 / 主备倒换时转发不断 | bgp graceful-restart | 已配 |
| Add-Path | 同一个前缀通告多条路径,供快速切换 | bgp additional-paths select/ send/receive/install | 已配 |
| BGP PIC | 故障时不等 BGP 重新收敛,直接切备份路径(<50ms) | bgp recursion host + additional-paths install | 已配 |
| Best External | iBGP 与 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:把收敛时间从秒级压到毫秒级
192.168.12.0/24 有两条路(经 PE3 和经 PE4),但按规则只把最优的一条发给 PE。等最优路径断了,PE 才发现"我没有备份",然后等 RR 重新发一条更新 —— 这中间是秒级的中断。Add-Path 让 RR 把两条都发过来(用 Path ID 区分);PIC 让 PE 把备份路径预先写进 CEF 转发表。故障发生时,硬件直接切换到已装好的备份下一跳,不需要等 BGP 重新计算 —— 中断时间降到 50ms 以内,和 IGP 收敛一个量级。
! 在 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 PIC8.3 从 peer-group 升级到 peer-template
peer-group 的缺点是改一个参数会重建组里所有会话。peer-template 把"会话参数"(transport、timer、password)和"策略参数"(route-map、send-community)分开,继承关系更灵活。
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-policy8.4 MPLS TE:给流量指定一条"专用车道"
MPLS TE 用 RSVP-TE 建立一条显式路径的隧道(可以手工指定经过哪些路由器),然后把流量"引"进这条隧道(
autoroute announce 或 static route),还能预留带宽。本实验用 PE1↔PE4 的直连链路(L8)做演示:默认流量走 PE1→P1→P2→PE4,我们用 TE 隧道强制走 PE1→PE4 直连。
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 memoryPE1# 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:12mpls traffic-eng、ip rsvp bandwidth 支持不全(可能报 % Invalid input)。遇到就跳过,理解原理即可 —— 真机上这些命令是标准的。要完整练 TE,建议用 CSR1000v(IOS-XE 16.9+) 或 IOS-XRv。
8.5 QoS over MPLS:让 EXP 位在骨干里被尊重
两件事必须做:
① 标记:在 PE 入方向把 DSCP 映射到 MPLS EXP(标签里的 3 位 CoS),P 路由器据此调度;
② qos pre-classify:如果流量是从隧道/加密接口进来的,PE 看到的已经是封装后的包,原始 DSCP 在最内层。加
qos pre-classify 让设备"先看一眼原始包"再做分类。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 memoryPE1# 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 == 58.6 LDP 与 MPLS 的加固项
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 memorymtu 会导致接口 flapping(OSPF 邻居重建)。建议一开始搭建时就配好,不要在业务运行中改。另外:EVE-NG 里所有设备的 MTU 必须端到端一致,只改一台反而会造成 OSPF 卡在 EXSTART。
8.7 MPLS OAM:像 ping IP 一样 ping 标签隧道
这是排错利器。当"Ping 不通"时,先用 OAM 确认 LSP 本身有没有问题,再往上查 BGP。
! ① 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 v4 | P1# show ip route ospf | i /32 | 8 条 /32 |
| 2 | 骨干 IGP v6 | P1# show ipv6 route ospf | i /128 | 8 条 /128 |
| 3 | LDP | P1# show mpls ldp neighbor | i Oper | ≥3 个 Operational |
| 4 | LSP 连通 | PE1# ping mpls ipv4 10.0.0.24/32 | !!!!! |
| 5 | 6PE 标签 | PE1# show bgp ipv6 unicast labels | fd00::2x 都有 label |
| 6 | MP-BGP 会话 | RR1# show bgp all summary | 5 个 AF 全 Established |
| 7 | 客户 A v4 | CE-A1# ping 192.168.12.1 source lo10 | !!!!! |
| 8 | 客户 A v6 | CE-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 v4 | CE-B1# ping 172.20.12.1 source lo10 | !!!!!(走 MPLS) |
| 11 | 客户 B v6 | CE-B1# ping 2001:db8:b:12::1 source lo10 | !!!!! |
| 12 | Sham-Link | PE2# show ip ospf sham-links | 状态 UP |
| 13 | DMVPN underlay | SPOKE1# ping vrf UNDERLAY 172.16.100.12 source lo100 | !!!!! |
| 14 | DMVPN overlay v4 | SPOKE1# ping 192.168.22.1 source lo10 | !!!!! |
| 15 | DMVPN overlay v6 | SPOKE1# ping 2001:db8:c:22::1 source lo10 | !!!!! |
| 16 | IPsec 加密 | SPOKE1# show crypto ipsec sa | i pkts | 计数持续增长 |
| 17 | Phase 3 直连 | SPOKE1# traceroute 192.168.22.1 source lo10(跑两次) | 第 2 次只有 1 跳 |
| 18 | VPN 隔离 | CE-A1# ping 172.20.11.1 source lo10 | 不通(这是对的!) |
| 19 | RR 冗余 | shutdown RR1 后重跑 #7 | 仍然通 |
| 20 | 配置保存 | 每台 write memory + EVE-NG Export all CFGs | 拿到 lab-final.zip |
如果需要互通,必须走"公共 VRF / 防火墙 / NAT"这类受控出口(Extranet VPN),那是另一个主题。
9.2 故障演练:8 个场景
每个场景都按 注入 → 观察 → 分析 → 恢复 四步做。务必先备份配置(Export all CFGs)。
场景 1:骨干链路中断(PE1 ↔ P1)
- 注入:
PE1(config)# interface Gi0/0 / shutdown - 观察:
show ip ospf neighbor掉一个;show mpls forwarding-table里到 PE3/PE4 的下一跳变成 Gi0/1(走 PE1-PE4 直连) - 分析:IGP 重算 → LDP 重建标签 → BGP 下一跳可达性重新解析。客户业务可能中断几秒(取决于 BFD 是否启用)。启用 BFD 后应 < 1s。
- 恢复:
no shutdown,确认路由回到原路径
场景 2:单台 RR 宕机
- 注入:EVE-NG 里
StopRR1(或直接RR1# reload) - 观察:
PE1# show bgp vpnv4 all summary只剩 10.0.0.2 一个邻居;但业务 ping 完全不受影响 - 分析:这就是双 RR 的价值 —— 控制平面有冗余,转发平面本来就不经过 RR。
如果配了bgp graceful-restart,RR 重启期间 PE 会保留"stale path",连路由抖动都不会有。 - 恢复:启动 RR1,等会话重建
场景 3:LDP 断了但 IGP 还在(最经典的"黑洞")
- 注入:
P1(config)# interface Gi0/2 / no mpls ip(去掉核心横联的 LDP,但 OSPF 还在) - 观察:
ping 10.0.0.24依然通(IGP 通),但CE-A1# ping 192.168.12.1不通!
PE1# show ip cef vrf CORP-A 192.168.12.0会发现标签没解析出来 - 分析:这是 MPLS 黑洞 —— 控制平面说"可达",数据平面没有标签,包被丢弃。
预防手段就是mpls ldp igp sync:让 OSPF 在 LDP 没就绪前不通告这条链路,从源头避免黑洞。装上之后再试一次,OSPF 会自动避开 Gi0/2。 - 恢复:加回
mpls ip
场景 4:RT 配错
- 注入:
PE3(config-vrf-af)# no route-target export 65000:100PE3(config-vrf-af)# route-target export 65000:999 - 观察:
PE1# show bgp vpnv4 unicast vrf CORP-A里 192.168.12.0/24 消失;但PE3# show bgp vpnv4 all里还在(本地有) - 分析:路由发出去了,但对端 import RT 匹配不上 → 不进 VRF。
定位口诀:① 本地有 Remote 没有 → 查 export RT;② Remote 收到但不进表 → 查 import RT;③ 根本没收到 → 查 RTC / 会话。 - 恢复:改回 65000:100,
clear bgp vpnv4 unicast 10.0.0.1 soft加速
场景 5:去掉 as-override
- 注入:
PE1(config-router-af)# no neighbor 10.1.1.2 as-override - 观察:CE-A1 上学不到 192.168.12.0/24;
debug bgp updates能看到DENIED due to: AS-PATH contains our own AS - 恢复:加回 as-override,或在 CE-A1 上加
neighbor 10.1.1.1 allowas-in 1对比效果
场景 6:Sham-Link 未配时启用后门链路
- 注入:
PE2(config-router)# no area 0 sham-link ...;CE-B1/CE-B2 的 Gi0/1no shutdown - 观察:
CE-B1# show ip route 172.20.12.0→ 下一跳 172.20.99.2,类型是O(区域内) - 分析:OSPF 区域内路由永远优先,客户流量绕过 MPLS 走后门(通常后门是低带宽的廉价线路,会拥塞)
- 恢复:加回 Sham-Link,路由改走 MPLS
场景 7:DMVPN underlay 中断
- 注入:
PE1(config)# interface Gi0/3 / shutdown(SPOKE1 的 MPLS 接入断了) - 观察:
show ip nhrp条目老化消失;show crypto ikev2 sa会话 down;show ip route 192.168.22.0路由消失 - 分析:underlay 一断,NHRP 无法维持注册,隧道随之 down。这正是"MPLS 打底"的风险 —— 底层单点。
真实项目里分支通常有 双上行(MPLS + Internet VPN),DMVPN 可以在两条 underlay 上各建一套隧道(Dual Cloud DMVPN)。 - 恢复:
no shutdown,看 NHRP 重新注册(约 30-60 秒)
场景 8:MTU / 分片导致的"能 ping 通但打不开网页"
- 注入:把 Tunnel0 的
ip mtu改回 1500(no ip mtu 1400),并去掉ip tcp adjust-mss - 观察:小包 ping 通,但大包
ping 192.168.22.1 size 1500 df-bit不通 - 分析:MPLS(8B) + GRE(24B) + IPsec(~52B) ≈ 84B 开销,1500 的包封装后超 MTU,DF 位又不允许分片 → 被丢。
TCP 更惨:握手能过,一传数据就卡死(典型"网页打不开但 QQ 能上")。 - 恢复:
ip mtu 1400+ip tcp adjust-mss 1360
9.3 MPLS VPN 排错决策树
客户 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 上不需要 VRF | ASBR 要保存全部 VPN 路由,压力大;需要互相信任 RT 规划 | 主流做法,中大型运营商间对接 |
| Option C (多跳 eBGP 分发标签) | 两个 AS 的 RR 之间直接建多跳 eBGP 传 VPN 路由;ASBR 之间只用 eBGP 交换各自 PE 的 loopback + 标签(send-label) | ASBR 不存 VPN 路由,扩展性最好,端到端一条 LSP | 最复杂,跨域排错困难;需要标签连续 | 超大运营商、跨国骨干 |
!---------- 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-family10.2 EVPN:MPLS VPN 的现代继任者
l2vpn evpn 地址族统一承载二层(VPWS/E-LAN)和三层(EVPN IRB)业务,控制平面学习 MAC/IP,不再依赖数据平面泛洪。核心优势:
· All-Active 多归属:CE 双上行到两台 PE,两条链路同时转发(传统 VPLS 只能主备);
· Aliasing + 快速收敛:一条链路故障,流量瞬间切到另一条;
· ARP/ND 抑制:PE 本地代答,把广播风暴挡在骨干之外;
· 一套控制平面搞定 L2 + L3:运维复杂度大幅下降。
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:10010.3 向 Segment Routing 迁移
SR 是 MPLS 的"简化版":砍掉 LDP 和 RSVP-TE 两个协议,标签由 IGP(OSPF/IS-IS)或 BGP 直接分发,源路由(一条有序的标签列表)写在包头里。
| 对比项 | 传统 MPLS(本实验) | SR-MPLS | SRv6 |
|---|---|---|---|
| 标签分发协议 | LDP / RSVP-TE | IGP(SRGB)+ BGP | IPv6 扩展头(SID) |
| 需要维护的协议数 | 3(IGP + LDP + BGP) | 2(IGP + BGP) | 2(IGP + BGP) |
| 状态 | 每台 LSR 维护每条 LSP 状态 | 只在入口维护,中间无状态 | 同左 |
| TE 能力 | RSVP-TE,复杂 | SR-TE,天然支持 | 最强(网络编程) |
| 数据平面 | MPLS | MPLS | 纯 IPv6,无需 MPLS |
| 本实验迁移成本 | — | 改 IGP + 去掉 LDP,BGP 层几乎不动 | 需 IPv6 骨干,改动大 |
! 传统 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,练分层 RR 与 Confederation
· 用 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 |
| RTC | show bgp rtfilter unicast |
| Add-Path / PIC | show 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-Link | show ip ospf sham-links |
| DMVPN 总览 | show dmvpn / show ip nhrp / show ipv6 nhrp brief |
| NHRP 直连缓存 | show ip nhrp shortcut |
| IPsec | show crypto ikev2 sa / show crypto ipsec sa |
| QoS | show policy-map interface <intf> |
| TE | show 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.4 | hostname / 关闭 DNS / line vty |
| P1 / P2 | 3.1 · 3.2 | 完整配置 |
| RR1 / RR2 | 3.2(基础)+ 4.3(BGP) | 两段拼起来即完整 |
| PE1 | 3.3(骨干)+ 4.4(BGP)+ 5.1(VRF CORP-A) + 7.1(VRF BRANCH) | 章节里已标注拼接位置 |
| PE2 | 3.3 + 4.4 + 6.2(CORP-B)+ 7.1(BRANCH) | 同上 |
| PE3 | 3.3 + 4.4 + 5.2(CORP-A 站点 2) | — |
| PE4 | 3.3 + 4.4 + 6.3(CORP-B 站点 2)+ 7.1(BRANCH) | — |
| CE-A1 / CE-A2 | 5.3 | 完整配置 |
| CE-B1 / CE-B2 | 6.4 | 完整配置(含后门链路) |
| HUB / SPOKE1 / SPOKE2 | 7.2(IPsec)+ 7.3 / 7.4(隧道) | IPsec 段三台相同 |
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 逐行下发。
#!/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 server、no cdp run、no 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 Nodes 再 Close Lab;
③ 有的镜像需要确认 nvram 可写。最保险的做法是定期 More actions → Export all CFGs 导出 zip 备份。