第189篇:SRv6 网络编程:SID 的灵活编排
关键词:SRv6网络编程、SID函数、Service Function Chaining、策略编排、Custom Behavior、网络可编程性
一、引言
SRv6 最革命性的特性之一是"网络编程"能力。在 SR-MPLS 中,标签只是一个转发标识;而在 SRv6 中,SID 是一个 128 位的 IPv6 地址,可以编码复杂的函数逻辑和参数。这意味着每个 SID 不仅可以指定"转发到哪里",还可以指定"执行什么操作"——从简单的路由转发,到 NAT 转换、策略执行、遥测采样,甚至自定义的业务逻辑。
SRv6 网络编程将网络从静态转发基础设施转变为可编程的智能管道,为服务链(Service Function Chaining, SFC)、智能运维(Intelligent OAM)和零信任安全等应用提供了原生支撑。
二、核心概念
2.1 SRv6 网络编程模型
| 组成要素 | 说明 |
|---|---|
| SID = Locator + Function + Argument | SID 编码了执行位置(Locator)、执行函数(Function)和函数参数(Argument) |
| Segment List = 函数调用序列 | Segment List 中的每个 SID 对应一个函数调用,整体构成一个"函数链" |
| Behavior = 函数实现 | 节点上实现的函数逻辑(标准行为或自定义行为) |
| Programmable Network | 网络本身成为可编程平台,无需部署额外控制设备 |

2.2 SID 函数类型
| 函数类型 | 示例 SID | 功能 |
|---|---|---|
| 路由转发 | Node-SID, Adj-SID | 标准 IPv6 转发 |
| 终结转发 | End.X SID | 弹出 SRH,跨域转发 |
| 协议翻译 | End.T SID | IPv6 到 IPv4 翻译(NAT64) |
| 策略执行 | Custom SID | 访问控制、流量整形 |
| 遥测采样 | Custom SID | In-band Network Telemetry(INT) |
| 镜像复制 | Custom SID | 报文镜像到监控设备 |
| 加密/解密 | Custom SID | IPsec 加解密 |
2.3 服务链(Service Function Chaining)
服务链是 SRv6 网络编程的典型应用,将多个网络服务按顺序串联:
| 服务链场景 | SID 链 | 说明 |
|---|---|---|
| 安全检测 | [FW-SID, IPS-SID, AV-SID, Exit-SID] | 防火墙→入侵防御→杀毒→出口 |
| 流量优化 | [Cache-SID, CDN-SID, Exit-SID] | 缓存→CDN→出口 |
| 云网融合 | [LB-SID, WAF-SID, App-SID, Exit-SID] | 负载均衡→WAF→应用服务器→出口 |

2.4 SID 参数(Argument)的用法
SID 的 Argument 部分可用于传递函数参数:
| 参数类型 | 编码方式 | 示例 |
|---|---|---|
| 接口索引 | Function Argument 低 16 位 | SID::8001(出接口索引=1) |
| VNI 标识 | Function Argument 高 24 位 | SID::1:0:1000(VNI=1000) |
| 策略标识 | Function Argument 全字段 | SID::2:0x1(策略ID=1) |
| 颜色标记 | Function Argument 指定字节 | SID::3:Color(TE颜色) |
三、技术细节
3.1 SRv6 Custom Behavior(自定义行为)
| 步骤 | 说明 |
|---|---|
| 1. 定义 SID | 分配自定义 SID 地址 |
| 2. 实现函数逻辑 | 在节点上部署自定义行为处理程序 |
| 3. 绑定 SID | 将 SID 与自定义行为关联 |
| 4. 发布 SID | 通过 IGP/BGP 通告 SID |
| 5. 编排路径 | 在 Segment List 中引用自定义 SID |
3.2 In-band Network Telemetry(INT)
INT 是 SRv6 网络编程的重要应用,通过在 SID 中嵌入遥测函数,实现路径上每跳的数据采集:
| INT 采集项 | 说明 |
|---|---|
| 入/出时间戳 | 精确到纳秒的报文处理时间 |
| 队列深度 | 报文在队列中的等待长度 |
| 接口利用率 | 当前接口的带宽利用率 |
| 丢包计数 | 当前接口的丢包统计 |
| 标签/SID 栈 | 报文经过时的完整标签栈 |

