第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路由黑洞的成因,提供多种解决方案和实际排障思路。