第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

八、思考

  1. L3VPN 中,Ingress PE 如何决定压入哪些标签?压入的先后顺序是怎样的?
  2. P 路由器为什么看不到 VPN 标签?它如何处理双层标签?
  3. PE2 收到带 VPN 标签的包后,如何确定这是哪个 VRF 的流量?
  4. 在 L3VPN 转发中,MTU 为什么会成为问题?如何解决?
  5. Uniform 模式和 Pipe 模式在 TTL 处理上有什么不同?

下篇预告:第167篇《Hub & Spoke VPN 拓扑设计》——通过 RT 策略实现 Hub-Spoke 拓扑,让分支之间的流量强制经过总部。