第335篇:MPLS L3VPN 跨域互联案例

关键词

MPLS、L3VPN、跨域 VPN、Option A、Option B、Option C、BGP、VPN 路由、跨域互联


一、案例背景

1.1 客户需求

某跨国企业 MPLS VPN 互联需求:

企业信息:

行业:制造 总部:北京 分支:上海、广州、深圳、香港 工厂:东莞、苏州、天津 海外:新加坡、东京、法兰克福 网络需求: └─ 各站点通过 MPLS L3VPN 互联 └─ 不同分支机构在同一个 VPN 内互通 └─ 总部可访问所有分支 └─ 分支间默认隔离(可选互访)

运营商情况:

国内:中国电信 MPLS VPN(AS 100) 海外:SingTel MPLS VPN(AS 200) └─ 需要跨 AS 实现 VPN 互通 香港:互联点(Inter-AS 对接点) └─ 电信和 SingTel 在香港有互联 POP

1.2 跨域 VPN 方案选择

三种跨域 VPN 方案对比:

Option A:"背靠背"VRF

原理:ASBR 之间通过子接口互联 每个 VRF 对应一个子接口/VLAN ASBR 之间运行普通 IP 转发(EBGP/静态) 优点: └─ 实现简单,容易理解 └─ 不需要特殊的跨域特性 缺点: └─ 扩展性差(每个 VRF 需要单独接口) └─ ASBR 配置量大 └─ N×V 条子接口(N=AS 数,V=VRF 数) 适用:小规模,VRF 数量少(< 10)

Option B:"单跳 MP-EBGP"

原理:ASBR 之间运行 MP-EBGP 交换带标签的 VPNv4 路由 ASBR 不做 VPN 解封装 优点: └─ 扩展性好:一个子接口承载所有 VRF └─ ASBR 不需要 VRF 配置 缺点: └─ ASBR 需要维护所有 VPN 路由 └─ 可能暴露 VPN 内部信息 适用:中等规模,VRF 数 < 100

Option C:"多跳 MP-EBGP"

原理:PE 之间直接建立 MP-EBGP 会话 ASBR 只交换标签(Labeled Unicast) PE 之间跨域交换 VPNv4 路由 优点: └─ 最优扩展性(ASBR 不需要维护 VPN 路由) └─ ASBR 只维护公网标签 缺点: └─ 配置复杂 └─ 需要 ASBR 支持 labeled unicast 适用:大规模,多 AS,VRF 数 > 100


二、Option B 方案实现

2.1 网络拓扑

跨域 MPLS L3VPN(Option B)拓扑:

┌─────── AS 100 (中国电信) ──────┐ ┌── AS 200 (SingTel) ──┐
PE-1 ── P ── ASBR-1 ────║──── CE-1 (北京总部) ─ 互联 点 CE-2 (新加坡分部) ─── ASBR-2 ── P ── PE-2

互联点: ┌─ ASBR-1(电信)←→ ASBR-2(SingTel) ├─ 物理互联:10GE 单模光纤 ├─ IP 子网:192.168.100.0/30 ├─ ASBR-1:192.168.100.1/30 ├─ ASBR-2:192.168.100.2/30 └─ 协议:MP-EBGP(Option B)

2.2 ASBR 配置

# option_b_config.py — Option B 跨域配置

