第166篇:L3VPN 数据转发过程详解
关键词:L3VPN转发、双层标签、Ingress PE、Egress PE、递归查找、VPN标签、公网标签
一、引言
理解了 L3VPN 的控制平面(VRF、RD、RT、MP-BGP)之后,深入了解 L3VPN 的数据转发过程同样重要。L3VPN 的数据转发采用"双层标签"机制:外层标签(公网 LDP 标签)负责将报文从 Ingress PE 传输到 Egress PE,内层标签(VPN 标签)在 Egress PE 上识别报文属于哪个 VRF 和哪个前缀。掌握这一转发过程,是排查 L3VPN 故障的核心技能。
二、核心概念
2.1 L3VPN 双层标签模型

2.2 标签分配与关联
| 标签 | 分配者 | 查找依据 | 作用域 |
|---|---|---|---|
| 公网标签(外层) | 公网 LDP | PE LoopBack 地址 | PE 之间的 MPLS 核心网 |
| VPN 标签(内层) | MP-BGP | VPNv4 前缀(RD+Prefix) | 同 VPN 实例的 PE 之间 |
2.3 转发决策点
| 阶段 | 决策点 | 查找依据 | 动作 |
|---|---|---|---|
| CE→PE1 入口 | VRF 路由表 | 目的 IP(CE 路由) | 查找 VPN 标签 |
| PE1→核心 | LFIB | 双层标签组合 | Push 公网标签 |
| 核心网 | LFIB | 外层标签 | Swap 外层标签 |
| PE2 入口 | LFIB | 外层标签 | Pop 外层标签 |
| PE2→CE2 出口 | VRF 路由表 | VPN 标签 → VRF → 目的 IP | Pop VPN 标签,IP 转发 |
三、技术细节
3.1 Ingress PE 转发过程(数据出 VPN)
当 CE 发送数据包到 PE 时,PE1 执行以下步骤:

3.2 Egress PE 转发过程(数据入 VPN)

3.3 递归查找(Recursive Lookup)
PE 的 LFIB 中存储的是"标签到标签"的映射,但实际转发时需要递归查找:
| 步骤 | 查找内容 | 查找结果 |
|---|---|---|
| 第一步 | VRF 路由表 → 目的 IP | 获得 VPN 标签(内层) |
| 第二步 | VPNv4 路由 → Next-Hop | 获得 Egress PE 的 LoopBack 地址 |
| 第三步 | 公网 LDP → LoopBack 地址 | 获得公网标签(外层) |
| 第四步 | 组合双层标签 | 外层(公网)+ 内层(VPN) |
3.4 转发黑洞场景
| 场景 | 原因 | 表现 |
|---|---|---|
| 公网 LDP 断掉 | PE 间 LDP Session Down | 外层标签丢失,无法到达 Egress PE |
| VPN 标签未分发 | MP-BGP 未交换标签 | 内层标签丢失,Egress PE 无法识别 VRF |
| VRF 路由缺失 | Import RT 不匹配 | Egress PE 的 VRF 中无对应路由 |
| PE-CE 链路故障 | 物理/逻辑链路 Down | 数据到达 PE 但无法到达 CE |
四、实战配置/案例分析
4.1 验证 L3VPN 数据转发
# ========== 在 PE1 上验证 ==========
# 查看 VRF 路由表(入方向查找)
<PE1> display ip routing-table vpn-instance VPN-A 10.1.2.2
Routing Tables: VPN-A
Destination : 10.1.2.2/32
Protocol : BGP
Pre : 255
NextHop : 10.1.2.2
Interface : GE1/0/0
# 查看 VPN 标签映射
<PE1> display mpls vpn-label
VPN-Label:
RD: 10.1.2.1:100
Prefix: 10.1.2.0/24
Label: 16015
Peer: 10.1.2.1
# 查看公网 LDP 标签
<PE1> display mpls lsp 10.1.2.1 32
NLRR: 10.1.2.1/32
INLBL: Null, OURLBL: 1026
OUTIF: 10GE1/0/1
# 查看双层标签LSP
<PE1> display mpls lsp vpn
VPN LSP:
RD: 10.1.2.1:100
Prefix: 10.1.2.0/24
Inner Label: 16015 (from PE2)
Outer Label: 1026 (LDP to PE2)
Out Interface: 10GE1/0/1
4.2 抓包验证双层标签
# 在 PE1 出接口抓包
<PE1> packet-capture interface 10GE 1/0/1 start
<PE1> packet-capture display
# MPLS Label Stack:
# Outer: Label=1026, EXP=0, BoS=0, TTL=254
# Inner: Label=16015, EXP=0, BoS=1, TTL=254
# 在 P 设备接口抓包
<P> packet-capture interface 10GE 1/0/1 start
<P> packet-capture display
# MPLS Label Stack:
# Outer: Label=2030, EXP=0, BoS=0, TTL=253
# Inner: Label=16015, EXP=0, BoS=1, TTL=253
# 外层标签被Swap, 内层标签透传
# 在 PE2 入接口抓包
<PE2> packet-capture interface 10GE 1/0/1 start
<PE2> packet-capture display
# MPLS Label Stack:
# Inner: Label=16015, EXP=0, BoS=1, TTL=252
# 外层标签已被PHP点弹出, 仅存内层VPN标签
4.3 故障排查:L3VPN 转发中断
故障场景:CE1 到 CE2 的 ping 不通,PE1 到 PE2 的公网 LDP 连通。
# Step 1: 在 PE1 检查 VRF 路由
<PE1> display ip routing-table vpn-instance VPN-A 10.1.2.0 24
# VRF中无10.1.2.0/24路由!
# Step 2: 检查 MP-BGP VPNv4 路由
<PE1> display bgp vpnv4 all routing-table
*> 10.1.2.1:100:10.1.2.0/24 10.1.2.1 0 100 i
# VPNv4路由存在
# Step 3: 检查 Import RT 匹配
<PE1> display vpn-instance VPN-A
Route-target import/add: 100:100
<PE1> display bgp vpnv4 all routing-table 10.1.2.1:100:10.1.2.0 24 verbose
Extended Community:
RT: 100:200
# 问题: 路由携带的RT是100:200, 但Import RT是100:100, 不匹配!
# Step 4: 根因
# PE2的VRF Export RT配置错误: 100:200 而非 100:100
# Step 5: 修正 PE2 配置
[PE2-vpn-instance-VPN-A] route-target export 100:100
# Step 6: 验证
<PE1> display ip routing-table vpn-instance VPN-A 10.1.2.0 24
# 路由已出现, ping 恢复
五、总结
| 项目 | 要点 |
|---|---|
| 双层标签 | 外层(公网LDP)+ 内层(VPN标签),分别负责传输和交付 |
| Ingress PE | VRF查找 → VPN标签 + 公网标签 → 双层Push |
| 核心网 | 仅查看外层标签,内层标签透传 |
| Egress PE | Pop外层 → VPN标签查找VRF → Pop内层 → IP转发 |
| 故障排查 | 按顺序检查 VRF路由 → VPNv4路由 → VPN标签 → 公网标签 |
思考
- 如果 P 设备(纯核心设备)不支持 MPLS,L3VPN 的双层标签转发还能工作吗?为什么?
- Egress PE 收到数据包后,是先 Pop 外层标签还是先查 VPN 标签?这个顺序是否可以改变?
- 当 Egress PE 收到一个不认识的 VPN 标签时,报文会被丢弃还是尝试 IP 转发?
下篇预告:第167篇:Hub & Spoke VPN 拓扑设计