Containerlab + FRR 10.5 部署 SRv6 uSID:从内核坑到全流程通关
在模拟器环境验证 SRv6,很多人会死在“数据面不通”或者“SID 不分配”上。本指南基于 FRR 10.5.0,带你绕过厂商镜像的坑,直接在 Linux 内核层通过微段(uSID)实现极致转发效率。
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 -6或traceroute观察,首个报文会立即重定向至 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 封装头。
-
解决:
-
升级 FRR 到 10.5.0。
-
验证
sid_structure=[32,16,16,0],确认微段逻辑正确。 -
模拟器环境弃用 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 的这两项支持尚不完整。
如何证明不支持?
-
SRv6 Policy 判定:
-
即使在
pathd中配置了policy color 100 endpoint 2001:db8:2::,通过show sr-te policy查看,状态始终为Inactive。 -
证据:日志显示
Zebra: Could not find srv6-policy。这证明 Zebra 转发面尚未实现 SRv6 Policy 的下发接口。
-
-
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 在内核里的行为,你就通关了。
更多推荐


所有评论(0)