第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 双层标签模型

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 执行以下步骤:

Ingress PE 转发过程(数据出 VPN) - 图示

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

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标签 → 公网标签

思考

  1. 如果 P 设备(纯核心设备)不支持 MPLS,L3VPN 的双层标签转发还能工作吗?为什么?
  2. Egress PE 收到数据包后,是先 Pop 外层标签还是先查 VPN 标签?这个顺序是否可以改变?
  3. 当 Egress PE 收到一个不认识的 VPN 标签时,报文会被丢弃还是尝试 IP 转发?

下篇预告:第167篇:Hub & Spoke VPN 拓扑设计