def generate_asbr1_config():
    """ASBR-1(中国电信侧)配置"""
    return """
sysname ASBR-1

# ========== MPLS + LDP ==========
mpls lsr-id 10.0.0.1
mpls
 ldp

interface GigabitEthernet0/0/0
 description to-P-router
 ip address 10.0.1.1 255.255.255.252
 mpls
 mpls ldp

# ========== 互联接口(到 ASBR-2) ==========
interface GigabitEthernet0/0/1
 description to-ASBR-2-SingTel
 ip address 192.168.100.1 255.255.255.252
 mpls
 mpls ldp          # MPLS 封装,不做解封装

# ========== IGP(OSPF) ==========
ospf 1 router-id 10.0.0.1
 area 0.0.0.0
  network 10.0.0.1 0.0.0.0
  network 10.0.1.0 0.0.0.3

# ========== IBGP(给 PE 发布 VPNv4 路由) ==========
bgp 100
 router-id 10.0.0.1
 peer 10.0.0.10 as-number 100  # PE-1
 peer 10.0.0.10 connect-interface LoopBack0

 ipv4-family unicast
  peer 10.0.0.10 enable

 ipv4-family vpnv4
  peer 10.0.0.10 enable       # 和 PE 交换 VPNv4 路由

# ========== EBGP(到 ASBR-2,Option B) ==========
bgp 100
 peer 192.168.100.2 as-number 200  # 对端 AS

 ipv4-family vpnv4
  undo policy vpn-target              # 重要:不过滤 VPN Target
  peer 192.168.100.2 enable           # 跨域交换 VPNv4 路由
"""


def generate_asbr2_config():
    """ASBR-2(SingTel 侧)配置"""
    return """
sysname ASBR-2

# ========== MPLS + LDP ==========
mpls lsr-id 10.0.0.2
mpls
 ldp

interface GigabitEthernet0/0/0
 description to-P-router
 ip address 10.0.2.1 255.255.255.252
 mpls
 mpls ldp

# ========== 互联接口(到 ASBR-1) ==========
interface GigabitEthernet0/0/1
 description to-ASBR-1-ChinaTel
 ip address 192.168.100.2 255.255.255.252
 mpls

# ========== IGP ==========
ospf 1 router-id 10.0.0.2
 area 0.0.0.0
  network 10.0.0.2 0.0.0.0
  network 10.0.2.0 0.0.0.3

# ========== EBGP(到 ASBR-1,Option B) ==========
bgp 200
 peer 192.168.100.1 as-number 100

 ipv4-family vpnv4
  undo policy vpn-target
  peer 192.168.100.1 enable

# ========== IBGP(给 PE 发布 VPNv4 路由) ==========
bgp 200
 peer 10.0.0.20 as-number 200  # PE-2
 peer 10.0.0.20 connect-interface LoopBack0

 ipv4-family vpnv4
  peer 10.0.0.20 enable
"""

2.3 PE 配置

def generate_pe_config():
    """PE 配置(北京总部侧)"""
    return """
sysname PE-1

# ========== MPLS + LDP ==========
mpls lsr-id 10.0.0.10
mpls
 ldp

interface GigabitEthernet0/0/0
 description to-P-router
 ip address 10.0.1.2 255.255.255.252
 mpls
 mpls ldp

# ========== VRF 定义 ==========
ip vpn-instance CUSTOMER-A
 description Beijing-Headquarter
 route-distinguisher 100:1
 vpn-target 100:1 export-extcommunity
 vpn-target 100:1 import-extcommunity

# ========== CE 接口 ==========
interface GigabitEthernet0/0/1
 description to-CE-1-Beijing
 ip binding vpn-instance CUSTOMER-A
 ip address 10.10.0.1 255.255.255.252

# ========== BGP + VPNv4 ==========
bgp 100
 router-id 10.0.0.10
 peer 10.0.0.1 as-number 100
 peer 10.0.0.1 connect-interface LoopBack0

 ipv4-family vpn-instance CUSTOMER-A
  peer 10.10.0.2 as-number 65001       # CE-1 EBGP
  network 10.10.0.0 mask 255.255.255.0

 ipv4-family vpnv4
  peer 10.0.0.1 enable                 # 和 ASBR 交换 VPNv4
"""

三、Option C 方案实现

3.1 方案对比与选择

为什么选择 Option C?

客户实际需求:

国内站点:8 个 VRF 海外站点:5 个 VRF 未来 3 年:扩展到 30+ VRF Option B 的问题: └─ ASBR 需要维护所有 VRF 路由 └─ 30 VRF × 100 路由 = 3000 条 └─ 对 ASBR 性能有要求 Option C 的优势: └─ ASBR 只维护公网标签 └─ PE 之间直接建立 VPNv4 邻居 └─ ASBR 性能不受 VRF 数量影响

