0. 前言

在模拟器环境验证 SRv6,很多人会死在“数据面不通”或者“SID 不分配”上。本指南基于 FRR 10.5.0,带你绕过厂商镜像的坑,直接在 Linux 内核层通过微段(uSID)实现极致转发效率。


1. 实验拓扑与自动化底座 (Containerlab)

1.1 FRR Daemons 配置

确保关键协议模块开启。

# /etc/frr/daemons
zebra=yes
bgpd=yes
isisd=yes

1.2 使用clab创建拓扑

使用 clab 快速拉起拓扑,注意必须挂载内核路由参数。

为何要 Binding 内核使能 SRv6? Linux 默认不处理 seg6 报文。如果不手动 sysctl 开启,内核会把所有 SRv6 封装包当成攻击报文直接丢弃。

FRR 版本门槛:SRv6 属于较新的协议栈,必须使用 FRR 9.1.0 之后的版本(本次使用最新的 10.5.0)。旧版本对 uSID 和 sid vpn export 的支持不完整。

# srv6-usid.clab.yml
name: srv6-5g-lab

topology:
  nodes:
    r1: 
      kind: linux
      image: quay.io/frrouting/frr:10.5.0
      exec:
      # 1. 内核参数:必须在容器启动时立刻开启
        - sysctl -w net.ipv6.conf.all.forwarding=1
        - sysctl -w net.ipv6.conf.all.seg6_enabled=1
        - sysctl -w net.ipv6.conf.default.seg6_enabled=1
        - sysctl -w net.vrf.strict_mode=1
      # 2. 绑定/etc/frr文件夹下的damons文件
      binds: ["./clab-srv6-5g-lab/r1:/etc/frr"]   
    r2: 
      kind: linux
      image: quay.io/frrouting/frr:10.5.0
      exec:
      # 1. 内核参数:必须在容器启动时立刻开启
        - sysctl -w net.ipv6.conf.all.forwarding=1
        - sysctl -w net.ipv6.conf.all.seg6_enabled=1
        - sysctl -w net.ipv6.conf.default.seg6_enabled=1
        - sysctl -w net.vrf.strict_mode=1
      binds: ["./clab-srv6-5g-lab/r2:/etc/frr"]
    r3: 
      kind: linux
      image: quay.io/frrouting/frr:10.5.0
      exec:
      # 1. 内核参数:必须在容器启动时立刻开启
        - sysctl -w net.ipv6.conf.all.forwarding=1
        - sysctl -w net.ipv6.conf.all.seg6_enabled=1
        - sysctl -w net.ipv6.conf.default.seg6_enabled=1
        - sysctl -w net.vrf.strict_mode=1
      binds: ["./clab-srv6-5g-lab/r3:/etc/frr"]

    # 测试客户端 
    client1: { kind: linux, image: my-pc:tooled }
    client2: { kind: linux, image: my-pc:tooled }

  links:
    # 核心三角形链路
    - endpoints: ["r1:eth1", "r2:eth1"]
    - endpoints: ["r2:eth2", "r3:eth2"]
    - endpoints: ["r3:eth3", "r1:eth3"]

    # 业务接入链路 
    - endpoints: ["client1:eth1", "r1:eth5"]
    - endpoints: ["client2:eth1", "r2:eth5"]
    - endpoints: ["client1:eth2", "r1:eth6"]
    - endpoints: ["client2:eth2", "r2:eth6"]

2. 核心逻辑:VRF 的“物理实体化”

这是 90% 的初学者会忽略的点:FRR 的 VRF 必须与内核 VRF 设备绑定

为何要在 Bash 下绑定 Port 和 VRF? FRR 的 Zebra 不会自动帮你创建三层转发实例。如果内核中没有 type vrf 设备,Zebra 就无法感知这个 VRF,导致 BGP 路由重分布静默失败

Shell 脚本:内核层初始化

创建 VRF 实体并绑定接口,确保 Zebra 激活 VPN 实例

# 在 R1 节点执行
# 1. 创建 VRF 实体设备(对应 Table 10)
ip link add vpn1 type vrf table 10
ip link set vpn1 up

# 2. 将私网接口绑定到 VRF
# 注意:不绑定,Zebra 就会显示 "vpn1 not active"
ip link set eth5 master vpn1
ip link set eth5 up

3. 核心配置:IS-IS, uSID 与 TI-LFA

3.1 IS-IS 骨干网配置

router isis 1
 is-type level-2-only
 net 49.0001.0000.0000.0001.00
 segment-routing on
 segment-routing srv6
  locator MAIN
 exit
exit

3.2 uSID 结构定义 (FRR 10.5.0+)

uSID(微段)通过压缩 SID 栈,解决了传统 SRv6 MTU 消耗过大的问题。

segment-routing
 srv6
  exit
  locators
   locator MAIN
    prefix 2001:db8:1::/48
    ! 定义微段结构:前 32 位 Block, 中间 16 位 Node ID, 16 位 Function
    format usid-f3216
   exit
   !
  exit
  !
 exit

