技术博客

HCIP 数通:MPLS 标签转发原理、LDP 协议与 MPLS VPN 基础

系统讲解 MPLS(多协议标签交换)的工作原理:标签格式与交换机制(LER/LSR/LSP)、LDP 协议标签分发过程、MPLS 转发表(LFIB)与 IP 路由表的关系、MPLS VPN(L3VPN)的 VRF 隔离与 PE-CE 路由交换,覆盖华为 VRP 平台 MPLS 基础配置。

MPLSHCIPLDPVPN标签转发VRF数通运营商

MPLS(Multi-Protocol Label Switching,多协议标签交换)是运营商骨干网的核心技术,也是企业专线(MPLS VPN)的基础。与 IP 路由逐跳查路由表不同,MPLS 在入口处给数据包贴上“标签”,中间路由器只查标签(速度更快),出口处去掉标签。

IP 路由 vs MPLS 转发

IP 路由转发:
  每台路由器独立查 IP 路由表
  → 每一跳:查 FIB → 最长前缀匹配 → 转发
  优点:简单
  缺点:每跳都要查路由表;无法区分不同 VPN 的相同 IP 地址

MPLS 标签转发:
  入口 LER(标签边缘路由器):给包贴标签,查路由表一次
  中间 LSR(标签交换路由器):只查标签表,交换标签,转发
  出口 LER:去掉标签,按目的 IP 转发给客户

优点:
  1. 中间节点只查标签(查询更快,硬件转发)
  2. 流量工程:不同流量可以走不同路径(不受 IGP 最短路径限制)
  3. VPN 隔离:不同 VRF 可以使用相同 IP 地址(用标签区分)

一、MPLS 基础概念

标签结构

MPLS 标签头(4 字节,插在 IP 头和 MAC 头之间):

  ┌────────────────────────────────┬─────┬────┐
  │     Label(标签值,20bit)      │ EXP │ S  │ TTL │
  │     0 - 1048575                │ 3bit│ 1b │ 8bit│
  └────────────────────────────────┴─────┴────┘

  Label:标签值(0-15 保留,16 以上可用)
  EXP:实验位(用于 QoS 标记,类似 802.1p)
  S:栈底位(1=最后一个标签,MPLS 支持标签嵌套)
  TTL:跳数限制(防止环路)

标签嵌套(MPLS VPN 使用两层标签):
  外层标签:标识 LSP 路径(到达对端 PE)
  内层标签:标识 VPN 用户(区分不同客户)

MPLS 网络角色

LER(Label Edge Router,标签边缘路由器):
  入口 LER:接收 IP 包,查路由表,压入标签
  出口 LER:去掉最后的标签,按 IP 转发

LSR(Label Switch Router,标签交换路由器):
  中间路由器,只查 LFIB(标签转发表),交换标签,转发

LSP(Label Switch Path,标签交换路径):
  从入口 LER 到出口 LER 的转发路径(虚拟通道)

FEC(Forwarding Equivalence Class,转发等价类):
  具有相同转发处理的一组数据流
  通常 = 目标 IP 前缀(一个 FEC 对应一个 LSP)

二、LDP 协议(标签分发协议)

LDP 工作流程:

1. 邻居发现
   LSR 周期性发送 LDP Hello(组播 224.0.0.2,UDP 646)
   发现邻居后建立 LDP 会话(TCP 646)

2. 标签分配(下游分配)
   每台 LSR 为本地的 FEC(路由前缀)分配标签
   向上游邻居通告:
   "我有到 10.0.1.0/24 的路由,发给我时贴标签 102"

3. 建立 LFIB
   收到标签绑定后,LSR 建立标签转发表:
   "收到标签 101 的包,换成 102,从接口 Gi0/1 发出"

4. 数据转发
   入口 LER 压入标签 → 中间 LSR 交换标签 → 出口 LER 弹出标签