3.2 Option C 配置差异

# option_c_config.py — Option C 跨域配置

def generate_asbr_option_c():
    """Option C 的 ASBR 配置(简化)"""
    return """
sysname ASBR-1

# ========== 互联接口(到 ASBR-2) ==========
interface GigabitEthernet0/0/1
 description to-ASBR-2-Option-C
 ip address 192.168.100.1 255.255.255.252
 mpls                          # 只需 MPLS 封装

# ========== EBGP Labeled Unicast ==========
bgp 100
 peer 192.168.100.2 as-number 200

 ipv4-family unicast
  peer 192.168.100.2 enable
  peer 192.168.100.2 label-route capability  # 关键:标签路由
  network 10.0.0.1 mask 255.255.255.255      # 发布本端 PE 环回口
  network 10.0.0.10 mask 255.255.255.255     # 发布 PE 的环回口
"""


def generate_pe_option_c():
    """Option C 的 PE 配置(PE 间直接建立 VPNv4 会话)"""
    return """
sysname PE-1

# ========== 到对端 PE-2 的多跳 MP-EBGP ==========
bgp 100
 peer 10.0.0.20 as-number 200                # 对端 PE 环回口
 peer 10.0.0.20 ebgp-max-hop 10              # 多跳 EBGP
 peer 10.0.0.20 connect-interface LoopBack0

 ipv4-family vpnv4
  peer 10.0.0.20 enable                      # PE 间直接交换 VPNv4
  peer 10.0.0.20 route-policy VPN_POLICY export  # 路由策略

# ========== BGP 路由策略 ==========
route-policy VPN_POLICY permit node 10
 if-match vpn-target 100:1                  # 只发布匹配的 VPN
 apply extcommunity 100:1
"""

四、验证与排障

4.1 验证命令

# Option B 验证命令

# 1. 验证 MPLS LSP
display mpls lsp
display mpls ldp session

# 2. 验证 VRF
display ip vpn-instance verbose
display ip routing-table vpn-instance CUSTOMER-A

# 3. 验证 VPNv4 路由(ASBR 上)
display bgp vpnv4 all routing-table
display bgp vpnv4 all peer

# 4. 验证跨域 VPNv4 路由
display bgp vpnv4 all routing-table
# 应该看到对端 AS 的 VPNv4 路由,RD 和 RT 正确

# 5. 验证私网连通性
# 在 PE 上 ping CE
ping -vpn-instance CUSTOMER-A 10.20.0.2

# 6. 验证跨域路径
tracert -vpn-instance CUSTOMER-A 10.20.0.2

4.2 常见问题

MPLS L3VPN 跨域常见问题:

  问题 1:跨域 VPNv4 路由不学习
  ┌──────────────────────────────────────────┐
  │  排查步骤:                               │
  │  1. ASBR 之间 MP-EBGP 会话是否 Established │
  │     display bgp vpnv4 all peer           │
  │                                           │
  │  2. 是否配置了 undo policy vpn-target    │
  │     (Option B 必须关闭 RT 过滤)          │
  │                                           │
  │  3. 检查 RT 是否匹配                     │
  │     display bgp vpnv4 all routing-table  │
  │                                           │
  │  4. 检查 MPLS 标签是否正确分发            │
  │     display mpls lsp                     │
  └──────────────────────────────────────────┘

  问题 2:跨域 VPN 能 ping 通但业务异常
  ┌──────────────────────────────────────────┐
  │  可能原因:                               │
  │  1. MTU 问题(MPLS 标签增加了 4-12 字节) │
  │     解决方案:调整接口 MTU + TCP MSS      │
  │                                           │
  │  2. 标签栈深度超过硬件限制                │
  │     检查:display mpls forwarding         │
  │                                           │
  │  3. ECMP 导致乱序                        │
  │     检查:是否有多个等价路径              │
  └──────────────────────────────────────────┘

4.3 自动化验证

# verify_cross_domain.py — 跨域 VPN 验证脚本

