第166篇:L3VPN 数据转发过程详解
关键词
L3VPN 转发、双层标签、隧道标签、VPN 标签、PHP、VRF 查找、解封装
一、转发全景概览
L3VPN 的转发涉及五个设备和三个阶段:
CE1 → PE1(Push 双层标签) → P(Swap 外层) → PE2(Pop 外层+查找 VPN 标签) → CE2
| CE1 | ──▶ | PE1 | ──▶ | P | ──▶ | PE2 | ──▶ | CE2 |
|---|---|---|---|---|---|---|---|---|
普通 IP → MPLS(双层标签) → MPLS(单层标签) → 普通 IP (PHP 后 VPN 标签暴露)
二、完整的转发路径跟踪
2.1 网络场景
MPLS VPN 场景参数:
CE1:10.1.1.0/24(企业 A 站点 1)
CE2:10.2.2.0/24(企业 A 站点 2)
PE1 Loopback:1.1.1.1
PE2 Loopback:2.2.2.2
路由信息:
PE1 的 VRF-A:10.2.2.0/24 → 下一跳 PE2(2.2.2.2)
PE2 的 VRF-A:10.1.1.0/24 → 下一跳 PE1(1.1.1.1)
标签信息:
外层(LDP/IGP):
PE1 → PE2:LDP 标签 300(P 分配)
P → PE2:PHP(Implicit NULL)
内层(VPN 标签):
PE2 分配:VPN 标签 15392(标识 VRF-A)
PE1 分配:VPN 标签 15920(标识 VRF-A)
2.2 步骤详解
步骤 1:CE1 发送 IP 包
┌─────────────────────────────────┐
│ CE1 → PE1 │
│ 源 MAC: CE1 接口 MAC │
│ 目的 MAC: PE1 接口 MAC │
│ 源 IP: 10.1.1.1 │
│ 目的 IP: 10.2.2.1 │
│ 这是普通以太网帧,无 MPLS 标签 │
└─────────────────────────────────┘
步骤 2:PE1 收到并处理
PE1 收到 IP 包(GE0/0/0.100 接口,绑定 VRF-A)
│
├─ 查 VRF-A 路由表
│ 10.2.2.0/24 → 下一跳 2.2.2.2(PE2 Loopback)
│
├─ 确定转发方式:MPLS 隧道
│
├─ 查 VPN 标签:PE2 发布的 VPN 标签 = 15392
│
├─ 查 LDP 标签:到 2.2.2.2 的 LDP 标签 = 300
│
├─ 压入标签栈:
│ Top: 300(LDP 外层标签,S=0)
│ Bottom: 15392(VPN 内层标签,S=1)
│
└─ 从 GE0/0/1 发送到 P
┌─────────────────────────────────────────┐
│ P Ether | MAC | L=300(S=0) | L=15392(S=1) | IP(10.1.1.1→10.2.2.1)│
└─────────────────────────────────────────┘
步骤 3:P 路由器转发
P 收到 MPLS 包
│
├─ 查 LFIB(入标签 300)
│ Out-Label: PHP(Implicit NULL)
│ Operation: Pop
│
├─ 弹出外层标签(不碰内层 VPN 标签)
│
└─ 发送到 PE2
┌─────────────────────────────────┐
│ Ether | MAC | L=15392(S=1) | IP │ ← 只剩 VPN 标签
└─────────────────────────────────┘
步骤 4:PE2 收到并处理
PE2 收到带 VPN 标签的 MPLS 包
│
├─ 查 ILM(入标签 15392)
│ → 对应 VRF-A
│
├─ 弹出 VPN 标签
│
├─ 恢复为普通 IP 包
│
├─ 查 VRF-A 路由表
│ 10.2.2.1 → 下一跳 CE2(接口 GE0/0/0.100)
│
└─ 发送到 CE2(普通以太网帧)
┌─────────────────────────────────┐
│ Ether | IP(10.1.1.1→10.2.2.1) │
└─────────────────────────────────┘
步骤 5:CE2 收到并响应
CE2 收到普通 IP 包,正常处理
回复流量走反向路径(对称流程)
三、转发过程中的关键数据结构
3.1 PE1 的转发决策
PE1 向 PE2 转发 10.2.2.1 时的查表顺序:
1. VRF-A 路由表(IP 路由表)
10.2.2.0/24 IBGP 255 0 2.2.2.2 Tunnel1(MPLS)
↑ 下一跳是 PE2 Loopback
2. 全局路由表(到 2.2.2.2)
2.2.2.2/32 OSPF 10 1 10.1.1.2 GE0/0/1
这只是为了知道出接口,实际转发通过标签
3. MPLS 标签查找
Tunnel1 到 PE2 的封装信息:
- VPN 标签:15392(对端 PE 分配的)
- LDP 标签:300(到 PE2 的 LDP 标签)
- 标签栈:[300, 15392]
3.2 PE2 的转发决策
PE2 收到标签 15392 后的查表顺序:
1. ILM(Incoming Label Map)
15392 → NHLFE: Pop(弹出标签)
→ 对应 VRF: VRF-A
2. VRF-A 路由表
Pop 后恢复 IP 包 → 查 VRF-A 路由
10.2.2.0/24 Direct 0 0 192.168.2.1 GE0/0/0.100
→ 从 GE0/0/0.100 转发到 CE2
四、双向流量转发
4.1 回程转发
CE2 → PE2 → P → PE1 → CE1
对称过程:
CE2 回复(IP: 10.2.2.1 → 10.1.1.1)
│
PE2:查 VRF-A → 下一跳 PE1
压入标签栈 [LDP标签(S=0), VPN标签(S=1)]
│
P:PHP 弹出外层标签
│
PE1:查 VPN 标签 → 对应 VRF-A
弹出 → 查 VRF-A → CE1
4.2 对称性说明
| 维度 | 正向(CE1→CE2) | 反向(CE2→CE1) |
|---|---|---|
| 外层 LDP 标签 | 不同(由 P 分配) | 不同(由 P 分配) |
| 内层 VPN 标签 | 15392(PE2 分配) | 15920(PE1 分配) |
| PHP 操作 | P 弹外层 | P 弹外层 |
| 转发路径 | 可能相同,可能不同 | 可能相同,可能不同 |
重要:MPLS 的标准转发不要求路径对称。P 设备根据 IGP 最短路径独立选择出接口,正向和反向可能走不同路径。
五、常见转发问题排查
5.1 MTU 问题
问题:VPN 标签栈 + IP 包 > 链路 MTU(1500)
MPLS 封装开销:
IP 包本身:1500 字节
MPLS 标签栈:4 字节 × 2(双层)= 8 字节
总长度:1508 字节 → 超过 MTU → 分片
解决方案:
1. 接口调大 MTU(建议 1520+)
interface GigabitEthernet0/0/1
mtu 1600 # 华为设备 mtu 命令
2. 开启 MPLS MTU
mpls mtu 1600 # MPLS 数据包最大长度
3. MSS Clamping
interface Tunnel1
tcp adjust-mss 1436 # 1500 - 20(IP) - 20(TCP) - 8(MPLS) - 16(可选)
5.2 标签空洞
现象:VPN 流量走到一半被丢弃
排查:
# PE1 检查 LSP 是否完整
display mpls lsp include 2.2.2.2/32
→ 确认有完整的 LDP LSP 到 PE2
# PE2 检查 VPN 标签
display mpls lsp include 10.2.2.0/24
→ 确认 VPN 标签存在
# 检查 P 设备是否有到 PE2 的 LSP
display mpls lsp include 2.2.2.2/32
5.3 VRF 路由缺失
现象:CE1 无法 ping 通 CE2,PE1 上 VRF 路由表为空
排查:
# PE1 检查 VRF 路由
display ip routing-table vpn-instance VRF-A
# 检查 MP-BGP 是否收到路由
display bgp vpnv4 all routing-table
# 检查 RT 是否匹配
display ip vpn-instance VRF-A
→ import RT、export RT 是否配置正确
# 检查 PE-CE 路由协议
display bgp vpn-instance VRF-A peer
display ospf 100 peer
六、转发路径的 TTL 处理
6.1 MPLS TTL 模式
| 模式 | 行为 | 应用场景 |
|---|---|---|
| Uniform 模式(默认) | IP TTL 复制到 MPLS TTL,在 MPLS 域中递减 | 标准场景 |
| Pipe 模式 | MPLS TTL 独立于 IP TTL | 隐藏骨干拓扑 |
Uniform 模式:
PE1 收到 IP 包(TTL=255)
复制到 MPLS TTL → 255
P 转发 → MPLS TTL 减 1 → 254
PE2 Pop → MPLS TTL 复制回 IP TTL → 254
CE2 收到:TTL=254
Pipe 模式:
PE1 收到 IP 包(TTL=255)
MPLS TTL=255(独立)
P 转发 → MPLS TTL 减 1(但 IP TTL 不变)
PE2 Pop → IP TTL 仍为 255
CE2 收到:TTL=255(traceroute 看不到 P 设备)
七、总结
| 转发阶段 | 设备 | 操作 | 标签变化 |
|---|---|---|---|
| 入站封装 | PE1(Ingress) | Push 双层标签 | 无 → [LDP, VPN] |
| 核心转发 | P(Transit) | Swap/PHP 外层 | [LDP, VPN] → [VPN] 或 [LDP', VPN] |
| 出站解封装 | PE2(Egress) | Pop VPN 标签 + VRF 查表 | [VPN] → 无 |
| 交付 | CE2 | 普通 IP 转发 | 无 MPLS |
八、思考
- L3VPN 中,Ingress PE 如何决定压入哪些标签?压入的先后顺序是怎样的?
- P 路由器为什么看不到 VPN 标签?它如何处理双层标签?
- PE2 收到带 VPN 标签的包后,如何确定这是哪个 VRF 的流量?
- 在 L3VPN 转发中,MTU 为什么会成为问题?如何解决?
- Uniform 模式和 Pipe 模式在 TTL 处理上有什么不同?
下篇预告:第167篇《Hub & Spoke VPN 拓扑设计》——通过 RT 策略实现 Hub-Spoke 拓扑,让分支之间的流量强制经过总部。