# 华为 VRP:启用 MPLS 和 LDP

system-view

# 全局启用 MPLS
mpls lsr-id 1.1.1.1    # 设置 LSR ID(通常用 Loopback IP)
mpls                    # 启用 MPLS

# 启用 LDP
mpls ldp

# 在接口上启用 MPLS(转发 MPLS 流量的接口)
interface GigabitEthernet0/0/0
  mpls                  # 接口启用 MPLS
  mpls ldp              # 接口启用 LDP

# 验证 LDP 邻居
display mpls ldp peer
# LDP Peer Information in Public network
# Total number of peers : 2
# Peer-ID           Status    Hello     Transport
# 2.2.2.2:0        OPER      100       2.2.2.2    ← LDP 邻居建立

# 查看标签转发表(LFIB)
display mpls forwarding-table
# LSP Information: LSP
# FEC              In-Label  Out-Label  Out-IF      Nexthop
# 3.3.3.3/32       NULL      3          GE0/0/0     10.0.12.2
# 4.4.4.4/32       NULL      17         GE0/0/0     10.0.12.2
# 2.2.2.2/32       3         PHP        GE0/0/0     10.0.12.2
# PHP = Penultimate Hop Popping(倒数第二跳弹出标签)

# 查看 LDP 会话详情
display mpls ldp session

PHP(倒数第二跳标签弹出)

# PHP 优化:
# 正常:出口 LER 去掉标签(两次查表:先查 LFIB,再查 FIB)
# PHP:倒数第二个 LSR 就去掉标签,出口 LER 直接查 IP 路由表(一次查表)
# 结果:出口 LER 处理更快

# LDP 自动协商 PHP,不需要手动配置
# 出口 LER 向倒数第二跳分配"显式空标签"(Explicit Null Label = 0)
# 或"隐式空标签"(Implicit Null = 3,推荐,让上游弹出标签)

三、MPLS VPN 基础(L3VPN)

VPN 核心概念

MPLS VPN 解决的问题:
  运营商为多个企业客户提供 VPN 服务
  不同客户可以使用相同的 IP 地址(地址空间隔离)
  客户之间不能互访(路由隔离)

关键组件:
  CE(Customer Edge):客户边缘设备(客户路由器)
  PE(Provider Edge):运营商边缘设备(与 CE 对接)
  P(Provider):运营商核心路由器(只做 MPLS 转发,不涉及 VPN)
  VRF(VPN Routing and Forwarding,VPN 路由转发表):
    PE 上为每个 VPN 创建独立的路由表(隔离不同客户的路由)

Route Distinguisher(RD,路由区分符):
  给 VPN 路由加上 64-bit 前缀,使相同 IP 地址在 BGP 中可以区分
  格式:AS:num 或 IP:num(例如:65000:100)

Route Target(RT,路由目标):
  控制 VPN 路由的导入/导出策略
  import RT:接收哪些 RT 的路由
  export RT:给自己的路由打上什么 RT

MPLS VPN 配置示例

# === PE1 路由器(连接 VPN A 的 Site 1)配置 ===
system-view

# 1. 启用 MPLS 和 LDP(如前所述)
mpls lsr-id 1.1.1.1
mpls
mpls ldp

# 2. 创建 VRF(为 VPN A 创建独立路由表)
ip vpn-instance VPN-A
  ipv4-family
    route-distinguisher 65000:100    # RD = 65000:100
    vpn-target 65000:100 export-extcommunity   # 发出的路由打上 RT 65000:100
    vpn-target 65000:100 import-extcommunity   # 接受 RT 65000:100 的路由
  quit

# 3. 接口绑定 VRF(PE 连接 CE 的接口)
interface GigabitEthernet0/0/2
  ip binding vpn-instance VPN-A        # 绑定到 VPN-A VRF
  ip address 10.1.1.1 255.255.255.252  # 接口 IP(CE 对接 IP)