3.3 SRv6 SID 地址规划
| 地址段 | Function ID 范围 | 用途 |
|---|---|---|
| Locator::0-255 | 0~255 | Node-SID(End) |
| Locator::256-1023 | 256~1023 | SID with Argument |
| Locator::1024-2047 | 1024~2047 | BGP Prefix-SID |
| Locator::2048-4095 | 2048~4095 | Adj-SID(End) |
| Locator::4096-8191 | 4096~8191 | 自定义函数 |
| Locator::8192-16383 | 8192~16383 | 遥测 INT |
| Locator::16384-65535 | 16384~65535 | 预留 |
3.4 网络编程安全考虑
| 安全风险 | 应对措施 |
|---|---|
| SID 劫持 | SID 前缀认证(BGP Origin Validation) |
| 函数注入 | 自定义行为白名单机制 |
| SID 重放攻击 | SRH 中的 Flags 位和 Timestamp 校验 |
| 资源耗尽 | SID 处理速率限制 |
四、实战配置/案例分析
4.1 服务链 SID 配置
# ========== 防火墙节点配置(SID=FW-SID) ==========
[ Firewall-Node ] srv6
[ Firewall-Node-srv6 ] sid 2001:DB8:5000::1000 behavior End
[ Firewall-Node-srv6-sid-2001:DB8:5000::1000 ] locator SFC-LOC
[ Firewall-Node-srv6-sid-2001:DB8:5000::1000 ] commit
# ========== IPS节点配置(SID=IPS-SID) ==========
[ IPS-Node ] srv6
[ IPS-Node-srv6 ] sid 2001:DB8:5000::2000 behavior End
[ IPS-Node-srv6-sid-2001:DB8:5000::2000 ] locator SFC-LOC
[ IPS-Node-srv6-sid-2001:DB8:5000::2000 ] commit
# ========== 出口节点配置(SID=Exit-SID) ==========
[ Exit-Gateway ] srv6
[ Exit-Gateway-srv6 ] sid 2001:DB8:5000::3000 behavior End.X
[ Exit-Gateway-srv6-sid-2001:DB8:5000::3000 ] locator SFC-LOC
[ Exit-Gateway-srv6-sid-2001:DB8:5000::3000 ] commit
4.2 服务链 TE Policy 配置
# ========== Head-End: 创建服务链TE Policy ==========
[ Head-End ] srv6 te-policy color 20001 endpoint 2001:DB8:5000::3000
[ Head-End-srv6-te-policy-20001 ] color 20001
[ Head-End-srv6-te-policy-20001 ] endpoint 2001:DB8:5000::3000
# --- 显式路径: 防火墙→IPS→出口 ---
[ Head-End-srv6-te-policy-20001 ] candidate-path 10
[ Head-End-srv6-te-policy-20001-cpath-10 ] explicit-path
[ Head-End-srv6-te-policy-20001-cpath-10-explicit-path ] \
nexthop 2001:DB8:5000::1000
# SID1: 防火墙(策略执行)
[ Head-End-srv6-te-policy-20001-cpath-10-explicit-path ] \
nexthop 2001:DB8:5000::2000
# SID2: IPS(入侵检测)
[ Head-End-srv6-te-policy-20001-cpath-10-explicit-path ] \
nexthop 2001:DB8:5000::3000
# SID3: 出口网关(End.X,终结SRv6)
[ Head-End-srv6-te-policy-20001 ] commit
# ========== 绑定业务流量 ==========
[ Head-End ] acl ipv6 number 6002
[ Head-End-acl6-ipv6-6002 ] rule 5 permit ipv6 destination 2001:DB8:CAFE::/48
[ Head-End ] route-policy SFC-CHAIN permit node 10
[ Head-End-route-policy-SFC-CHAIN-10 ] if-match acl 6002
[ Head-End-route-policy-SFC-CHAIN-10 ] apply srv6-te-policy color 20001
4.3 故障排查:服务链中节点不可达
故障场景:服务链中 IPS 节点不可达,流量在防火墙节点后中断。
# Step 1: 检查TE Policy状态
<Head-End> display srv6 te-policy color 20001
Color: 20001
Endpoint: 2001:DB8:5000::3000
State: Inactive
Active-Path: None
# Step 2: 检查显式路径可达性
<Head-End> display ipv6 routing-table 2001:DB8:5000::2000
# 无路由! IPS节点的SID不可达
# Step 3: 检查IPS节点SID配置
<IPS-Node> display srv6 sid
# SID未显示!
# 根因: IPS节点的commit未执行
# Step 4: 修正IPS节点
[IPS-Node-srv6-sid-2001:DB8:5000::2000] commit
# 提交SID配置
# Step 5: 检查IGP通告
<IPS-Node> display isis lsdb verbose | include SRv6
# IPS节点的SRv6 SID TLV出现在LSP中
# Step 6: 验证Head-End路由
<Head-End> display ipv6 routing-table 2001:DB8:5000::2000
Destination: 2001:DB8:5000::2000/128
Protocol: IS-IS
NextHop: 2001:DB8:FEED::5
# Step 7: 验证TE Policy
<Head-End> display srv6 te-policy color 20001
State: Active
Segment-List:
2001:DB8:5000::1000 (防火墙)
2001:DB8:5000::2000 (IPS)
2001:DB8:5000::3000 (出口)
# 服务链路径激活
五、总结
| 项目 | 要点 |
|---|---|
| 网络编程核心 | SID = Locator + Function + Argument,每个 SID 是一个函数调用 |
| 服务链 | 多个 SID 串联形成服务链,实现防火墙→IPS→出口的连续处理 |
| INT 遥测 | 通过 SID 嵌入遥测函数,实现路径上每跳的数据采集 |
| SID 规划 | 按 Function ID 范围区分不同用途(Node-SID、Adj-SID、自定义函数等) |
| 安全性 | SID 劫持防护、行为白名单、SRH 完整性校验 |
| 可编程性 | 网络从静态转发变为可编程管道,无需额外控制设备 |
思考
- SRv6 SID 的 Function Argument 字段可以用来传递参数。如果 Argument 需要传递 64 位的数据(如 MAC 地址),如何编码?
- 服务链中如果某个中间节点(如 IPS)故障宕机,流量是否会在该节点中断?SRv6 有什么机制保证服务链的可靠性?
- INT 遥测通过在 SRH 中累积每跳数据实现。如果路径上有 20 个 INT 节点,SRH 的大小会增长到多少?是否会影响报文传输?
下篇预告:第190篇:SRv6 与 EVPN 的深度融合