3.3 TI-LFA 配置

不同于rLFA/LFA, SRv6 TI-LFA只需要在interface视图下使能。在ISIS 视图下不需要特殊配置。

interface eth1
 description to-R2
 ipv6 address 2001:db8:12::1/64
 ipv6 router isis 1
 isis fast-reroute ti-lfa
 isis network point-to-point
exit
!
interface eth3
 description to-R3
 ipv6 address 2001:db8:13::1/64
 ipv6 router isis 1
 isis fast-reroute ti-lfa
 isis network point-to-point
exit

4. 业务接入层:L3VPN over SRv6 核心配置拆解

在骨干网(Underlay)跑通后,如何让私网流量(Overlay)“无感”地跨越 SRv6 网络?这一步的关键在于 BGP VRF 实例与 SRv6 Locator 的深度绑定

4.1 核心配置模板

以下代码实现了将 eth5(连接客户端)的路由通过 SRv6 uSID 自动通告给远端 Peer。

! --- 1. 定义 VRF 逻辑容器 ---
vrf vpn1
 exit-vrf
!
interface eth5
 description to-Client1
 ip address 10.1.1.1/30
exit

! --- 2. 全局 BGP:建立 VPNv4 邻居与 Locator 关联 ---
router bgp 65001
 bgp router-id 1.1.1.1
 no bgp ebgp-requires-policy
 neighbor 2001:db8::2 remote-as 65001
 neighbor 2001:db8::2 update-source lo
 !
 ! 核心点:告知 BGP 协议栈,本设备的 SRv6 封装基准是 MAIN
 segment-routing srv6
  locator MAIN
 exit
 !
 address-family ipv4 vpn
  neighbor 2001:db8::2 activate
 exit-address-family
exit

! --- 3. VRF 实例 BGP:自动化 SID 分配 ---
router bgp 65001 vrf vpn1
 address-family ipv4 unicast
  redistribute connected      ! 注入 eth5 的直连路由
  label vpn export auto       ! 传统标签分配(可选,兼容性保留)
  
  ! 【核心】自动为该 VRF 的路由从 Locator MAIN 中申请 SID
  sid vpn export auto         
  
  rd vpn export 65001:1
  rt vpn both 65001:1
  export vpn
  import vpn
 exit-address-family
exit

4.2 深度解析:这些命令背后的“玄机”

作为技术大牛,你不能只看命令表面,要看透 Zebra 是如何干活的:

  • sid vpn export auto:这是整个配置的“核弹头”。它告诉 BGP:“去把那个叫做 MAIN 的 Locator 找来,根据它的 format(如 usid-f3216),自动为 vpn1 里的每一条路由生成一个 End.DT4 SID。”

  • redistribute connected:如果没有在 Bash 下把 eth5 绑定到内核 VRF 设备,这条命令会静默失效。因为 Zebra 找不到 vpn1 里的接口,就抓不到路由。

  • export vpn / import vpn:实现本地 VRF 表与全局 VPN 路由表(BGP Table)的互漏。这是构建 L3VPN 的标准动作。


5. 验证与 Log 分析:看这里才知道通没通

5.1 检查 Locator 激活状态

r1# show segment-routing srv6 locator 
Locator:
Name                 ID      Prefix                   Status
-------------------- ------- ------------------------ -------
MAIN                       1 2001:db8:1::/48          Up   # 必须是 Up,否则 BGP 不会分配 SID

r1# show segment-routing srv6 sid
 SID                Behavior    Context             Daemon/Instance    Locator    AllocationType  
 -----------------------------  ------------------  -----------------  ---------  ----------------
 2001:db8:1::       uN          -                   isis(0)            MAIN       dynamic         
 2001:db8:1:e000::  uDT4        VRF 'vpn1'          bgp(0)             MAIN       dynamic         
 2001:db8:1:e001::  uA          Interface 'eth1'    isis(0)            MAIN       dynamic         
 2001:db8:1:e002::  uA          Interface 'eth3'    isis(0)            MAIN       dynamic         

# 你应该能看到一个新的 SID 类型为 uDT4,且绑定在 vpn1 实例上。

5.2 不要急着 Ping,先看 BGP 的内功:

检查 BGP 是否真的申请到了 SID

r1# show bgp vrf vpn1 ipv4 unicast 
BGP table version is 2, local router ID is 10.1.1.1, vrf id 3
Default local pref 100, local AS 65001
Status codes:  s suppressed, d damped, h history, u unsorted, * valid, > best

     Network          Next Hop            Metric LocPrf Weight Path
 *>  10.1.1.0/30      0.0.0.0                  0         32768 ?
 *>  10.2.2.0/30      2.2.2.2@0<               0    100      0 ?