# 4. PE-CE 路由交换(OSPF 方式,与 CE 建立 OSPF)
ospf 100 vpn-instance VPN-A         # 在 VRF 内运行 OSPF
  area 0
    network 10.1.1.0 0.0.0.3
    network 10.1.0.0 0.0.255.255     # CE 侧网段

# 5. MP-BGP(PE 之间交换 VPN 路由)
bgp 65000
  peer 2.2.2.2 as-number 65000       # IBGP 邻居(PE2)
  peer 2.2.2.2 connect-interface LoopBack0

  ipv4-family vpnv4                   # VPNv4 地址族
    peer 2.2.2.2 enable               # 和 PE2 交换 VPN 路由
    peer 2.2.2.2 advertise-community

  # 把 VPN-A 的路由引入 MP-BGP
  ipv4-family vpn-instance VPN-A
    import-route ospf 100             # 把 VPN-A 的 OSPF 路由引入 BGP

quit

# 查看 VRF 路由表
display ip routing-table vpn-instance VPN-A
# 只显示 VPN-A 的路由(与其他 VPN 完全隔离)

# 查看 VPNv4 BGP 路由
display bgp vpnv4 all routing-table
# Network      NextHop     LocPrf  Weight  Path
# Route Distinguisher: 65000:100
# *>  10.1.0.0/24  2.2.2.2  100      0       ?   ← PE2 通告过来的 VPN-A 路由

四、MPLS 数据包转发过程

VPN A 数据包从 Site 1 到 Site 2 的转发:

Site 1 (10.1.0.1) → CE1 → PE1 → P1 → P2 → PE2 → CE2 → Site 2 (10.2.0.1)

1. CE1 发送普通 IP 包到 PE1(10.2.0.1)

2. PE1(入口 LER):
   查 VRF VPN-A 路由表 → 找到 10.2.0.1 的 LSP
   压入两层标签:
     外层标签 L1(到 PE2 的 LSP)
     内层标签 L2(标识 VPN-A)
   → 发给 P1

3. P1、P2(LSR):
   只看外层标签 L1
   L1=100 → 换成 L1=200,从接口 Gi0/1 发出
   → 这些路由器不需要知道 VPN-A 的存在

4. PE2(出口 LER):
   PHP:P 路由器已经弹出外层标签(只剩内层标签 L2)
   PE2 查标签 L2 → 对应 VPN-A
   去掉 L2,查 VRF VPN-A 路由表 → 找 10.2.0.1 → 发给 CE2
   
5. CE2 收到普通 IP 包,转发给 10.2.0.1

验证与排障

# 查看 MPLS 转发表
display mpls forwarding-table verbose

# Traceroute 查看 MPLS 路径
tracert -a 0.0.0.0 10.2.0.1          # 查看从 PE1 到 Site 2 的 MPLS 路径
display mpls lsp destination 10.2.0.1  # 查看特定目的地的 LSP

# VPN 路由问题
display ip routing-table vpn-instance VPN-A  # 查看 VRF 路由
display bgp vpnv4 all routing-table 10.2.0.0 24  # 查看 VPNv4 路由详情

# MPLS 标签问题
display mpls ldp lsp                   # 查看 LDP 创建的 LSP
debugging mpls ldp error               # 开启 LDP 错误调试

小结

MPLS 的本质是用标签替代 IP 查表:入口一次查路由表,中间只查标签(快速硬件转发),出口去掉标签交还 IP 包。LDP 是标签分发协议,路由器之间交换“我有这条路由,对应标签 xxx”的信息,自动建立 LSP。MPLS VPN(L3VPN)的精华是 VRF + 两层标签:VRF 在 PE 上隔离不同客户的路由,外层标签走 LSP 路径,内层标签标识哪个 VPN,MP-BGP 在 PE 之间传递 VPN 路由(VPNv4 地址族)。这是运营商 MPLS 专线服务的基础架构。