第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 网络本身成为可编程平台,无需部署额外控制设备

SRv6 网络编程模型 - 图示

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→应用服务器→出口

服务链(Service Function Chaining) - 图示

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 栈 报文经过时的完整标签栈

In-band Network Telemetry(INT) - 图示

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 完整性校验
可编程性 网络从静态转发变为可编程管道,无需额外控制设备

思考

  1. SRv6 SID 的 Function Argument 字段可以用来传递参数。如果 Argument 需要传递 64 位的数据(如 MAC 地址),如何编码?
  2. 服务链中如果某个中间节点(如 IPS)故障宕机,流量是否会在该节点中断?SRv6 有什么机制保证服务链的可靠性?
  3. INT 遥测通过在 SRH 中累积每跳数据实现。如果路径上有 20 个 INT 节点,SRH 的大小会增长到多少?是否会影响报文传输?

下篇预告:第190篇:SRv6 与 EVPN 的深度融合