from netmiko import ConnectHandler
import json


class CrossDomainVPNVerifier:
    """跨域 VPN 验证器"""

    def __init__(self, devices: dict):
        self.devices = devices
        self.results = {}

    def verify_asbr(self, device_name: str):
        """验证 ASBR 状态"""
        conn = ConnectHandler(**self.devices[device_name])

        results = {}

        # 1. MPLS 邻接
        output = conn.send_command(
            "display mpls ldp session"
        )
        results["ldp_sessions"] = len(
            [l for l in output.splitlines()
             if "Operational" in l]
        )

        # 2. VPNv4 邻居
        output = conn.send_command(
            "display bgp vpnv4 all peer"
        )
        results["vpnv4_peers"] = output.count("Established")

        # 3. VPNv4 路由数
        output = conn.send_command(
            "display bgp vpnv4 all routing-table |"
            " include Total"
        )
        results["vpnv4_routes"] = output.strip()

        conn.disconnect()
        return results

    def verify_pe(self, device_name: str):
        """验证 PE 状态"""
        conn = ConnectHandler(**self.devices[device_name])

        results = {}

        # 1. VRF
        output = conn.send_command(
            "display ip vpn-instance"
        )
        results["vrfs"] = len(
            [l for l in output.splitlines()
             if "CUSTOMER" in l]
        )

        # 2. VRF 路由(跨域路由)
        output = conn.send_command(
            "display ip routing-table vpn-instance"
            " CUSTOMER-A protocol bgp"
        )
        results["cross_domain_routes"] = len(
            [l for l in output.splitlines()
             if "BGP" in l]
        )

        # 3. 跨域连通性测试
        remote_ce = "10.20.0.2"  # 远端 CE
        output = conn.send_command(
            f"ping -vpn-instance CUSTOMER-A {remote_ce} -c 5"
        )
        results["connectivity"] = {
            "remote_ce": remote_ce,
            "reachable": "!" in output,
        }

        conn.disconnect()
        return results

    def verify_all(self):
        """执行全体验证"""
        for device_name in self.devices:
            if "ASBR" in device_name:
                self.results[device_name] = \
                    self.verify_asbr(device_name)
            elif "PE" in device_name:
                self.results[device_name] = \
                    self.verify_pe(device_name)

        return self.results

五、经验总结

MPLS L3VPN 跨域部署关键经验:

  1. 方案选择
  ┌─ Option A:"背靠背"VRF,适合 VRF 少的场景
  ├─ Option B:单跳 MP-EBGP,最常用方案
  ├─ Option C:多跳 MP-EBGP,大规模场景
  └─ 推荐大部分场景使用 Option B

  2. MPLS 考虑
  ┌─ 互联接口必须配置 mpls(即使 Option B 也需要)
  ├─ 注意 MTU:MPLS 标签增加 4/8/12 字节
  ├─ 配置 TCP MSS Clamping(MSS = MTU - 40 - 标签数×4)
  └─ LSP 必须端到端可达

  3. RT 设计
  ┌─ RT(Route Target)决定路由导入导出
  ├─ 跨域时 RT 需全局唯一
  ├─ 建议使用 ASN:Index 格式(如 100:1)
  └─ Option B 需要在 ASBR 上 undo policy vpn-target

  4. 路由控制
  ┌─ 使用 route-policy 控制跨域路由发布
  ├─ 可以基于 as-path 过滤
  ├─ 可以设置 med 影响选路
  └─ 注意路由黑洞防护

  5. 运维建议
  ┌─ 建设 VPN 路由监控(路由数/变化率)
  ├─ 定期做跨域连通性测试
  ├─ 记录所有 VRF 和 RT 映射关系
  └─ 变更前确认跨域 ASBR 会话状态

下篇预告:第336篇《BGP路由黑洞分析与解决方案》——深入分析BGP路由黑洞的成因,提供多种解决方案和实际排障思路。


下篇预告:第336篇《BGP路由黑洞分析与解决方案》——深入分析BGP路由黑洞的成因,提供多种解决方案和实际排障思路。