r1# show bgp vrf vpn1 ipv4 unicast 10.2.2.0
BGP routing table entry for 10.2.2.0/30, version 2
Paths: (1 available, best #1, vrf vpn1)
  Not advertised to any peer
  Imported from 65001:1:10.2.2.0/30
  Local
    2.2.2.2 from 0.0.0.0 (10.1.1.1) vrf default(0) announce-nh-self
      Origin incomplete, metric 0, localpref 100, valid, sourced, local, best (First path received)
      Extended Community: RT:65001:1
      Remote label: 917504
      Remote SID: 2001:db8:2::, sid structure=[32 16 16 0 16 48]
      Last update: Sun Jan 18 15:10:22 2026
# 如果这里出现了 SID,说明配置成功!

5.3 uSID 抓包解析:如何证明它是微段?

在 Wireshark 中观察 IPv6 目的地址:

  • 传统 SRv6:目的地址固定,报文带 SRH (Routing Header Type 4)。

  • uSID:目的地址直接形如 2001:db8:2:e002::

    • 2001:db8: Block

    • 2: Node ID (R2)

    • e002: Function (uDT4/End.DT4)

    • 关键点:报文通常 没有 SRH 扩展头,直接通过修改 IPv6 DA 实现路径引导。

5.4 TI-LFA 备份路径验证

执行 show ipv6 route 观察去往远端节点的路径,若看到 backup-nexthop,说明 TI-LFA 计算成功。

r1# show ipv6 route 2001:db8:2::/48
Routing entry for 2001:db8:2::/48
  Known via "isis", distance 115, metric 10, best
  Last update 00:09:54 ago
  Flags: Selected 
  Status: Installed 
  * fe80::a8c1:abff:fe9d:baf8, via eth1, weight 1, backup 0
      b fe80::a8c1:abff:fe92:93ff, via eth3, weight 1   # TI-LFA 算出的保护路径

5.5 TI-LFA 流量实测与抓包

  • 流量行为:在 R1-R2 链路断开瞬间,通过 mtr -6traceroute 观察,首个报文会立即重定向至 R3,延迟抖动极小。

  • uSID 抓包特征: 在 Wireshark 中观察 IPv6 目的地址:

    • 地址形态2001:db8:2:e001:eeee::(不再是固定的地址,而是压缩了路径信息的 SID)。

    • 特征没有 SRH (Routing Header Type 4)。这是 uSID 的核心优势,它直接利用 IPv6 目的地址进行转发,完全模拟传统 IP 转发效率。


6. 踩坑记录与解决方案 (Troubleshooting)

Error 1: VRF vpn1 is not active

  • 现象show vrf 显示 inactive,BGP 无法重分布直连路由。

  • 原因:Linux 内核中缺少对应的 type vrf 虚接口。

  • 解决:使用 ip link add vpn1 type vrf table <ID> 创建设备,并确保物理接口已 master vpn1

Error 2: BGP 路由带了 SID 但数据面不通

  • 现象show bgp ipv4 vpn 看到 SID,但 Ping 不通。

  • 原因:旧版本 FRR (如 8.x) 不支持 uSID 结构,或者厂商镜像(Nokia/Arista)在虚拟化环境下无法剥离 IPv6 封装头。

  • 解决

    1. 升级 FRR 到 10.5.0

    2. 验证 sid_structure=[32,16,16,0],确认微段逻辑正确。

    3. 模拟器环境弃用 Arista/Nokia 的数据面验证,转用 FRR/Linux Kernel 方案。

Error 3: 系统不分配 SID (Silent Failure)

  • 现象:配置了 sid vpn export,但路由详情里没有 SID。

  • 原因:未开启 zebra 的 SRv6 支持或 Locator 状态异常。

  • 解决:检查 show zebra srv6 locator,确保状态为 Active

Error 4: FRR 到底支持 SRv6 Policy/Flex-Algo 吗?

在本次练习中,我深度测试了基于 Color 的引流和 Flex-Algo,结论是:目前 FRR 对 SRv6 的这两项支持尚不完整

如何证明不支持?

  1. SRv6 Policy 判定

    • 即使在 pathd 中配置了 policy color 100 endpoint 2001:db8:2::,通过 show sr-te policy 查看,状态始终为 Inactive

    • 证据:日志显示 Zebra: Could not find srv6-policy。这证明 Zebra 转发面尚未实现 SRv6 Policy 的下发接口。

  2. Flex-Algo 判定

    • 在 IS-IS LSDB 中可以看到 FAD (Flex-Algo Definition) 的选举,但执行 show isis route algorithm 128 发现 IPv6 路由表为空

    • 证据:通过查看 isisd 源码或官方文档,目前 Flex-Algo 仅在 MPLS 数据面 闭环,尚未与 SRv6 Locator 逻辑解耦。


6. 资源回馈

本次实验的所有 Containerlab 拓扑模板、Initial Config 脚本已打包。 关注并私信“SRv6实战”获取:

  • usid-topo.yaml (三节点全联通拓扑)


大牛寄语:在 SRv6 的世界里,控制面(BGP/ISIS)只是表象,内核(Data Plane)才是灵魂。看透了 seg6 在内核里的行为,你就通关了。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