前言
为什么要有MPLS TE和SRv6技术?
传统网络基于IGP和BGP等协议,基于路由优先级、链路开销值、队列优先级等信息转发流量,遵循“最短路径优先算法(SPF)”;
这种方式使流量的转发不能灵活的选路,例如
假设每条链路的Metric值相同,由于最短路径优先原则,流量走G设备转发,在不修改开销Metric的前提下,最短路径优先不能使流量从D、E设备转发。
流量工程 TE技术解决了这个问题,流量可以根据管理员定义的路径转发,不再局限于最短路径优先。
流量工程有三个技术,后者是前者的优化
基于RSVP协议的流量工程:在IGP协议的基础上允许RSVP协议交换链路的信息,使管理员可以在头节点配置流量工程。
最初的流量工程,配置复杂,维护困难,性能占用高,相比后两者技术几乎没有优点。
基于RSVP协议的MPLS TE:RVSP交互信息后,使用MPLS 完成流量工程的选路和转发。
引用MPLS解决了基于IGP的缺点,并可以跨域,但仍然存在配置复杂维护困难的问题。
SR-MPLS TE: 抛弃RSVP协议,引用段路由SR技术再MPLS头节点封装多个标签实现TE。
目前IPv4网使用的TE技术,配置和维护难度大幅降低。
SRv6 TE:基于IPv6网络的实现的TE,借助IPv6网络的特性,是现阶段最优的TE技术
SR-MPLS TE和SRv6 TE手动配置流量的选路实际还是较为麻烦,主流的做法是使用SDN 控制器下发TE Policy 减少人工配置工作并统一管理。
SR(Segment Routing,段路由)采用源节点路径选择机制,预先在源节点封装好路径所要经过段的SID(Segment Identifier,段标识),当报文经过SR节点时,该节点根据报文的SID对报文进行转发。除源节点外,其它节点无需维护路径状态
由于没有SDN控制器环境,本篇不提及这种方式
本篇实验均基于华三 HCL 模拟器5.10.4版本实现
SRv6基本概念
SRv6是指在IPv6网络中使用SR、将IPv6地址作为SID对报文进行转发。
设备角色
同MPLS类似,根据设备在网络中的功能不通,SRv6网络设备分为三个角色:
- 源节点:负责在IPv6报文的IPv6头中插入SRH扩展头,或者在报文外加上IPv6头并插入SRH扩展头。该节点将报文流引入SRH中Segment List定义的SRv6路径。
- 如果Segment List中只包含一个SID,并且不需要在SRH中携带信息或TLV,则只需要将IPv6头的目的地址设置为这个SID,不需要插入SRH。
- 如果Segment List中包含多个SID,则需要插入SRH。
- 中转节点:在报文的SRv6路径上,不参与SRv6处理,只执行普通的IPv6报文转发。中转节点可以是支持SRv6的节点,也可以是不支持SRv6的节点。
- Endpoint节点:对接收到的SRv6报文进行SRv6相关处理。接收到的SRv6报文的IPv6目的地址必须是Endpoint节点上配置的SRv6 SID,该节点需要按SRv6 SID的指令进行处理,并更新SRH。
同一台设备可以担任多个角色。
SID概念
SID
SRv6的 SID相比SR-MPLS TE,除了可以标识某个设备或者某个链路外,还可以代表某种转发动作。
SID由四个部分组成,最终以一个IPv6地址的形式体现:
Locator:标识SID所属的网段。
SID在定义完成后,SRv6网络节点设备会通过IGP\BGP协议将Locator作为IPv6的一个网段发布给其他节点,对非SRv6节点的设备而言其就是一个IPv6的网段。
Function:函数字段,用于标识SID在SRv6节点上的动作。
当SRv6节点设备收到SRv6报文时,如果SID在这台设备上,就会根据Function字段查询local-sid表,按设备本地配置的动作对报文进行处理。
例如配置:opcode 101 end-x interface A;
意为:如果Function字段是101,那么将报文从接口A转发。
Arguments:可选字段,定义报文的流和服务等信息。
MBZ(Must be zero):补位字段,SID必须和IPv6地址一样为128bits,当字段之和小于128bits时,使用0补齐。
Function 又分为动态位和静态位两部分,这两部分的长度由管理员配置时定义:
- Dynamic:动态位。划分给路由协议动态生成SID的地址空间,最小的动态位值 = 最大静态位 + 1,一个SID动态位可以不存在。(动态位不为0即为动态SID)
- Static:静态位。划分给管理员手动配置SID的地址空间,值 = 0 到 最小动态位 - 1。(即静态SID动态位全零)
动态位和静态位的值体现在二进制比较容易理解:
# 创建一个Locator
locator 1 ipv6-prefix 100:: 64 static 32
这条配置的意思为创建一个Locator 为100::/64的SID,其中静态位占32bit,此时动态位长度 = 128 - 64(Locator长度/前缀长度) - 32 (静态位) = 32。
所以100::1是动态位全0,静态位为1的静态SID,100::1:0:0 是动态位为1,静态位为0的最小动态SID。
如果想创建一个不存在动态位,完全静态手工配置的SID,配置为:
locator 1 ipv6-prefix 100:: 120 static 8
如上,前缀 + 静态位 = 128,这个SID不存在动态位。
G-SID
上述SID是正常情况下普通的SID,由于一个正常状态的SID长128bit,在TE隧道定义的SRv6节点较多时,容易出现封装过多SID导致报文数据分片过小的问题。
G-SID的作用就在于优化SRv6报文SRH包头的长度。
G-SID又分为两种:
coc32类型的G-SID:
如图,由于IPv6网络中IPv6前缀往往会有重复,G-SID就是将Locator中IPv6前缀重复的部分提取出来,作为Block字段(Common prefix)单独封装在前面,后面变化部分生成一个长32bit的SID。
- Node ID:提供Common prefix后剩余的变化位数。
- Dynamic:Function 动态位。
- Static:Function 静态位。
这三个字段合称G-SID。
# 定义coc-32类型的G-SID
locator 1 ipv6-prefix 100:: 64 common-prefix 48 coc32 static 8 args 16
前缀100::/64, 前缀重复段长度48bit(Node ID长 64-48 = 16bit), 静态位8bit, 动态位 32-16-8 = 8bit
coc32类型的Locator可以分配带COC标记的SRv6 SID(即End(COC32) SID、End.X(COC32) SID)和不带COC标记的普通SRv6 SID。这些SRv6 SID既可以在静态段内手工指定,也可以通过IGP协议在动态段内自动分配。
coc-both类型的G-SID:
coc-both类型的G-SID是对coc-32类型G-SID的Function 段再细分的结果。
Block和Node ID保持coc-32类型的结果不变,对于Dynamic和Static根据其是否压缩,又分为压缩的SID(C-SID)和非压缩的SID(NC-SID)。
压缩段完全继承了coc32类型的Locator的功能,非压缩段的范围内只能用于分配不带COC附加行为的普通类型SID。
Node ID 和压缩段组成32bit的G-SID
# 定义coc-both 类型的G-SID
locator 1 ipv6-prefix 100:: 64 common-prefix 48 coc-both non-compress-static 16 static 8
前缀100::/64,Node ID = 64-48 = 16bit, 压缩段静态16bit, 压缩段动态32-16=16bit,非压缩段静态8bit
G-SID报文转发
由于SID最终是以IPv6地址的形式封装在SRH中,实际报文转发时,为准确定位G-SID,需要在原本封装128-bit SRv6 SID的位置封装4个32-bit G-SID(4 * 32 = 128),不足4个则需要用0补齐。
128bit的G-SID称为一组G-SID,多个连续的G-SID组成一段压缩路径,称为G-SID List。
G-SID会将目的地址的最低两位会作为SI(SID index)用于定位G-SID,取值为0~3。每经过一个对SID进行压缩的节点,SI值减1,如果SI值为0,则将SL值减1。
G-SID不能为报文转发的第一个SID(SRH封装的最后一个SID)
如果报文前一个SID是G-SID,则后一个SID需要COC置位,以下是一个包含G-SID的SRH报头。
实际转发时无论是coc-32类型还是coc-both类型,SRH中只封装G-SID部分,其余部分留在设备本地(Common Prefix、args等字段)。
当SRv6节点需要封装的IPv6目的地址为G-SID时,根据本地配置信息对G-SID进行拼接,如下图。
Common Prefix:公共前缀,由管理员手工配置。
G-SID:按照32比特进行压缩的SID,从SRH中获取。
SI(SID Index):用于在一组G-SID中定位G-SID。SI为目的地址的最低两位,取值为0~3。
每经过一个对SID进行压缩的节点,SI值减1,如果SI值为0,则将SL值减1。
在Segment List的一组G-SID中,G-SID按照SI从小到大的顺序从左到右依次排列,即最左侧的G-SID的SI为0,最右侧的G-SID的SI为3。
0:若Common Prefix、G-SID和SI的位数之和不足128比特,则中间位使用0补齐。
PD类型的Locator
借助DHCPv6 PD方式来获取IPv6地址前缀,并将这个地址前缀作为CPE的SRv6 Locator的SID称为PD
PD类型的SID格式如图,仅用于静态分配End.DX2 SID,不支持分配任何其他类型的SID,也不支持动态分配SID。
该SID用于EVPN VPWS over SRv6方式接入业务网关场景。
Function转发动作
SID的Function字段所标识的本地操作指令本质上是一种指导报文转发和处理的节点行为,该行为由RFC 8986定义,配置时需要将具体的SID绑定给该行为,常用的行为如下:
- End SID:用于标识网络中的某个目的地址前缀。
- End.X SID:用于标识网络中的某条链路。
- End.DT4 SID:类似于MPLS L3VPN网络中的私网标签,用于标识特定的IPv4 VPN实例。End.DT4 SID的转发行为是解封装报文,并且查找该SID标识的IPv4 VPN实例,根据VPN实例路由表转发报文。End.DT4 SID用于IPv4私网用户接入场景。
- End.DT6 SID:类似于MPLS L3VPN网络中的私网标签,用于标识特定的IPv6 VPN实例。End.DT6 SID的转发行为是解封装报文,并且查找该SID标识的IPv6 VPN实例,根据VPN实例路由表转发报文。End.DT6 SID用于IPv6私网用户接入场景。
- End.DT46 SID:类似于MPLS L3VPN网络中的私网标签,用于标识特定的IPv4 VPN实例或IPv6 VPN实例。End.DT46 SID用于IPv4和IPv6私网用户同时接入场景。
- End.DX4 SID:用于标识网络中特定IPv4 VPN实例中PE-CE的某个IPv4下一跳。End.DX4 SID对应的转发动作是解封装报文,并且将解封后的IPv4报文通过该SID绑定的三层接口转发给特定下一跳。End.DX4 SID用于IPv4私网用户接入场景。
- End.DX6 SID:用于标识网络中特定IPv6 VPN实例中PE-CE的某个IPv6下一跳。End.DX6 SID对应的转发动作是解封装报文,并且将解封后的IPv6报文通过该SID绑定的三层接口转发给特定下一跳。End.DX6 SID用于IPv6私网用户接入场景。
- End.DX2 SID:End.DX2 SID表示EVPN VPWS over SRv6场景的二层交叉连接,用于标识一个端点。End.DX2 SID对应的转发动作是解封装SRv6报文,再将剩余二层报文转发到SID对应的出接口。
具体命名含义为如图:
此外还有附加行为:
详细的节点行为参考厂商文档,H3C文档位置:https://www.h3c.com/cn/d_202410/2281476_30005_0.htm#_Toc179381830 – 节点行为。
SID配置
# SID配置示例:
segment-routing ipv6 # 进入SRv6视图
locator 1 ipv6-prefix 100:: 64 static 32 # 创建SID
opcode 1 end-dt6 vpn-instance srvpn # SID 100::1 转发动作为解封装后查srvpn 实例ipv6路由表
opcode 10 end psp # SID 100::10 转发动作为再倒数第二个End节点移除SRH, End代表到设备本身
SRv6报文与报文处理流程
SRv6报文格式如下图,其是在原始报文头外新封装 SRH头和IPv6头,SRH头记录SID信息,报文以IPv6的形式在网络中转发
SRH头字段解释如下:
- Next Header:8bits,用来标识下一个报文头的类型。
- Hdr Ext Len:8bits,表示以8个字节为单位的SRH头的长度,不包括第一个8个字节。
- Routing Type:8bits,路由类型字段,取值为4,表示携带的是SRH。
- Segments Left:8bits,标识剩余未处理的SID的个数,初始取值为n-1(n表示路由扩展头中SID的数目),每经过一个节点减1。
- Last Entry:8bits,SRH头中报文实际转发路径的第一个SID的编号。
- Flags:8bits,标志位信息。
- Tag:16bits,用来标记具有相同特性的一组报文。
- Segment List:SID列表。按照报文转发路径上节点从远到近的顺序进行排列,即Segment List [0]表示路径的最后一个SID,Segment List [1]表示路径的倒数第二个SID,以此类推。
报文转发时,对于只有一个SID的BE隧道,直接将路由条目携带的SID封装为IPv6的目的地址发送,不封装SRH。
对于有多个SID的TE隧道,如果路由条目有携带SID,先将路由条目携带的SID封装为Segment List中倒数第一个SID,然后查SRv6转发表封装Segment List形成SRH头。
如下图,BGP路由携带标签为400::1,SRv6转发表为300::1,400::A,所以最终的SID List为:400::1 400::A 300::1
。
SR-MPLS 和SRv6都有BE和TE的概念
BE和TE的区别:
BE(Best Effort):尽力而为的转发,使用 IGP(如 OSPFv3、IS-IS)计算的 最短路径优先(SPF) 算法,自动选择最小开销路径封装对应SID转发。
- 由于SID是基于最短路径优先的选择,SID List只有一个 SID,所以封装时直接将该SID封装为目的IPv6地址,不封装SRH头。
TE(Traffic Engineering):流量工程,通过 SID 列表(Segment List) 强制指定流量路径。
IPv6 头目的地址为Segments Left(简写SL)指定的SID,初始为最后一跳,每从一个SRv6节点发出,SL字段减1,IPv6 目的地址变换一次。
直到某一SRv6节点收到SL=0的报文,认为SID List全部遍历完毕,SRv6报文解封装按指定节点动作转发。
将流量引入SRv6隧道
将流量引入隧道的方法有静态路由、IGP自动发布(自引流)、QoS策略引流、策略路由、隧道策略引流、Flowspec引流、基于BSID、基于Color、基于DSCP、基于APN ID、基于CBTS多种类型。
SRv6隧道有两种配置方式:配置Tunnel 接口、配置TE Policy/BGP协议动态生成。
其中基于BSID、基于Color、基于DSCP、基于APN ID、基于CBTS都是仅TE Policy支持的方式。
BGP协议动态生成的隧道一般无需手动引流。
这里仅静态路由引流和IGP自动发布为例。
静态路由引流:
配置Tunnel并引流入隧道:
有两种方式 # 通过配置Tunnel接口发布静态路由 interface Tunnel0 mode sr ipv6 source LoopBack0 tunnel route-static preference 10 # 发布静态路由,优先级为10 destination 5::9 tunnel sid-list 1 ipv6 address 6::6/64 # 静态路由指定去往99::/64的路由下一跳为Tunnel0 ipv6 route-static 99:: 64 Tunnel0
使用HCL模拟器5.10.4版本配置时注意:VSR88设备不支持Tunnel方式的SRv6隧道,MSR36-20设备配置后可以生成表项但无法互通
TE Policy必须使用VSR88设备,MSR 可以生成表项但无法ping通
TE Policy 静态路由引流:
# 配置SRv6 TE Policy segment-routing ipv6 ... policy 1 binding-sid ipv6 100::2 color 10 end-point ipv6 4::4 candidate-paths preference 10 explicit segment-list 1 # 静态路由指定去往99::1/128的路由下一跳为srv6-policy隧道, color 10, 尾节点 4::4 ipv6 route-static 99::1 128 srv6-policy color 10 end-point ipv6 4::4
IGP自动发布有两种方式:
IGP Shortcut:也称为自动路由宣告(AutoRoute Announce),自动路由发布是指将SRv6 TE Policy/ Tunnel隧道发布到IGP(OSPFv3或IS-IS)路由中,让隧道参与IGP路由的计算,使得流量可以通过隧道转发。
IGP Shortcut功能不会通过IGP路由协议将SRv6隧道作为一条链路发布出去,只有开启IGP Shortcut功能的头节点计算IGP路由时会考虑SRv6隧道。其他设备在路由计算时不会考虑SRv6隧道。
# Tunnel 开启Shortcut 进入模式为SRv6隧道的Tunnel接口视图。 interface tunnel tunnel-number mode sr ipv6 开启IGP Shortcut功能。 srv6 igp shortcut [ isis | ospf ] # 开启SRv6 TE Policy的自动引流功能。 segment-routing ipv6 traffic-engineering policy srv6policy 开启自动引流功能 autoroute enable [ isis | ospfv3 ]
Tunnel 和Policy方式均支持自动路由宣告
转发邻接:该功能将SRv6隧道当作一条直接连接隧道Ingress节点和Egress节点的链路,通过IGP路由协议将该链路发布到网络中,以便网络中的节点在路由计算时使用SRv6隧道。
在隧道的头节点上开启转发邻接功能后,Ingress节点会通过IGP路由协议将SRv6隧道作为一条链路发布出去。IGP网络中的所有设备在路由计算时都会考虑SRv6隧道。
Policy方式明确说明不支持转发邻接,Tunnel 方式文档没有针对该方式的说明和配置,初步认为暂不支持。
SRv6 TE Policy
SRv6 TE有两种隧道创建方式,Tunnel和TE Policy。
- SRv6 Tunnel:基于 静态配置 或 PCE 计算 的显式路径,并通过Tunnel 接口承载流量;
- 一般用于点对点场景的简单网络,每新增一条隧道需单独配置,大规模网络中配置复杂。
- 仅支持固定路径,缺乏动态调整能力(如基于带宽、时延的实时优化)。
- 路径故障时需人工调整 SID 列表,无法自动切换备用路径。
- SRv6 TE Policy:基于 策略(Color, Endpoint, Preference) 的动态路径选择,支持多候选路径和优先级。
- 通过 Color 标识业务类型,Endpoint 标识目标节点,支持多路径动态选择。
- 动态路径计算通常需控制器参与,架构较为复杂,学习理解较Tunnel 困难。
SRv6 Tunnel | SRv6 TE Policy | |
---|---|---|
配置复杂度 | 低(直接配置 SID 列表) | 高(需定义策略、Color、候选路径) |
路径控制粒度 | 固定显式路径 | 动态策略驱动(支持多路径、优先级) |
扩展性 | 差(每隧道独立配置) | 优(策略可批量下发,适应大规模网络) |
自动化能力 | 弱(依赖手动调整) | 强(与控制器集成,支持动态优化) |
故障恢复 | 依赖 IGP 收敛或手动切换 | 自动主备切换(TI-LFA、动态备份路径) |
适用场景 | 简单 P2P 连接、传统网络迁移 | 复杂业务调度、云网协同、5G 切片 |
资源利用率 | 低(路径固定,无法动态优化) | 高(基于实时状态选择最优路径) |
业务分级支持 | 无 | 支持(通过 Color 标识不同业务类型 |
综上,Policy 是目前主流的TE 配置方式。
TE Policy 基本概念
一个完整的TE Policy 由三部分组成:
Headend:SRv6 TE Policy的头节点。
Color:颜色或者说流量标识,用来与关联实际业务属性和流量。
例如可以配置时延需求小于10ms的业务对应通过Color属性为100的SRv6 TE Policy转发。
End-point:标识SRv6 TE Policy的目的节点,是SRv6 TE Policy目的节点的IP地址。
头节点、颜色、尾节点唯一标识一个Policy,在同一个头节点上,仅需Color和End-point即可唯一标识一个SRv6 TE Policy。
按SRv6 Policy配置层次,可以将一个Policy 分为如下图的三级:
如图,一个Policy 中可以配置多条候选路径,不同候选路径需要配置不同的优先级(Preference)。
每个候选路径下可以配置多个SID List,不同SID List 之间配置不同的权重(Weight),一个SID List就代表一条转发路径。
候选路径:SRv6流量转发的路径。
转发流量时,选择优先级(Preference)最高的候选路径作为主路径。
一个SRv6 TE Policy包含一条或多条候选路径,不同SRv6 TE Policy不能共享同一条候选路径。
<Protocol-origin,Originator,Discriminator>
唯一标识一条候选路径;Protocol-origin
:8bit的数值,表示候选路径通过何种协议或方式生成。例如,候选路径可以通过PCEP或BGP IPv6 SR Policy地址族协议动态生成,也可以通过命令行或NETCONF方式静态配置的。
Originator
:表示生成这条候选路径的节点,是一个由4字节的自治系统号(ASN)和16字节的节点地址拼接形成的160位数值。Discriminator
:是一个32bit的编号值,用于在Protocol-origin和Originator确定的情况下,标识和区分候选路径。
可以通过
dis segment-routing ipv6 te policy
查看隧道详情。SID列表:包含报文转发路径信息,由转发路径上各个节点的SID(IPv6地址)组成。
候选路径由一个SID列表或者多个带权重的SID列表组成。SRv6 TE Policy选择某条候选路径后,会根据SID列表的权重,在候选路径的多个SID列表间进行负载分担。
TE Policy 引流
TE Policy 创建成功后可以通过多种方式进行引流。
基于BSID引流:接收到的报文的目的IPv6地址为某个SRv6 TE Policy的BSID,则通过该SRv6 TE Policy转发该报文。
通过在某个SRv6 TE Policy的SID列表中加入另一个SRv6 TE Policy的BSID,可以在流量转发过程中减少报文SRH头的长度,实现不同SRv6 TE Policy之间的缝接。
BSID:BSID是 SRv6 TE Policy 头节点定义的一个特殊SID,通过BSID、Color和Endpoint可以唯一标识一个SRv6 TE Policy。
Policy 组中必须手动配置,Policy中仅配置Color和Endpoint时,SRv6 TE Policy会自动申请一个BSID。
BSID 转发动作为
End.B6ENCAPS
;基于Color 引流:头节点上Color和Endpoint地址可以唯一标识一个TE Policy ,可以用于引流到隧道。
例如使用静态路由通过Color 引流到TE Policy:
ipv6 route-static vpn-instance srvpn 222:: 96 srv6-policy color 10 end-point ipv6 4::4
基于DSCP引流:多个Color属性不同的但Endpoint地址相同的SRv6 TE Policy 组成SRv6 TE Policy组,配置DSCP和Color的映射关系后,引入Policy的流量匹配Color转发。
DSCP引流控制流量转发到SR后走哪个Policy,不控制怎么转发上SRv6 TE Policy。
隧道策略:隧道策略可以调整报文匹配的优先级,使报文优先匹配隧道转发。
tunnel-policy 1 binding-destination 222:: srv6-policy end-point ipv6 4::4 color 10 绑定目的地址为222::的流量从SRv6隧道转发,color 10,ned-point 4:4
自动路由宣告(自引流)同Tunnel场景引流,APN ID引流、CBTS引流没有实验资源这里不做说明。
TE Policy 流量转发
由于TE Policy 是Policy - 候选路径 - SID List 三级结构,头节点流量转发到TE Policy后处理如下:
在SRv6 TE Policy中选择优先级取值最大的有效候选路径转发流量。
根据候选路径SID List 权重对流量负载分担,每个List 转发流量的比例为:
Weight x/(Weight 1+Weight 2+…+Weight n)
。例如List A 权重20,List B权重 80,则20%的流量负载到A,80%的流量负载到B。
如下图,1/5的流量走SID List1, 4/5的流量走List 2。
SRv6 TE Policy中的报文支持Encaps和Insert封装方式。
- Encaps封装方式是指在原始报文外层再封装新的IPv6头和SRH扩展头;
- Insert封装方式则是在原始报文IPv6头之后插入SRH扩展头。
Encaps封装方式的SRv6 TE Policy报文转发
如图,流量从TE Policy 转发到C时,由于目的地址为C设备TE Policy B的BSID,C设备查询Function为Encaps,C在原有SRv6的IPv6之上多封装一层TE Policy B的IPv6头和SRH头。
C设备BSID配置
segment-routing ipv6 # 进入SRv6试图
traffic-engineering # 进入TE试图
policy 1 # 创建policy 1
binding-sid ipv6 100::2 # 指定Policy BSID为100::2(缺省封装方式为Encaps)
官网对这个过程的详细解释如下:
- Device A将流量引入到SRv6 TE Policy A转发。SRv6 TE Policy A的SID中引入了SRv6 TE Policy B的BSID 20::2。根据SRv6 TE Policy A为报文封装SRH头,SRH头携带的SID列表为{10::2, 20::2, 50::2}。其中,10::2为Device B的End SID;50::2为Device F的End SID。
- Device A将封装后的报文发送给下一跳Device B。
- Device B收到报文后,根据SRH获取到下一跳为Device C,将报文发送给Device C。
- Device C收到报文后发现报文的目的地址为20::2,为本地SRv6 TE Policy B的BSID。SRv6 TE Policy B的封装方式为Encaps模式。因此Device C根据SRv6 TE Policy B为报文再封装一个外层IPv6头和SRH,SRH头携带的SID列表为{30::2, 40::2}。其中,30::2为Device D的End SID;40::2为Device E的End SID。外层IPv6头的目的地址更新为30::2,下一跳为Device D,将报文发送给Device D。
- Device D收到报文后,根据外层SRH获取到下一跳为Device E,将报文发送给Device E。
- Device E收到报文后,检查外层SRH头中的SL值,发现SL=0。对报文的外层IPv6头和SRH头进行解封装,删除封装报文头,再根据内层报文的目的地址将报文发送给Device F。
- Device F收到报文后,检查外层SRH头中的SL值,发现SL=0,Device F是SRv6 TE Policy A的尾节点,对报文的外层IPv6头和SRH头进行解封装,删除封装报文头。
Insert封装方式的SRv6 TE Policy报文转发
和Encaps封装不同,Insert 封装是在C设备收到SID为TE Policy B的BSID后查询Function为Insert,C设备在原有SRv6头的IPv6报文头下多封装一个属于TE B的SRH,并修改SRv6的IPv6报文头目的地址为TE B SRH的下一跳SID发出。
C设备BSID配置
segment-routing ipv6 # 进入SRv6试图
traffic-engineering # 进入TE试图
srv6-policy encapsulation-mode insert # 配置封装模式为Insert
policy 1 # 创建policy 1
binding-sid ipv6 100::2 # 指定Policy BSID为100::2(缺省封装方式为Encaps)
模拟器VSR88只支持Encaps模式。
官网对Insert 转发过程描述如下:
- Device A将流量引入到SRv6 TE Policy A转发。为了减少SRH封装的长度,SRv6 TE Policy A的SID中引入了SRv6 TE Policy B的BSID 20::2。根据SRv6 TE Policy A为报文封装SRH头,SRH头携带的SID列表为{10::2, 20::2, 50::2}。其中,10::2为Device B的End SID;50::2为Device F的End SID。
- Device A将封装后的报文发送给下一跳Device B。
- Device B收到报文后,根据SRH获取到下一跳为Device C,将报文发送给Device C。
- Device C收到报文后发现报文的目的地址为20::2,为本地SRv6 TE Policy B的BSID,SRv6 TE Policy B的封装方式为Insert模式,因此Device C根据SRv6 TE Policy B在原始IPv6报文头后插入SRH,SRH头携带的SID列表为{30::2, 40::2}。其中,30::2为Device D的End SID;40::2为Device E的End SID。外层IPv6头的目的地址更新为30::2,下一跳为Device D,将报文发送给Device D。
- Device D收到报文后,根据外层SRH获取到下一跳为Device E,将报文发送给Device E。
- Device E收到报文后,检查外层SRH头中的SL值,发现SL=0。对报文的外层SRH头进行解封装,再根据内层SRH更新目的地址,将报文发送给Device F。
- Device F收到报文后,检查外层SRH头中的SL值,发现SL=0,Device F是SRv6 TE Policy A的尾节点,对报文的外层IPv6头和SRH头进行解封装,删除封装报文头。
SRv6可靠性机制
SRv6存在多种保护机制,其都是为了保证SRv6网络的正常运行,区别是保护的位置不同
TI-LFA FRR (拓扑无关无环备份快速重路由)
TI-LFA FRR 拓扑无关无环备份机制是为了保护存在其他可用路径或潜在可用路径的SRv6节点,如果没有任何一条路径可以用于故障备份则TI-FLFA FRR无效。
如图,SRv6 TI-LFA FRR开启后,对于B-E链路故障,由于存在B-C-D-E的其他路径可达,SRv6可以通过TI-LFA机制完成备份,如果是A-B链路故障,由于没有任何一条备份路径,TI-LFA无能为力。
开启FRR功能的节点称为PLR(本地修复节点),设备开启FRR后,SRv6 PLR在计算最短路径的同时自动计算一条FRR备份路径写入FIB转发表中,当被保护节点或链路故障,PLR可以快速将流量切换到FRR路径保证业务。
PLR:管理员手动定义开启FRR(Fast Reroute,快速重路由)功能的被保护链路直连节点或被保护节点的直连设备,称为PLR(Point of Local Repair,本地修复节点)。
上图在B设备开启FRR,可以说B设备是B-E链路的PLR,也可以说B设备是C设备的PLR。
TI-LFA FRR算路方法
TI-LFA定义了三个概念
官网这个说的比较晦涩难懂,实际要这么算
P空间:无故障时,以PLR为路由终点,网络中其他设备的IGP最短路径不经过被保护链路、设备的节点集合。
扩展P空间:无故障时,以PLR的邻居节点(除被保护节点)为路由终点,网络中其他设备的IGP最短路径不经过被保护链路、设备的节点集合。
PLR的邻居节点称为N节点,扩展P空间和P空间内的节点成为P节点。
备份路径必须满足Distance(N,P)<Distance(N,PLR)+Distance(PLR,P)。
Q空间:无故障时,以目的节点为路由终端,网络中其他设备的IGP最短路径不经过被保护链路、设备的节点集合。
开启TI-LFA的 PLR设备本身不生成针对自身被保护链路、设备的SPF树。(可以认为其非P非Q)
如果最短路径是等价路由,那么只要有一条路径经过被保护链路、设备,就认为非P\Q设备
Repair List路径:当P空间和Q空间没有交集时,指示如何到达Q节点。由P节点到最近 Q节点路径上的SRv6 SID组成。
只要存在一条不经被保护链路的Repair List,FRR就可以建立。如果存在PQ交集则直接使用PQ交集节点。
以下图为例,B设备为PLR:
- Src到PLR的IGP最短路径为Src-B,是P节点;到Dst的最短路径为B-E-Dst,所以非Q节点;
- C到B的最短路径为C-B,是P节点;到Dst最短路径有两条:C-D-E和C-B-E,存在等价路径过被保护链路,所以非Q节点;
- D到PLR的IGP最短路径为D-C-B和D-E-B,存在等价路径过被保护链路,非P节点;到Dst 为D-E-Dst,所以是Q节点;
- E到PLR经过保护链路,非P;到Dst不经过,是Q节点;
- Dst本身是Q节点;
- D在P空间和Q空间的计算均失败,按扩展P空间计算,PLR的邻居C设备,D到C的路径为D-C,不经过被保护链路,所以D是扩展P节点(P节点)。
得出,Src、B、C、D为P节点,Dst、E、D为Q节点,D设备为P空间和Q空间交集;所以FRR路径为B-D-Dst。
由于存在Repair List的概念,网上部分教程说的没有PQ交集就不能建立FRR是错误的概念。
正切防微环
正切及正向切换,指正常链路切换到FRR的过程。
如图所示,当Device B故障时,到Device C的流量将切换到TI-LFA计算的备份路径转发。Device A收敛后,到Device C的流量将沿着收敛后路径转发。此时如果Device D和Device F还没有收敛,流量到DF后会被DF按收敛前的路径再次发回A,Device A到Device F之间形成短暂环路。
回切防微环
回切是正常链路恢复后,流量从备份链路切回正常链路的过程。
如图,Device B和Device C之间的链路故障恢复后,如果Device A先于Device B收敛,则Device A会将流量转发给Device B,但是Device B没有收敛,仍旧沿着备份路径转发回A,这样Device A和Device B之间就会形成环路。
配置TI-FLA FRR限制
如果源节点上等价主路径的下一跳节点不同,则缺省情况下无法通过TI-LFA FRR计算出备份路径。只有将源节点上所有的等价主链路加入同一个SRLG(Shared Risk Link Group,共享风险链路组)才能通过TI-LFA FRR计算出备份路径。
如图,Device A到Device E之间存在三条等价路径Link 1、Link 2和Link 3,这三条等价路径的下一跳节点不完全相同。这种情况下,需要将Link 1、Link 2和Link 3加入同一个SRLG才能计算FRR。
SRv6 TE Policy热备份功能
SRv6 TE Policy的热备份在SRv6 TE Policy中存在多条有效候选路径时,优先级最大的候选路径转发报文,优先级次高的有效候选路径作为备份路径。
如果主路径下所有SID列表对应的转发路径都发生故障,则将流量立即切换到备份候选路径转发,以减少对业务的影响。
SRv6 TE Policy热备份联动SBFD使用时,SBFD可以同时检测SRv6 TE Policy中优先级最高和次高的两条候选路径里的所有SID列表对应的转发路径。
如果优先级最高的候选路径里所有SID列表对应的转发路径都发生故障,则将流量切换到备份路径。
当流量切换到备份路径后,会再次重新计算主备路径。原备份路径将作为主路径,并重新选择一个有效的候选路径作为新的备份路径
当主备路径同时故障时,SRv6 TE Policy将重新计算主备路径。
SRv6 TE Policy与BFD联动
SRv6 TE Policy与BFD联动有两种方式,使用BFD echo方式联动和使用控制报文联动,控制报文联动方式称为SBFD。
echo 方式Insert封装:
echo BFD方式检查SRv6 TE Policy时,BFD报文支持Insert和Encaps的两种封装方式,缺省情况下,BFD报文采用Insert封装方式。
Device A上使用echo BFD检测SRv6 TE Policy,BFD报文采用缺省的Insert封装方式时:
- Device A构造BFD报文的源地址为Device A的本地IPv6地址a,将该IPv6地址a插入到SID列表中SL=0的位置。
- Device D收到BFD更新IPv6报文头的目的地址为a,并根据IPv6地址a查找IPv6路由表把报文环回给Device A。
即请求走SRv6,响应走IPv6路由。
echo报文方式的BFD进行检测时,如果被选中的候选路径中存在多个SID列表,则建立多个BFD会话分别检测每个SID列表对应的转发路径。
echo 方式Encaps封装:
- Device A先构造BFD报文,源地址和目的地址均为Device A的本地IPv6地址a;
- Device A在BFD报文外层再封装一个IPv6头和SRH头,外层IPv6头的源地址为SRv6隧道封装的源IPv6地址,SRH头为SRv6 TE Policy的SID列表。
- Device D接收到BFD报文时,将外层IPv6头和SRH头解封装,并根据地址a查找IPv6路由表把报文环回给Device A。
通常情况下,通过BFD echo检测SRv6 TE Policy时指定的回程路径与去程路径一致,可以指定反向BSID配置BFD echo 回程路径。
SBFD(Seamless BFD,无缝BFD),通过SBFD报文实现探测,同样分两种封装。
SBFD缺省Insert封装:
- Device A构造SBFD报文,SBFD报文的源地址为Device A的本地IPv6地址a,同时将Policy的End-point地址e插入到SID列表中SL=0的位置。
- Device D接收到SBFD报文,将IPv6头和SRH头解封装,根据SBFD报文的源地址a查找IPv6路由表,重新构造SBFD报文返回给Device A。
SBFD Encaps封装:
- Device A构造SBFD报文,SBFD报文的源地址为Device A的本地IPv6地址a,将TE Policy的End-point地址e作为SBFD报文的目的地址,同时在SBFD报文外层再封装一个IPv6头和SRH头,IPv6头的源地址仍为a。
- Device D接收到SBFD报文,将外层IPv6头和SRH头解封装,根据SBFD报文的源地址a查找IPv6路由表,重新构造SBFD报文返回给Device A。
SRv6 TE Policy中间节点保护(TE FRR)
TI-LFA FRR是针对存在备份路径的节点、链路保护,热备份是针对真个SRv6 隧道的备份,中间节点保护针对没有备份路径的流量必经节点,又称TE FRR。
原理为在如图必经节点D的上游节点B上开启中间节点保护(SRv6 TE FRR)功能,由节点B执行代理转发动作,绕行故障的中间节点D,从而解决必经的中间节点故障TI-LFA FRR无法绕行的问题,这个上游节点称之为代理转发节点。
节点D故障时,中间节点故障的保护过程如下:
上游节点B感知到报文下一跳节点故障,此时,SL>0,且满足作为代理转发节点转发报文的条件:下一跳报文目的地址d,该目的地址对应的出接口状态为DOWN,节点B执行代理转发行为,将SL减1,并将下层SID f复制到外层IPv6报文头的目的地址字段。
作为代理转发节点转发报文的条件:
- 查询IPv6 FIB表,没有找到对应的转发表项。
- 报文的下一跳是报文目的地址,该目的地址对应的出接口状态为DOWN;
- 查询Local SID表匹配SRv6 SID为End.X SID,且End.X SID对应的出接口状态为DOWN。
- 从路由表中查到的路由为NULL0路由。
由于SL=0,节点B可以去掉SRH扩展报文头,然后根据目的地址f查表转发。
节点B根据目的地f查表转发时,根据节点B的路由收敛情况,处理方式如下:
- 如果节点B上路由已经收敛(到达节点F的下一跳为节点C),则按照收敛后的最短路径转发报文,将报文转发到节点C。
- 如果节点B上路由未收敛(到达节点F的路由主下一跳为节点D),则按照TI-LFA计算的备份路径转发报文,备份路径的Repair List为
<c1>
。所以,节点B为报文封装SRH,添加备份路径Segment List c1,经过备份路径将报文转发到节点F。
代理转发节点代替故障节点进行报文转发时,需要进行以下操作:
- 代理转发节点将报文中SRH的SL减1;
- 将下层要处理的SID更新到外层IPv6报文头,使其作为报文的目的地址;
- 根据目的地址查表转发。
如果SRv6 TE Policy的源节点A感知到节点D故障,即SRv6 TE Policy的SID列表中的第一个SID不可达,则源节点A会将SRv6 TE Policy置为down状态。此时,设备既无法通过该SRv6 TE Policy转发报文,也无法触发SRv6 TE FRR。
通过开启SRv6 TE Policy的备份路径功能,可以解决上述问题。开启SRv6 TE Policy的备份路径功能后,如果SRv6 TE Policy的SID列表中的第一个SID不可达,则设备生成一条目的地址为SID列表中第一个SID、出接口为NULL0的路由,保证该SRv6 TE Policy处于up状态,以触发SRv6 TE FRR。
SRv6尾节点保护功能
如果SRv6隧道的尾节点发生故障,报文无法通过尾节点PE设备转发到CE设备,所以需要对SRv6隧道的尾节点提供保护。
SRv6尾节点保护对TE和BE均有效,是通过CE双归到PE设备实现的,仅适用于双归属的网络场景,要求尾节点PE和对尾节点进行保护的另一个PE节点上具有相同的转发表项。
如图,PE 3是SRv6 TE Policy的尾节点,CE 2双归到PE 3和PE 4,PE 4为PE 3提供保护。
其原理借助End.M
SID,PE 4从PE 3收到BGP路由后,如果BGP路由中的SRv6 SID在PE 4上End.M SID保护的Locator范围内,则该SRv6 SID为远端SRv6 SID,同时在PE 4上生成远端SRv6 SID与VPN实例/交叉连接/VSI的映射表。
路由发布流程如下:
- PE 4通过IS-ISv6路由向邻居P 1发布End.M SID和被保护的Locator,同时PE 4上生成End.M SID的Local SID表。
- P1收到PE4发送的End.M SID和被保护的Locator的路由,P 1为被保护Locator生成一条Mirror FRR备份路径,这条Mirror FRR备份路径以PE 4作为下一跳。为了能够保证流量不经过故障的PE3且无环路抵达PE4,通常需要计算一条TI-LFA FRR备份路径,并将End.M SID压入到TI-LFA FRR备份路径的SID列表的最后。
正常情况下,流量经过路径CE1-PE1-P1-PE3-CE2转发。当尾节点PE3故障时,报文转发过程为:
- P1上感知到下一跳PE3不可达,切换为Mirror FRR路径。本例中,P1到PE4的最优链路无需经过PE3,无需封装TI-LFA FRR的SID列表,P1直接为报文封装IPv6报文头,将其目的地址设置为End.M SID,然后转发给PE4。
- PE4发现目的地址为本地End.M SID,根据End.M SID对应的转发指令,剥掉外层IPv6报文头,获取到内层报文信息,再内层报文目的地址查询远端SRv6 SID与VPN实例的映射表,找到对应VPN实例1。然后,在PE4上查询该VPN实例1的路由表将流量转发给CE2。
SRv6实验
SRv6 Tunnel隧道基本配置
组网图
配置及配置说明
1、配置Underlay网络互通(使用OSPF)
# MSRA, MSRB、MSRC和MSRA大体相同,略
配置OSPFv3
ospfv3 1
router-id 1.1.1.1
area 0.0.0.0
interface LoopBack0
ospfv3 1 area 0.0.0.0
ipv6 address 1::9/128
interface LoopBack1
ipv6 address 98::1/64
interface GigabitEthernet0/0
ospfv3 1 area 0.0.0.0
ipv6 address 1::1/64
2、配置SRv6 SID
# MSRA
segment-routing ipv6 # 进入SRv6视图
locator 1 ipv6-prefix 100:1:: 120 static 8 # 创建SID Locator 100:1::/120, 静态段8位
opcode 1 end # 指定100:1::1 绑定动作为END
# MSRB
segment-routing ipv6
locator 2 ipv6-prefix 200:1:: 120 static 8
opcode 1 end
# MSRC
segment-routing ipv6
locator 3 ipv6-prefix 300:1:: 120 static 8
opcode 1 end
3、在IGP路由中发布本设备SID
# MSRA(MSRB、MSRC配置相同)
ospfv3 1
segment-routing ipv6 locator 1 # OSPFv3发布段路由
4、创建SRv6 Tunnel 接口和SID-List
# MSRA
# 创建IPv6 段路由SID列表,指定转发路径为100:1::2 100:1::3
ipv6 segment-routing sid-list 1
sid index 5 100:1::2
sid index 9 100:1::3
# 创建类型为SRv6的Tunnel接口
interface Tunnel0 mode sr ipv6
source LoopBack0 # 指定源接口Loo0
destination 5::9 # 指定隧道对端地址为5:9 (MSRC)
tunnel sid-list 1 # 隧道使用IPv6 段路由列表1
ipv6 address 6::6/64 # 配置Tunnel接口IPv6地址
# MSRC
ipv6 segment-routing sid-list 2
sid index 5 200:1::1
sid index 9 100:1::1
interface Tunnel0 mode sr ipv6
source LoopBack0
destination 1::9
tunnel sid-list 2
ipv6 address 7::7/64
5、通过静态路由将98::/64段和99::/64段互通的路由引入SRv6 隧道
# MSRA
ipv6 route-static 99:: 64 Tunnel0
# MSRC
ipv6 route-static 98:: 64 Tunnel0
实验验证
display segment-routing ipv6 local-sid end
查看设备本地的SID
如图设备本地有SID 100:1::1/120,转发动作为END,附加动作为PSP(次末跳解封装)
display ipv6 routing-table
查看IPv6路由表
如图,由于OSPFv3发布了各自的SID,ipv6路由表中可以去往看到其他节点SRv6 SID的路由
对于静态配置的Tunnel SRv6隧道,只需要保证SID List中第一个SID在路由表中有路由条目,后续SID即使错误隧道也会UP。
完整配置文件
MSRA
#
sysname 1-MSRA
#
ospfv3 1
router-id 1.1.1.1
segment-routing ipv6 locator 1
area 0.0.0.0
#
ipv6 segment-routing sid-list 1
sid index 5 100:1::2
sid index 9 100:1::3
#
interface LoopBack0
ospfv3 1 area 0.0.0.0
ipv6 address 1::9/128
#
interface LoopBack1
ipv6 address 98::1/64
#
interface GigabitEthernet0/0
ospfv3 1 area 0.0.0.0
ipv6 address 1::1/64
#
interface Tunnel0 mode sr ipv6
source LoopBack0
destination 5::9
tunnel sid-list 1
ipv6 address 6::6/64
#
segment-routing ipv6
locator 1 ipv6-prefix 100:1:: 120 static 8
opcode 1 end
#
ipv6 route-static 99:: 64 Tunnel0
#
return
MSRB
#
sysname 1-MSRB
#
ospfv3 1
router-id 2.2.2.2
segment-routing ipv6 locator 2
area 0.0.0.0
#
interface LoopBack0
ospfv3 1 area 0.0.0.0
ipv6 address 2::9/128
#
interface GigabitEthernet0/0
ospfv3 1 area 0.0.0.0
ipv6 address 1::2/64
#
interface GigabitEthernet0/1
ospfv3 1 area 0.0.0.0
ipv6 address 2::1/64
#
segment-routing ipv6
locator 2 ipv6-prefix 200:1:: 120 static 8
opcode 1 end
#
return
MSRC
#
sysname 1-MSRC
#
ospfv3 1
router-id 3.3.3.3
segment-routing ipv6 locator 3
area 0.0.0.0
#
ipv6 segment-routing sid-list 2
sid index 5 200:1::1
sid index 9 100:1::1
#
interface LoopBack0
ospfv3 1 area 0.0.0.0
ipv6 address 5::9/128
#
interface LoopBack1
ipv6 address 99::1/64
#
interface GigabitEthernet0/0
ospfv3 1 area 0.0.0.0
ipv6 address 2::2/64
#
interface Tunnel0 mode sr ipv6
source LoopBack0
destination 1::9
tunnel sid-list 2
ipv6 address 7::7/64
#
segment-routing ipv6
locator 3 ipv6-prefix 300:1:: 120 static 8
opcode 1 end
#
ipv6 route-static 98:: 64 Tunnel0
#
return
SRv6 TE Policy基本转发配置
组网图
配置及配置说明
1、配置Underlay 网络互通
MSRA(B\C\D配置与A无差异,略)
ospfv3 1
router-id 1.1.1.1
area 0.0.0.0
interface LoopBack0
ospfv3 1 area 0.0.0.0
ipv6 address 1::1/128
interface LoopBack1
ipv6 address 98::1/128
interface GigabitEthernet0/0/0
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
interface GigabitEthernet0/0/1
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
interface GigabitEthernet0/0/2
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
2、配置SRv6 SID并发布到IGP协议
MSRA(B、C、D分别为200::,300::,400::,具体配置略)
ospfv3 1
segment-routing ipv6 locator 1
segment-routing ipv6
locator 1 ipv6-prefix 100:: 64 static 32 # 前缀100::/64,静态段32
opcode 1 end psp # SID 100::1 动作为end,附加动作psp(次末跳弹出)
3、配置TE Policy
MSRA(MSRD略)
segment-routing ipv6
# 必须,指定SRv6封装的源IP
encapsulation source-address 1::1
traffic-engineering
# 指定TE使用locator 1 选取SID
srv6-policy locator 1
# 创建SID list
segment-list 1
index 10 ipv6 200::1
index 20 ipv6 300::1
index 30 ipv6 400::1
# 创建TE Policy 1
policy 1
binding-sid ipv6 100::2 # 可选,配置BSID为100::2
color 10 end-point ipv6 4::4 # 配置Color和end-point
# 配置候选路径
candidate-paths
preference 10 # 创建优先级为10的候选路径
explicit segment-list 1 [weight X] # SID List 1加入路径,weight缺省为1
4、将流量引入TE Policy,这里采用静态路由根据Color引入
MSRA
ipv6 route-static 99::1 128 srv6-policy color 10 end-point ipv6 4::4
MSRD
ipv6 route-static 98::1 128 srv6-policy color 10 end-point ipv6 1::1
实验验证
display ipv6 routing-table 99::1
查看路由
路由中没有携带SID,则SID List为手动配置的SID;
display ipv6 fib 99::1
查看fib表
查到存在Token 2150629377;
display segment-routing ipv6 forwarding
查看 SRv6转发表
依次查看Forwarding info
,最终可以看到路径为200::1 300::1 400::1
ping测试可达:
抓包可以看到中间节点SRH 中包含SID List和SRv6转发表项一致,并且次末跳节点弹出了SRH只留下IPv6报文头:
完整配置文件
MARA
#
sysname MSRA
#
ospfv3 1
router-id 1.1.1.1
segment-routing ipv6 locator 1
area 0.0.0.0
#
interface LoopBack0
ospfv3 1 area 0.0.0.0
ipv6 address 1::1/128
#
interface LoopBack1
ipv6 address 98::1/128
#
interface GigabitEthernet0/0/0
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
#
interface GigabitEthernet0/0/2
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
#
interface GigabitEthernet0/0/7
port link-mode route
combo enable copper
#
segment-routing ipv6
encapsulation source-address 1::1
#
locator 1 ipv6-prefix 100:: 64 static 32
opcode 1 end psp
#
traffic-engineering
srv6-policy locator 1
#
segment-list 1
index 10 ipv6 200::1
index 20 ipv6 300::1
index 30 ipv6 400::1
#
policy 1
binding-sid ipv6 100::2
color 10 end-point ipv6 4::4
#
candidate-paths
#
preference 10
explicit segment-list 1
#
ipv6 route-static 99::1 128 srv6-policy color 10 end-point ipv6 4::4
#
return
MSRB
#
sysname MSRB
#
ospfv3 1
router-id 2.2.2.2
segment-routing ipv6 locator 1
area 0.0.0.0
#
interface LoopBack0
ospfv3 1 area 0.0.0.0
ipv6 address 2::2/128
#
interface GigabitEthernet0/0/0
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
#
interface GigabitEthernet0/0/2
port link-mode route
combo enable copper
#
segment-routing ipv6
#
locator 1 ipv6-prefix 200:: 64 static 32
opcode 1 end psp
#
return
MSRC
#
sysname MSRC
#
ospfv3 1
router-id 3.3.3.3
segment-routing ipv6 locator 1
area 0.0.0.0
#
interface LoopBack0
ospfv3 1 area 0.0.0.0
ipv6 address 3::3/128
#
interface GigabitEthernet0/0/0
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
#
segment-routing ipv6
#
locator 1 ipv6-prefix 300:: 64 static 32
opcode 1 end psp
#
return
MSRD
#
sysname MSRD
#
ospfv3 1
router-id 4.4.4.4
segment-routing ipv6 locator 1
area 0.0.0.0
#
interface LoopBack0
ospfv3 1 area 0.0.0.0
ipv6 address 4::4/128
#
interface LoopBack1
ipv6 address 99::1/128
#
interface GigabitEthernet0/0/0
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
ospfv3 1 area 0.0.0.0
ipv6 address auto link-local
#
segment-routing ipv6
encapsulation source-address 4::4
#
locator 1 ipv6-prefix 400:: 64 static 32
opcode 1 end psp
#
traffic-engineering
srv6-policy locator 1
#
segment-list 1
index 10 ipv6 300::1
index 20 ipv6 200::1
index 30 ipv6 100::1
#
policy 1
binding-sid ipv6 400::2
color 10 end-point ipv6 1::1
#
candidate-paths
#
preference 10
explicit segment-list 1
#
ipv6 route-static 98::1 128 srv6-policy color 10 end-point ipv6 1::1
#
return
IPv6 over SRv6 BE配置
组网图
CE1\CE2模拟局域网出口,通过广域网SRv6转发;CE和PE之间建立EBGP邻居关系,PE之间建立IBGP邻居。
配置及配置说明
1、 配置CE1、CE2 基本路由协议
CE1(CE2略)
#
interface GigabitEthernet0/0/0
ipv6 address 111::1/96
#
bgp 65410
router-id 5.5.5.5
peer 111::2 as-number 100
#
address-family ipv6 unicast
import-route direct
peer 111::2 enable
2、配置PE、P设备SRv6 Locator
PE1(其余略)
segment-routing ipv6
encapsulation source-address 1::1
#
locator 1 ipv6-prefix 100:: 64 static 32
3、PE、P设备通过ISIS发布SID
PE1(其余略)
isis 1
is-level level-1
cost-style wide
network-entity 10.1111.1111.1111.00
address-family ipv6 unicast
segment-routing ipv6 locator 1 # 发布SRv6 Locator 1
# 将接口宣告到ISIS
interface LoopBack0
isis ipv6 enable 1
ipv6 address 1::1/128
interface GigabitEthernet0/0/0
ipv6 address 111::2/96
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
4、配置PE-CE、PE-PE间的BGP并发布SID
PE1(其余略)
bgp 100
# 配置ROUTE-ID, 单一IPv6网络BGP无法自动获取Route-id,必须手动配置
router-id 1.1.1.1
# 配置到PE2的邻居
peer 3::3 as-number 100
peer 3::3 connect-interface LoopBack0
# 配置到PE1的邻居
peer 111::1 as-number 65410
# 进入IPv6地址簇
address-family ipv6 unicast
segment-routing ipv6 best-effort # 指定SRv6为BE隧道
segment-routing ipv6 locator 1 # 对BGP邻居宣告Locator 1
peer 3::3 enable
peer 3::3 prefix-sid # 向对等体3::3 传递SID前缀路由
peer 111::1 enable
实验验证
display bgp routing-table ipv6 222:: 96
,PE1 查看BGP IPv6路由表中路由条目详情
可以看到路由中携带了Prefix SID为300::1:0:3
,对于TE隧道这意味着流量转发时会在SID List后再加上300::1:0:3
,对于BE隧道SRv6封装目的地址为300::1:0:3
转发。
实验配置Locator 均为64位前缀,32位静态段,
300::1:0:3
动态段为1,说明是BGP自动生成的SID
display ipv6 routing-table 222::
,下一跳为300::
ping测试可达
抓包可以看到BE隧道只封装了一个IPv6头,源地址为隧道指定地址,目的地址为路由SID300::1:0:3
并且没有封装SRH。
完整配置文件
CE1
#
sysname CE1
#
interface GigabitEthernet0/0/0
ipv6 address 111::1/96
#
bgp 65410
router-id 5.5.5.5
peer 111::2 as-number 100
#
address-family ipv6 unicast
import-route direct
peer 111::2 enable
#
return
CE2
#
sysname CE2
#
interface GigabitEthernet0/0/0
ipv6 address 222::1/96
#
bgp 65420
router-id 5.5.5.5
peer 222::2 as-number 100
#
address-family ipv6 unicast
import-route direct
peer 222::2 enable
#
return
PE1
#
sysname PE1
#
isis 1
is-level level-1
cost-style wide
network-entity 10.1111.1111.1111.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 1::1/128
#
interface GigabitEthernet0/0/0
ipv6 address 111::2/96
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
bgp 100
router-id 1.1.1.1
peer 3::3 as-number 100
peer 3::3 connect-interface LoopBack0
peer 111::1 as-number 65410
#
address-family ipv6 unicast
segment-routing ipv6 best-effort
segment-routing ipv6 locator 1
peer 3::3 enable
peer 3::3 prefix-sid
peer 111::1 enable
#
segment-routing ipv6
encapsulation source-address 1::1
#
locator 1 ipv6-prefix 100:: 64 static 32
#
return
PE2
#
sysname PE2
#
isis 1
is-level level-1
cost-style wide
network-entity 10.3333.3333.3333.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 3::3/128
#
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
ipv6 address 222::2/96
#
bgp 100
router-id 3.3.3.3
peer 1::1 as-number 100
peer 1::1 connect-interface LoopBack0
peer 222::1 as-number 65420
#
address-family ipv6 unicast
segment-routing ipv6 best-effort
segment-routing ipv6 locator 1
peer 1::1 enable
peer 1::1 prefix-sid
peer 222::1 enable
#
segment-routing ipv6
encapsulation source-address 3::3
#
locator 1 ipv6-prefix 300:: 64 static 32
#
return
P
#
sysname P
#
isis 1
is-level level-1
cost-style wide
network-entity 10.2222.2222.2222.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 2::2/128
#
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
segment-routing ipv6
#
locator 1 ipv6-prefix 200:: 64 static 32
#
return
Encaps封装SRv6 TE Policy配置
组网图
如图,MSR1、MSR6只封装TE Policy 1,报文转发到MSR2是以Encaps的方式封装TE Policy 2。
配置及配置说明
1、配置IGP网络、SRv6 Locator 并发布给邻居
MSR1(MSR6同MSR1)
# 配置SRv6 Locator
segment-routing ipv6
encapsulation source-address 1::1
locator 1 ipv6-prefix 100:: 64 static 32
opcode 1 end psp
# IGP使用ISIS
isis 1
is-level level-2
cost-style wide
network-entity 10.1111.1111.1111.00
address-family ipv6 unicast
segment-routing ipv6 locator 1
# 接口配置
interface LoopBack0
isis ipv6 enable 1
ipv6 address 1::1/128
interface LoopBack1
ipv6 address 111::1/96
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
MSR2(MSR5同MSR2)
# 配置SRv6 Locator
segment-routing ipv6
encapsulation source-address 2::2
locator 2 ipv6-prefix 201:: 64 static 32
opcode 1 end psp
# IGP使用ISIS
isis 1
is-level level-2
cost-style wide
network-entity 10.2222.2222.2222.00
address-family ipv6 unicast
segment-routing ipv6 locator 2
# 配置接口
interface LoopBack0
isis ipv6 enable 1
ipv6 address 2::2/128
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
MSR3(MSR4同MSR3)
segment-routing ipv6
locator 1 ipv6-prefix 300:: 64 static 32
opcode 1 end psp
isis 1
is-level level-2
cost-style wide
network-entity 10.3333.3333.3333.00
address-family ipv6 unicast
segment-routing ipv6 locator 1
interface LoopBack0
isis ipv6 enable 1
ipv6 address 3::3/128
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
interface GigabitEthernet0/0/1
port link-mode route
combo enable copper
isis ipv6 enable 1
ipv6 address auto link-local
2、配置TE Policy
MSR1(MSR6同MSR1)
segment-routing ipv6
encapsulation source-address 1::1
locator 1 ipv6-prefix 100:: 64 static 32
opcode 1 end psp
traffic-engineering
srv6-policy locator 1
segment-list 1
# MSR1 SID List配置第一跳发给MSR2 TE Policy 2的BSID 201::2
index 10 ipv6 201::2
index 20 ipv6 600::1
policy 1
color 10 end-point ipv6 6::6
candidate-paths
preference 10
explicit segment-list 1
MSR2(MSR5同MSR2)
segment-routing ipv6
encapsulation source-address 2::2
locator 2 ipv6-prefix 201:: 64 static 32
opcode 1 end psp
traffic-engineering
srv6-policy locator 2
segment-list 1
index 10 ipv6 300::1
index 20 ipv6 400::1
index 30 ipv6 501::1
policy 2
# 配置TE Policy 2的BSID为201::2
binding-sid ipv6 201::2
color 10 end-point ipv6 5::5
candidate-paths
preference 10
explicit segment-list 1
3、将流量引入SRv6 TE Policy
MSR1
ipv6 route-static 222:: 96 srv6-policy color 10 end-point ipv6 6::6
MSR6
ipv6 route-static 111:: 96 srv6-policy color 10 end-point ipv6 1::1
实验验证
display ipv6 fib 222::1
,查看MSR1 上去往222::1的信息
display segment-routing ipv6 forwarding
:查看SRv6转发表
可以看到MSR1只封装201::2 600::1
’;
display ipv6 fib 201::2
,display segment-routing ipv6 forwarding
:查看MSR2的SRv6转发信息
可以看到MSR2中目的地址为201::2
,转发到TE Policy 2
display segment-routing ipv6 local-sid 201::2
:查看MSR2 本地SID记录
SID的Function为 End.B6ENCAPS
;
ping测试可达:
MSR1链路抓包,可以看到只有TE Policy 1的SRH:
MSR3链路抓包,可以看到在TE Policy 1 报文的基础上又封装了一层 TE Policy 2的SRH
Debug打印
debugging srv6 all
debugging ipv6 packet
在MSR1 debug可以看到报文引流到TE隧道的过程
# 原始IPv6报文,Src = 111::1, Dst = 222::1;
*Mar 8 21:24:08:572 2025 MSR1 IP6FW/7/IP6FW_PACKET:
LocalSending, version = 6, traffic class = 0,
flow label = 0, payload length = 64, protocol = 58, hop limit = 64,
Src = 111::1, Dst = 222::1,
prompt: Output an IPv6 Packet.
# 原始报文上送SRv6模块处理
*Mar 8 21:24:08:572 2025 MSR1 IP6FW/7/IP6FW_PACKET:
Transferring, interface = Invalid Interface, version = 6, traffic class = 0,
flow label = 0, payload length = 64, protocol = 58, hop limit = 64,
Src = 111::1, Dst = 222::1,
prompt: Sending the IPv6 packet to the SRv6 module.
# SRv6 debug
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
NID protocol 3
## 查询SRv6转发表,NID = 2150629377,对应FIB表字段
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
Obtain SRv6 forwarding table information. NID = 2150629377, EcmpIndex = 1944246744, EcmpFlag = 1 dscp = 0, dot1p = 0 outif = 0.
## 获取出接口、MTU信息
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
Srv6 ip6 fwdinfo FwdFlag 0, adj forward type 0, outif 1, ifMem 3030233480
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
Get Mtu outif:1 linkmtu:1500.
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
Get Mtu MDC uiSRMtu:9600.
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
Get Mtu uiMinMtu:1500.
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
Get Mtu uiMinMtu:1500 uiPathMtu:0.
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
Get Mtu FINAL uiMinMtu:1500.
## 开始SRv6封装
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
packet: Before encapsulation,
111::1->222::1 (length = 104)
## 这里说明封装了sidNum2(两个SID), sidLen2(两个SID的长度)
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
SRv6 encapsulation: Encaps:1, XSRHType:0, sidNum:2, sidLen:2, sidoff:0.
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
60 00 00 00 00 90 2b ff 00 01 00 00 00 00 00 00
00 00 00 00 00 00 00 01 02 01 00 00 00 00 00 00
00 00 00 00 00 00 00 02 29 04 04 01 01 00 00 00
06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
02 01 00 00 00 00 00 00 00 00 00 00 00 00 00 02
60 00 00 00 00 40 3a 40 01 11 00 00 00 00 00 00
00 00 00 00 00 00 00 01 02 22 00 00 00 00 00 00
00 00 00 00 00 00 00 01 80 00 b0 ef 04 da 00 00
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
packet: After encapsulation,
1::1->201::2 (length = 184)
## 封装完毕,继续查FIB转发
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
SRv6 Encap: Forwarded the IPv6 encapsulated packet.
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
SRv6 Encap: Add statstics to Lfib, NID:2148532225
*Mar 8 21:24:08:572 2025 MSR1 SRV6/7/packet:
SRv6 Encap: Add statstics to Lfib, FwOctets:104,FwPackets:0, FwErrors:1,FwDiscards:0.
# 收到IPv6响应
*Mar 8 21:24:08:573 2025 MSR1 IP6FW/7/IP6FW_PACKET:
Receiving, interface = GigabitEthernet0/0/0, version = 6, traffic class = 0,
flow label = 0, payload length = 144, protocol = 43, hop limit = 253,
Src = 6::6, Dst = 100::1,
prompt: Received an IPv6 packet.
# 上送SRv6解封装
*Mar 8 21:24:08:573 2025 MSR1 IP6FW/7/IP6FW_PACKET:
Transferring, interface = InLoopBack0, version = 6, traffic class = 0,
flow label = 0, payload length = 144, protocol = 43, hop limit = 253,
Src = 6::6, Dst = 100::1,
prompt: Sending the IPv6 packet to the SRv6 module.
*Mar 8 21:24:08:573 2025 MSR1 SRV6/7/packet:
60 00 00 00 00 90 2b fd 00 06 00 00 00 00 00 00
00 00 00 00 00 00 00 06 01 00 00 00 00 00 00 00
00 00 00 00 00 00 00 01 29 04 04 00 01 00 00 00
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
05 01 00 00 00 00 00 00 00 00 00 00 00 00 00 02
60 00 00 00 00 40 3a 40 02 22 00 00 00 00 00 00
00 00 00 00 00 00 00 01 01 11 00 00 00 00 00 00
00 00 00 00 00 00 00 01 81 00 af ef 04 da 00 00
*Mar 8 21:24:08:573 2025 MSR1 SRV6/7/packet:
Next IPv6 extension header: Offset = 40,Protocol = 43,MdcProtocol = 0.
*Mar 8 21:24:08:573 2025 MSR1 IP6FW/7/IP6FW_PACKET:
Receiving, interface = GigabitEthernet0/0/0, version = 6, traffic class = 0,
flow label = 0, payload length = 64, protocol = 58, hop limit = 64,
Src = 222::1, Dst = 111::1,
prompt: Received an IPv6 packet.
# 解封装完成
*Mar 8 21:24:08:573 2025 MSR1 IP6FW/7/IP6FW_PACKET:
Delivering, interface = GigabitEthernet0/0/0, version = 6, traffic class = 0,
flow label = 0, payload length = 64, protocol = 58, hop limit = 64,
Src = 222::1, Dst = 111::1,
prompt: Delivering the IPv6 packet to the upper layer.
*Mar 8 21:24:08:573 2025 MSR1 SRV6/7/packet:
Forwarded the IPv6 de-encapsulated packet, Ret = 0.
*Mar 8 21:24:08:573 2025 MSR1 SRV6/7/packet:
De-encapsulated IPv6 extension header: Protocol = 43, result: 60e0001.
在MSR2 debug可以看到报文TE2 隧道封装的过程,不过报文过设备只有SRv6模块上送CPU处理;
# 根据快转表开始解封装
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
packet: Before de-encapsulation according to fast-forwarding table,
1::1->201::2 (length = 184)
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/event:
SRv6 StatNode is NULL
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
NID protocol 3
# 获取SRv6转发表信息
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
Obtain SRv6 forwarding table information. NID = 2150629377, EcmpIndex = 1261459440, EcmpFlag = 1 dscp = 0, dot1p = 255 outif = 0.
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
FS Get Mtu outif:2 linkmtu:1500.
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
FS Get Mtu MDC uiSRMtu:9600.
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
FS Get Mtu uiMinMtu:1500.
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
FS Get Mtu uiMinMtu:1500 uiPathMtu:0.
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
The min mtu is:1500.
# 封装TE 2
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
SRv6 Fast Encap: pstSRv6FwdInfo->ucEncaps:1, pstSRv6FwdInfo->ucXSRHType:0, sidNum:3, sidLen:3,offnum:0.
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
packet: After encapsulation according to fast-forwarding table,
2::2->300::1 (length = 280)
# 封装完成,查SRv6转发表继续转发
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
Fast forwarded the SRv6 encapsulated packet.
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
SRv6 Encap: Add statstics to Lfib, NID:2148532225
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
SRv6 Encap: Add statstics to Lfib, FwOctets:184,FwPackets:0, FwErrors:1,FwDiscards:0.
*Mar 8 21:35:01:323 2025 MSR2 SRV6/7/packet:
De-encapsulated IPv6 extension header after fast forwarding: Protocol = 43, result = 60e0001.
# 收到回包
*Mar 8 21:35:01:324 2025 MSR2 SRV6/7/packet:
packet: Before de-encapsulation according to fast-forwarding table,
5::5->201::1 (length = 224)
*Mar 8 21:35:01:324 2025 MSR2 SRV6/7/packet:
De-encapsulated IPv6 extension header after fast forwarding: Protocol = 41, result = 60e0001.
SRv6每个节点都会处理SRv6报文,所以均可以debug,如果需要对ACL进行限制,需要匹配最外层的报文,例如在MSR2匹配请求报文
acl ipv6 advanced 3000
rule 0 permit ipv6 source 1::1/128 destination 201::2/128
rule 5 permit ipv6 source 2::2/128 destination 300::1/128
rule 10 permit ipv6 source 5::5/128 destination 201::1/128
rule 15 permit ipv6 source 5::5/128 destination 100::1/128
此外,单独debug srv6 error
无法匹配ACL。
完整配置文件
MSR1
#
sysname MSR1
#
isis 1
is-level level-2
cost-style wide
network-entity 10.1111.1111.1111.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 1::1/128
#
interface LoopBack1
ipv6 address 111::1/96
#
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
#
segment-routing ipv6
encapsulation source-address 1::1
#
locator 1 ipv6-prefix 100:: 64 static 32
opcode 1 end psp
#
traffic-engineering
srv6-policy locator 1
#
segment-list 1
index 10 ipv6 201::2
index 20 ipv6 600::1
#
policy 1
color 10 end-point ipv6 6::6
#
candidate-paths
#
preference 10
explicit segment-list 1
#
ipv6 route-static 222:: 96 srv6-policy color 10 end-point ipv6 6::6
#
return
MSR2
#
sysname MSR2
#
isis 1
is-level level-2
cost-style wide
network-entity 10.2222.2222.2222.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 2
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 2::2/128
#
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
segment-routing ipv6
encapsulation source-address 2::2
#
locator 2 ipv6-prefix 201:: 64 static 32
opcode 1 end psp
#
traffic-engineering
srv6-policy locator 2
#
segment-list 1
index 10 ipv6 300::1
index 20 ipv6 400::1
index 30 ipv6 501::1
#
policy 2
binding-sid ipv6 201::2
color 10 end-point ipv6 5::5
#
candidate-paths
#
preference 10
explicit segment-list 1
#
return
MSR3
#
sysname MSR3
#
isis 1
is-level level-2
cost-style wide
network-entity 10.3333.3333.3333.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 3::3/128
#
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
segment-routing ipv6
#
locator 1 ipv6-prefix 300:: 64 static 32
opcode 1 end psp
#
return
MSR4
#
sysname MSR4
#
isis 1
is-level level-2
cost-style wide
network-entity 10.4444.4444.4444.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 4::4/128
#
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
segment-routing ipv6
#
locator 1 ipv6-prefix 400:: 64 static 32
opcode 1 end psp
#
return
MSR5
#
sysname MSR5
#
isis 1
is-level level-2
cost-style wide
network-entity 10.5555.5555.5555.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 2
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 5::5/128
#
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
segment-routing ipv6
encapsulation source-address 5::5
#
locator 2 ipv6-prefix 501:: 64 static 32
opcode 1 end psp
#
traffic-engineering
srv6-policy locator 2
#
segment-list 1
index 10 ipv6 400::1
index 20 ipv6 300::1
index 30 ipv6 201::1
#
policy 2
binding-sid ipv6 501::2
color 10 end-point ipv6 2::2
#
candidate-paths
#
preference 10
explicit segment-list 1
#
return
MSR6
#
sysname MSR6
#
isis 1
is-level level-2
cost-style wide
network-entity 10.6666.6666.6666.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 6::6/128
#
interface LoopBack1
ipv6 address 222::1/96
#
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
#
segment-routing ipv6
encapsulation source-address 6::6
#
locator 1 ipv6-prefix 600:: 64 static 32
opcode 1 end psp
#
traffic-engineering
srv6-policy locator 1
#
segment-list 1
index 10 ipv6 501::2
index 20 ipv6 100::1
#
policy 1
color 10 end-point ipv6 1::1
#
candidate-paths
#
preference 10
explicit segment-list 1
#
ipv6 route-static 111:: 96 srv6-policy color 10 end-point ipv6 1::1
#
return
SRv6跨域组网-前言
SRv6跨域部分,华为、华三官网我没有找到说明,锐捷官网有提及”SRv6只要路由可达就能够实现业务可达”,我理解只能类似于MPLS跨域Option A或者Option C,无法实现Option B跨域。
原文如图:
对这句话我这么理解:
SRv6是IPv6的形式转发,这意味着无论是不是SRv6节点都必须要有SID的路由;如果是MPLS 的跨域B方案,两个AS之间是没有对方的标签的,即没有路由,如果在ASBR聚合SID路由后再发布个人觉得更类似C而非B。
此外,做实验发现了一个小细节:
- 对于BGP维护的TE隧道,经测试SID List中只要有一个SID的路由头节点没有学到,Policy 就无法UP。
- 对于静态维护的TE隧道,只要第一个SID可达Policy 就UP。
所以路由可达这里可以理解为全网SID路由可达,那么传统的Option B自然就无法实现,除非有一个机制可以允许BGP维护的TE可以到达路由未知的SID。
这点由于我没有找到案例存疑,后续如果知道怎么跨域B(不学习其他AS的SID路由实现跨域)会补充到这里。
- 本次实验BE跨域采用类似Option C的方式,TE跨域采用类似Option A的方式;
这里注意只是跨域方式类似,实际MPLS 跨域和SRv6跨域是两个不同的知识点,其仅仅只是理念有共通之处,实际配置并非完全一致。MPLS只有A\B\C三种方案为最优解,SRv6只要求路由(SID List)全网可达即可,没有固定的配置思路。
SRv6 BE 跨域
组网图
PE-ASBR 建立ipv6、vpnv6邻居;CE-PE通过OSPF发布静态路由使流量全部上送PE; ASBR之间只建立IPv6 邻居;
所有设备的SID全网通告。
配置及配置说明
P设备略
1、配置IGP网络完成互通并发布SID
CE1(CE2同CE1)
ospfv3 1
router-id 11.11.11.11
area 0.0.0.0
interface GigabitEthernet0/0/0
ospfv3 1 area 0.0.0.0
ipv6 address 111::1/96
PE1(PE2同PE1)
# 配置Srv6 Locator
segment-routing ipv6
encapsulation source-address 1::1
locator 1 ipv6-prefix 100:: 64 static 32
# 配置VPN实例
ip vpn-instance srvpn
route-distinguisher 1:1
vpn-target 10:1 import-extcommunity
vpn-target 10:1 export-extcommunity
# ISIS 实现PE间网络互通
isis 1
is-level level-2
cost-style wide
network-entity 10.1111.1111.1111.00
address-family ipv6 unicast
segment-routing ipv6 locator 1
# OSPF发布路由给CE
ospfv3 1 vpn-instance srvpn
router-id 1.1.1.1
default-route-advertise always
area 0.0.0.0
# 接口配置
interface LoopBack0
isis ipv6 enable 1
ipv6 address 1::1/128
interface GigabitEthernet0/0/0
ip binding vpn-instance srvpn
ospfv3 1 area 0.0.0.0
ipv6 address 111::2/96
ASBR1(ASBR2同ASBR1)
segment-routing ipv6
encapsulation source-address 3::3
locator 1 ipv6-prefix 300:: 64 static 32
isis 1
is-level level-2
cost-style wide
network-entity 10.3333.3333.3333.00
address-family ipv6 unicast
# 将BGP发布的SID前缀路由引入IGP路由表让P设备学到路由
import-route bgp4+
segment-routing ipv6 locator 1
interface LoopBack0
isis ipv6 enable 1
ipv6 address 3::3/128
interface GigabitEthernet0/0/0
ipv6 address 10::1/96
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
P1(同P2)
segment-routing ipv6
locator 1 ipv6-prefix 200:: 64 static 32
isis 1
is-level level-2
cost-style wide
network-entity 10.2222.2222.2222.00
address-family ipv6 unicast
segment-routing ipv6 locator 1
interface LoopBack0
isis ipv6 enable 1
ipv6 address 2::2/128
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
2、配置BGP,使用VPNv6发布SID信息
PE1(PE2同PE1)
bgp 100
router-id 1.1.1.1 # 手动指定Route-id
peer 3::3 as-number 100 # 和ASBR建立邻居
peer 3::3 connect-interface LoopBack0
address-family ipv6 unicast
peer 3::3 enable # 建立IPv6邻居
peer 3::3 next-hop-local
address-family vpnv6
peer 3::3 enable # 建立VPNv6邻居
peer 3::3 prefix-sid # 通过VPNv6邻居发布SID前缀
ip vpn-instance srvpn
address-family ipv6 unicast
segment-routing ipv6 best-effort # SRv6隧道生成方式为BE
segment-routing ipv6 locator 1 # 使用Locator 1
import-route ospfv3 1 allow-direct # 引入CE路由
ASBR1(ASBR2同ASBR1)
bgp 100
router-id 3.3.3.3
peer 1::1 as-number 100
peer 1::1 connect-interface LoopBack0
peer 10::2 as-number 200
# 模仿Option C的方式在ASBR network SID前缀路由
address-family ipv6 unicast
network 100:: 64
network 200:: 64
network 300:: 64
peer 1::1 enable
peer 1::1 next-hop-local
peer 10::2 enable
# 模仿Option B的方式在ASBR暂存所有的路由,通过VPNv6发布SID前缀路由
address-family vpnv6
undo policy vpn-target
peer 1::1 enable
peer 1::1 prefix-sid
peer 10::2 enable
peer 10::2 prefix-sid
实验验证
PE1查看vpnv6路由和ipv6 vpn 路由
dis bgp routing-table vpnv6
查表时 fib表指向实际的下一跳,或tunnel 下一跳,所以srv6 be中 fib看到的下一跳是P设备,没有SRv6转发表现。
dis bgp routing-table vpnv6 222:: 96
查看详情可以看到BGP VPNv6路由携带了End.DT6
的SID。
display ipv6 routing-table vpn-instance srvpn 222::
VPN实例路由表学到路由
ping可达
完整配置文件
CE1
#
sysname CE1
#
ospfv3 1
router-id 11.11.11.11
area 0.0.0.0
#
interface GigabitEthernet0/0/0
ospfv3 1 area 0.0.0.0
ipv6 address 111::1/96
#
return
PE1
#
sysname PE1
#
ip vpn-instance srvpn
route-distinguisher 1:1
vpn-target 10:1 import-extcommunity
vpn-target 10:1 export-extcommunity
#
isis 1
is-level level-2
cost-style wide
network-entity 10.1111.1111.1111.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
ospfv3 1 vpn-instance srvpn
router-id 1.1.1.1
default-route-advertise always
import-route bgp4+
area 0.0.0.0
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 1::1/128
#
interface GigabitEthernet0/0/0
ip binding vpn-instance srvpn
ospfv3 1 area 0.0.0.0
ipv6 address 111::2/96
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
bgp 100
router-id 1.1.1.1
peer 3::3 as-number 100
peer 3::3 connect-interface LoopBack0
#
address-family ipv6 unicast
peer 3::3 enable
peer 3::3 next-hop-local
#
address-family vpnv6
peer 3::3 enable
peer 3::3 prefix-sid
#
ip vpn-instance srvpn
#
address-family ipv6 unicast
segment-routing ipv6 best-effort
segment-routing ipv6 locator 1
import-route ospfv3 1 allow-direct
#
segment-routing ipv6
encapsulation source-address 1::1
#
locator 1 ipv6-prefix 100:: 64 static 32
#
return
P1
#
sysname P1
#
isis 1
is-level level-2
cost-style wide
network-entity 10.2222.2222.2222.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 2::2/128
#
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
segment-routing ipv6
#
locator 1 ipv6-prefix 200:: 64 static 32
#
return
CE2、PE2、P2、ASBR2略
SRv6 TE 跨域
组网图
每个AS分别建立TE Policy,ASBR创建对端VPN实例,将对端作为CE设备完成转发(Option A方式);
流量转发路径:
- 请求:PE1-P2-ASBR1-ASBR2-P3-PE2
- 响应:PE2-P4-ASBR2-ASBR1-P1-PE1
配置及配置说明
注意在VPN实例结合BGP时,手动配置TE只需要配置到end SID,不需要配置到end-dt6(除非BGP没发),SRV6会在手动配置SID List的基础上加封装BGP动态学习的
End.DT6
SID。手动配置到
End.DT6
SID会导致SRv6封装两个end-dt6使报文到隧道对端时segment left不为0,尾节点设备无法完成SRv6解封装。Debug会产生如下报错:
*Mar 3 14:59:45:227 2025 ASBR1 SRV6/7/packet: packet: Before de-encapsulation according to fast-forwarding table, 1::1->400::1 (length = 200) *Mar 3 14:59:45:228 2025 ASBR1 SRV6/7/error: The segment left of extension header is not equal to 0. *Mar 3 14:59:45:228 2025 ASBR1 SRV6/7/packet: De-encapsulated IPv6 extension header after fast forwarding: Protocol = 43, result = 40010001.
1、SRv6 Locator创建及IGP协议基本配置
CE1(同CE2)
interface GigabitEthernet0/0/0
ipv6 address 111::1/96
PE1(同PE2)
# 配置VPN实例
ip vpn-instance srvpn
route-distinguisher 1:1
vpn-target 10:10 import-extcommunity
vpn-target 10:10 export-extcommunity
# 配置SRv6 Locator
segment-routing ipv6
encapsulation source-address 1::1
locator 1 ipv6-prefix 100:: 64 static 32
opcode 1 end-dt6 vpn-instance srvpn
opcode 10 end psp
# 配置IGP协议并通过SID
isis 1
is-level level-2
cost-style wide
network-entity 10.1111.1111.1111.00
address-family ipv6 unicast
segment-routing ipv6 locator 1
# 配置接口
interface LoopBack0
isis ipv6 enable 1
ipv6 address 1::1/128
interface GigabitEthernet0/0/0
ip binding vpn-instance srvpn
ipv6 address 111::2/96
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
interface GigabitEthernet0/0/2
isis ipv6 enable 1
ipv6 address auto link-local
P1(同P2、P3、P4)
segment-routing ipv6
locator 1 ipv6-prefix 200:: 64 static 32
opcode 1 end psp
isis 1
is-level level-2
cost-style wide
network-entity 10.2222.2222.2222.00
address-family ipv6 unicast
segment-routing ipv6 locator 1
interface LoopBack0
isis ipv6 enable 1
ipv6 address 2::2/128
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
ASBR1(同ASBR2)
# 创建VPN实例用于连接对端ASBR设备
ip vpn-instance srvpn
route-distinguisher 1:1
vpn-target 10:10 import-extcommunity
vpn-target 10:10 export-extcommunity
segment-routing ipv6
encapsulation source-address 4::4
locator 1 ipv6-prefix 400:: 64 static 32
opcode 1 end-dt6 vpn-instance srvpn
opcode 10 end psp
isis 1
is-level level-2
cost-style wide
network-entity 10.4444.4444.4444.00
address-family ipv6 unicast
segment-routing ipv6 locator 1
interface LoopBack0
isis ipv6 enable 1
ipv6 address 4::4/128
interface GigabitEthernet0/0/0
ipv6 address 10::1/96
# 使用子接口绑定对端ASBR
interface GigabitEthernet0/0/0.1
ip binding vpn-instance srvpn
vlan-type dot1q vid 10
ipv6 address 10::1/96
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
interface GigabitEthernet0/0/2
isis ipv6 enable 1
ipv6 address auto link-local
2、配置BGP协议,CE-PE为EBGP ipv6 vpn邻居,PE-ASBR 为Vpnv6邻居,ASBR之间为ipv6 vpn邻居。
CE1
bgp 65001
router-id 11.11.11.11
peer 111::2 as-number 100
address-family ipv6 unicast
network 111:: 96
peer 111::2 enable
PE1
bgp 100
router-id 1.1.1.1
peer 4::4 as-number 100
peer 4::4 connect-interface LoopBack0
# 使用IPv6邻居宣告SRv6 SID前缀
address-family ipv6 unicast
segment-routing ipv6 locator 1
peer 4::4 enable
peer 4::4 next-hop-local
peer 4::4 prefix-sid
# 和ASBR建立VPNv6邻居
address-family vpnv6
peer 4::4 enable
peer 4::4 prefix-sid
# 和CE建立IPv6 VPN邻居
ip vpn-instance srvpn
peer 111::1 as-number 65001
address-family ipv6 unicast
# 以TE的方式创建SRv6隧道
segment-routing ipv6 traffic-engineering
segment-routing ipv6 locator 1
peer 111::1 enable
ASBR1
bgp 100
router-id 4.4.4.4
peer 1::1 as-number 100
peer 1::1 connect-interface LoopBack0
address-family ipv6 unicast
segment-routing ipv6 locator 1
peer 1::1 enable
peer 1::1 next-hop-local
peer 1::1 prefix-sid
address-family vpnv6
peer 1::1 enable
peer 1::1 prefix-sid
# 以对端ASBR为CE设备,建立IPv6 VPN邻居
ip vpn-instance srvpn
peer 10::2 as-number 200
address-family ipv6 unicast
segment-routing ipv6 traffic-engineering
segment-routing ipv6 locator 1
peer 10::2 enable
3、配置TE Policy
PE1
segment-routing ipv6
encapsulation source-address 1::1
locator 1 ipv6-prefix 100:: 64 static 32
opcode 1 end-dt6 vpn-instance srvpn
opcode 10 end psp
traffic-engineering
srv6-policy locator 1
segment-list 1
index 10 ipv6 300::1
index 20 ipv6 400::A
policy 1
color 10 end-point ipv6 4::4
candidate-paths
preference 10
explicit segment-list 1
注意:
segment-list 1
这里SID List只写到了ASBR1的 end SID 400::A,BGP自动宣告了end.DT6, 静态重复配置会导致无法解封装。opcode 10
:opcode 默认是十进制,opcode hex是以16进制写入,所以这里的10实际生成的SID为100::A
,SID List配置时只能是16进制。
ASBR1
segment-routing ipv6
encapsulation source-address 4::4
locator 1 ipv6-prefix 400:: 64 static 32
opcode 1 end-dt6 vpn-instance srvpn
opcode 10 end psp
traffic-engineering
srv6-policy locator 1
segment-list 1
index 10 ipv6 200::1
index 20 ipv6 100::A
policy 1
color 10 end-point ipv6 1::1
candidate-paths
preference 10
explicit segment-list 1
实验验证
查看PE1 BGP路由条目及详情
display bgp routing-table vpnv6
display bgp routing-table vpnv6 222:: 96
PE1查看TE Policy
dis segment-routing ipv6 te policy
查看SRv6转发表
ping测试
PE1-P抓包
这里可以看到SID List 虽然只写了300::1 400::a
,但实际报文封装了BGP路由携带的End.DT6
SID。
ASBR1-ASBR2抓包
ASBR之间IPv6转发,没有SRv6隧道。
完整配置文件
CE1
#
sysname CE1
#
interface GigabitEthernet0/0/0
ipv6 address 111::1/96
#
bgp 65001
router-id 11.11.11.11
peer 111::2 as-number 100
#
address-family ipv6 unicast
network 111:: 96
peer 111::2 enable
#
return
PE1
#
sysname PE1
#
ip vpn-instance srvpn
route-distinguisher 1:1
vpn-target 10:10 import-extcommunity
vpn-target 10:10 export-extcommunity
#
isis 1
is-level level-2
cost-style wide
network-entity 10.1111.1111.1111.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 1::1/128
#
interface GigabitEthernet0/0/0
ip binding vpn-instance srvpn
ipv6 address 111::2/96
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
interface GigabitEthernet0/0/2
isis ipv6 enable 1
ipv6 address auto link-local
#
bgp 100
router-id 1.1.1.1
peer 4::4 as-number 100
peer 4::4 connect-interface LoopBack0
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
peer 4::4 enable
peer 4::4 next-hop-local
peer 4::4 prefix-sid
#
address-family vpnv6
peer 4::4 enable
peer 4::4 prefix-sid
#
ip vpn-instance srvpn
peer 111::1 as-number 65001
#
address-family ipv6 unicast
segment-routing ipv6 traffic-engineering
segment-routing ipv6 locator 1
peer 111::1 enable
#
segment-routing ipv6
encapsulation source-address 1::1
#
locator 1 ipv6-prefix 100:: 64 static 32
opcode 1 end-dt6 vpn-instance srvpn
opcode 10 end psp
#
traffic-engineering
srv6-policy locator 1
#
segment-list 1
index 10 ipv6 300::1
index 20 ipv6 400::A
#
policy 1
color 10 end-point ipv6 4::4
#
candidate-paths
#
preference 10
explicit segment-list 1
#
return
P1
#
sysname P1
#
isis 1
is-level level-2
cost-style wide
network-entity 10.2222.2222.2222.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 2::2/128
#
interface GigabitEthernet0/0/0
isis ipv6 enable 1
ipv6 address auto link-local
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
segment-routing ipv6
#
locator 1 ipv6-prefix 200:: 64 static 32
opcode 1 end psp
#
return
ASBR1
#
sysname ASBR1
#
ip vpn-instance srvpn
route-distinguisher 1:1
vpn-target 10:10 import-extcommunity
vpn-target 10:10 export-extcommunity
#
isis 1
is-level level-2
cost-style wide
network-entity 10.4444.4444.4444.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 4::4/128
#
interface GigabitEthernet0/0/0
ipv6 address 10::1/96
#
interface GigabitEthernet0/0/0.1
ip binding vpn-instance srvpn
vlan-type dot1q vid 10
ipv6 address 10::1/96
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
interface GigabitEthernet0/0/2
isis ipv6 enable 1
ipv6 address auto link-local
#
bgp 100
router-id 4.4.4.4
peer 1::1 as-number 100
peer 1::1 connect-interface LoopBack0
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
peer 1::1 enable
peer 1::1 next-hop-local
peer 1::1 prefix-sid
#
address-family vpnv6
peer 1::1 enable
peer 1::1 prefix-sid
#
ip vpn-instance srvpn
peer 10::2 as-number 200
#
address-family ipv6 unicast
segment-routing ipv6 traffic-engineering
segment-routing ipv6 locator 1
peer 10::2 enable
#
segment-routing ipv6
encapsulation source-address 4::4
#
locator 1 ipv6-prefix 400:: 64 static 32
opcode 1 end-dt6 vpn-instance srvpn
opcode 10 end psp
#
traffic-engineering
srv6-policy locator 1
#
segment-list 1
index 10 ipv6 200::1
index 20 ipv6 100::A
#
policy 1
color 10 end-point ipv6 1::1
#
candidate-paths
#
preference 10
explicit segment-list 1
#
return
其余设备略
SRv6 BE - MPLS 混合网络Option B跨域
组网图
AS 100为MPLS 网络,AS 200为SRv6网络,CE为IPv4。
CE-PE建立ipv4 vpn邻居,PE-ASBR建立VPNv4邻居传递CE流量。
ASBR2位置配置MPLS Label-SID映射,是MPLS和SRv6网络互通。
配置及配置说明
1、底层IGP协议、接口IP、SRv6 Locator、MPLS配置
CE1(CE2略)
interface GigabitEthernet0/0/0
ip address 10.1.1.2 255.255.255.0
PE1
# 创建VPN实例
ip vpn-instance vpn1
route-distinguisher 1:1
vpn-target 10:10 import-extcommunity
vpn-target 10:10 export-extcommunity
# AS内使用ISIS互通
isis 1
is-level level-2
cost-style wide
network-entity 10.1111.1111.1111.00
# 开启MPLS
mpls lsr-id 1.1.1.1
mpls ldp
# 配置接口
interface LoopBack0
ip address 1.1.1.1 255.255.255.255
isis enable 1
interface GigabitEthernet0/0/0 # 接CE
ip binding vpn-instance vpn1
ip address 10.1.1.1 255.255.255.0
interface GigabitEthernet0/0/1 # 接ASBR设备
ip address 11.1.1.1 255.255.255.0
isis enable 1
mpls enable
mpls ldp enable
PE2
segment-routing ipv6
encapsulation source-address 1::1
locator 1 ipv6-prefix 100:: 64 static 32
ip vpn-instance vpn1
route-distinguisher 1:1
vpn-target 10:10 import-extcommunity
vpn-target 10:10 export-extcommunity
isis 1
is-level level-2
cost-style wide
network-entity 10.4444.4444.4444.00
address-family ipv6 unicast
segment-routing ipv6 locator 1
interface LoopBack0
isis ipv6 enable 1
ipv6 address 1::1/128
interface GigabitEthernet0/0/0
ip binding vpn-instance vpn1
ip address 20.1.1.1 255.255.255.0
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
ASBR1
isis 1
is-level level-2
cost-style wide
network-entity 10.2222.2222.2222.00
mpls lsr-id 2.2.2.2
mpls ldp
interface LoopBack0
ip address 2.2.2.2 255.255.255.255
isis enable 1
interface GigabitEthernet0/0/0
ip address 12.1.1.1 255.255.255.0
mpls enable
mpls ldp enable
interface GigabitEthernet0/0/1
ip address 11.1.1.2 255.255.255.0
isis enable 1
mpls enable
mpls ldp enable
ASBR2
segment-routing ipv6
encapsulation source-address 2::2
locator 1 ipv6-prefix 200:: 64 static 32
isis 1
is-level level-2
cost-style wide
network-entity 10.3333.3333.3333.00
address-family ipv6 unicast
segment-routing ipv6 locator 1
# ASBR2不需要开启LDP发布标签
mpls lsr-id 3.3.3.3
interface LoopBack0
isis ipv6 enable 1
ipv6 address 2::2/128
interface GigabitEthernet0/0/0
ip address 12.1.1.2 255.255.255.0
mpls enable
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
2、建立BGP邻居,ASBR2开启MPLSh和SRv6标签映射功能
CE1
bgp 65001
peer 10.1.1.1 as-number 100
address-family ipv4 unicast
import-route direct
peer 10.1.1.1 enable
PE1
bgp 100
peer 2.2.2.2 as-number 100
peer 2.2.2.2 connect-interface LoopBack0
address-family vpnv4
peer 2.2.2.2 enable
ip vpn-instance vpn1
peer 10.1.1.2 as-number 65001
address-family ipv4 unicast
peer 10.1.1.2 enable
ASBR1
bgp 100
peer 1.1.1.1 as-number 100
peer 1.1.1.1 connect-interface LoopBack0
peer 12.1.1.2 as-number 200
address-family vpnv4
undo policy vpn-target
peer 1.1.1.1 enable
peer 12.1.1.2 enable
ASBR2
bgp 200
peer 12.1.1.1 as-number 100
peer 1::1 as-number 200
peer 1::1 connect-interface LoopBack0
address-family vpnv4
undo policy vpn-target
segment-routing ipv6 best-effort
segment-routing ipv6 locator 1
srv6-mpls-interworking enable
peer 12.1.1.1 enable
peer 1::1 enable
peer 1::1 prefix-sid
srv6-mpls-interworking enable
:开启MPLS和SRv6标签映射功能
PE2
bgp 200
router-id 1.1.1.1
peer 20.1.1.1 as-number 65002
peer 2::2 as-number 200
peer 2::2 connect-interface LoopBack0
address-family vpnv4
peer 2::2 enable
peer 2::2 prefix-sid
ip vpn-instance vpn1
peer 20.1.1.2 as-number 65002
address-family ipv4 unicast
segment-routing ipv6 best-effort
segment-routing ipv6 locator 1
peer 20.1.1.2 enable
实验验证
查看流量从MPLS到SRv6的转发过程
PE1 display ip routing-table vpn vpn1 20.1.1.2 verbose
查看路由携带的MPLS标签
内层标签1279,下一跳2.2.2.2
dis mpls lsp
查看MPLS LSP表
所以报文从PE1发出,只携带标签1279,外层标签为3 次末跳弹出,PE1-ASBR1抓包如下:
ASBR1 display mpls forwarding ilm 1279
ASBR1对报文的处理是交换为1151标签,ASBR1-ASBR2抓包如下:
这里是Option B更换内层标签的动作,PE-ASBR 由于次末跳弹出机制,抓包只有内存没有外层。
ASBR2 display mpls forwarding ilm 1151
标签更换为100::1:0:0
,进入SRv6转发流量
这里可以通过display mpls lsp srv6-mpls-interworking
查看标签-SID映射表项,如图,入标签1151映射FEC 1::1 SID 100::1:0:0
。
ASBR2-PE2抓包如下
响应流量转发过程:
PE2 display bgp routing-table vpnv4 10.1.1.1
查路由携带的SID为200::1:0:6
,动作End.T
End.T SID对应的转发动作为剥掉外层IPv6头,并根据End.T SID查找IPv6 FIB表转发报文。
抓包PE2-ASBR2:
ASBR2收到报文,根据End.T动作剥离外层IPv6 头,这里由于ASBR没有ipv4 vpn实例看不到Fib,可以直接看路由条目详细
dis bgp routing-table vpnv4 10.1.1.0
下一跳12.1.1.1,出标签1278,根据BGP路由封装1278内层标签转发
抓包ASBR2-ASBR1
ASBR1 查看MPLS转发表display mpls forwarding ilm
标签1278交换1151,外层标签3转发
ASBR1-PE1抓包
PE1收到报文,发送给CE
Debug打印
在ASBR2 debug mpls packet 和时srv6 all
从MPLS到SRv6
# 收到MPLS报文
*Mar 9 14:59:46:347 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS FSInput: Receiving from interface GE0/0/0, PktLen=88, AF=36, Label(s)=1151, EXP=0, TTL=254.
*Mar 9 14:59:46:347 2025 ASBR2 MPLSFW/7/MPLSFW:
POP Label=1151, EXP=0, TTL=254, Action is POPGO.
# 转发SRv6,SID 100::1:0:0 (映射)
*Mar 9 14:59:46:347 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS FSForward: deliver packet to srv6, out interface:2, srv6sid:100::1:0:0.
# SRv6处理
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
SRv6 FS: FS recieve a packet, protocol = 4,tos = 0 NID = 4294967295, VIRSID = 100::1:0:0, L3Type = 2.
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
FS Get Mtu outif:2 linkmtu:1500.
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
FS Get Mtu MDC uiSRMtu:9600.
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
FS Get Mtu uiMinMtu:1500.
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
FS Get Mtu uiMinMtu:1500 uiPathMtu:0.
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
The min mtu is:1500.
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
packet: Before encapsulation according to fast-forwarding table,
10.1.1.2->20.1.1.2 (length = 84)
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
packet: After encapsulation according to fast-forwarding table,
2::2->100::1:0:0 (length = 124)
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
Fast forwarded the SRv6 encapsulated packet.
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
SRv6 Encap: Add statstics to Lfib, NID:4294967295
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
packet: Before de-encapsulation according to fast-forwarding table,
1::1->200::1:0:6 (length = 124)
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
60 00 00 00 00 54 04 ff 00 01 00 00 00 00 00 00
00 00 00 00 00 00 00 01 02 00 00 00 00 00 00 00
00 00 00 01 00 00 00 06 45 00 00 54 00 91 00 00
fe 01 9c 12 14 01 01 02 0a 01 01 02 00 00 b2 58
01 25 00 00 67 cd ac e4 00 05 4c c8 08 09 0a 0b
0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b
1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b
2c 2d 2e 2f 30 31 32 33 34 35 36 37
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
Next IPv6 extension header: Offset = 40,Protocol = 4,MdcProtocol = 0.
# 收到响应
*Mar 9 14:59:46:347 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS Forward: Receiving IP packet, len = 84, s = 20.1.1.2, d = 10.1.1.2, TOS = 0, TTL = 254, ServiceClass = 255.
*Mar 9 14:59:46:347 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS Forward: AdjEntry=3518595184, FwdInfo Nid=1, handle=3518595184 !
*Mar 9 14:59:46:347 2025 ASBR2 MPLSFW/7/MPLSFW:
PUSH Label=1278, EXP=0, TTL=254.
*Mar 9 14:59:46:347 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS Output: Sending to interface GE0/0/0, PktLen=88, AF=36, Label(s)=1278, EXP=0, TTL=254.
*Mar 9 14:59:46:347 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS send result 0.
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
Forwarded the SRv6 decapsulated packet to MPLS, Ret = 0X0.
*Mar 9 14:59:46:347 2025 ASBR2 SRV6/7/packet:
De-encapsulated IPv6 extension header: Protocol = 4, result: 60e0001.
从SRv6到MPLS
# 收到SRv6报文
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
60 00 00 00 00 54 04 ff 00 01 00 00 00 00 00 00
00 00 00 00 00 00 00 01 02 00 00 00 00 00 00 00
00 00 00 01 00 00 00 06 45 00 00 54 00 94 00 00
fe 01 9c 10 14 01 01 02 0a 01 01 01 08 00 a4 0c
01 10 00 00 67 cd ad 8d 00 07 52 7e 08 09 0a 0b
0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b
1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b
2c 2d 2e 2f 30 31 32 33 34 35 36 37
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
Next IPv6 extension header: Offset = 40,Protocol = 4,MdcProtocol = 0.
# 解封装SRv6交由MPLS转发
*Mar 9 15:02:36:051 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS Forward: Receiving IP packet, len = 84, s = 20.1.1.2, d = 10.1.1.1, TOS = 0, TTL = 254, ServiceClass = 255.
*Mar 9 15:02:36:051 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS Forward: AdjEntry=3518595184, FwdInfo Nid=1, handle=3518595184 !
*Mar 9 15:02:36:051 2025 ASBR2 MPLSFW/7/MPLSFW:
PUSH Label=1278, EXP=0, TTL=254.
*Mar 9 15:02:36:051 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS Output: Sending to interface GE0/0/0, PktLen=88, AF=36, Label(s)=1278, EXP=0, TTL=254.
*Mar 9 15:02:36:051 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS send result 0.
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
Forwarded the SRv6 decapsulated packet to MPLS, Ret = 0X0.
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
De-encapsulated IPv6 extension header: Protocol = 4, result: 60e0001.
*Mar 9 15:02:36:051 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS FSInput: Receiving from interface GE0/0/0, PktLen=88, AF=36, Label(s)=1151, EXP=0, TTL=254.
# 响应报文交友SRv6处理
*Mar 9 15:02:36:051 2025 ASBR2 MPLSFW/7/MPLSFW:
POP Label=1151, EXP=0, TTL=254, Action is POPGO.
*Mar 9 15:02:36:051 2025 ASBR2 MPLSFW/7/MPLSFW:
MPLS FSForward: deliver packet to srv6, out interface:2, srv6sid:100::1:0:0.
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
SRv6 FS: FS recieve a packet, protocol = 4,tos = 0 NID = 4294967295, VIRSID = 100::1:0:0, L3Type = 2.
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
FS Get Mtu outif:2 linkmtu:1500.
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
FS Get Mtu MDC uiSRMtu:9600.
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
FS Get Mtu uiMinMtu:1500.
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
FS Get Mtu uiMinMtu:1500 uiPathMtu:0.
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
The min mtu is:1500.
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
packet: Before encapsulation according to fast-forwarding table,
10.1.1.1->20.1.1.2 (length = 84)
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
packet: After encapsulation according to fast-forwarding table,
2::2->100::1:0:0 (length = 124)
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
Fast forwarded the SRv6 encapsulated packet.
*Mar 9 15:02:36:051 2025 ASBR2 SRV6/7/packet:
SRv6 Encap: Add statstics to Lfib, NID:4294967295
完整配置文件
CE1
#
sysname CE1
#
interface GigabitEthernet0/0/0
ip address 10.1.1.2 255.255.255.0
#
bgp 65001
peer 10.1.1.1 as-number 100
#
address-family ipv4 unicast
import-route direct
peer 10.1.1.1 enable
#
return
CE2
#
sysname CE2
#
interface GigabitEthernet0/0/0
ip address 20.1.1.2 255.255.255.0
#
bgp 65002
peer 20.1.1.1 as-number 200
#
address-family ipv4 unicast
import-route direct
peer 20.1.1.1 enable
#
return
PE1
#
sysname PE1
#
ip vpn-instance vpn1
route-distinguisher 1:1
vpn-target 10:10 import-extcommunity
vpn-target 10:10 export-extcommunity
#
isis 1
is-level level-2
cost-style wide
network-entity 10.1111.1111.1111.00
#
address-family ipv4 unicast
#
mpls lsr-id 1.1.1.1
#
mpls ldp
#
interface LoopBack0
ip address 1.1.1.1 255.255.255.255
isis enable 1
#
interface GigabitEthernet0/0/0
ip binding vpn-instance vpn1
ip address 10.1.1.1 255.255.255.0
#
interface GigabitEthernet0/0/1
ip address 11.1.1.1 255.255.255.0
isis enable 1
mpls enable
mpls ldp enable
#
bgp 100
peer 2.2.2.2 as-number 100
peer 2.2.2.2 connect-interface LoopBack0
#
address-family vpnv4
peer 2.2.2.2 enable
#
ip vpn-instance vpn1
peer 10.1.1.2 as-number 65001
#
address-family ipv4 unicast
peer 10.1.1.2 enable
#
return
PE2
#
sysname PE2
#
ip vpn-instance vpn1
route-distinguisher 1:1
vpn-target 10:10 import-extcommunity
vpn-target 10:10 export-extcommunity
#
isis 1
is-level level-2
cost-style wide
network-entity 10.4444.4444.4444.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 1::1/128
#
interface GigabitEthernet0/0/0
ip binding vpn-instance vpn1
ip address 20.1.1.1 255.255.255.0
#
bgp 200
router-id 1.1.1.1
peer 20.1.1.1 as-number 65002
peer 2::2 as-number 200
peer 2::2 connect-interface LoopBack0
#
address-family vpnv4
peer 2::2 enable
peer 2::2 prefix-sid
#
ip vpn-instance vpn1
peer 20.1.1.2 as-number 65002
#
address-family ipv4 unicast
segment-routing ipv6 best-effort
segment-routing ipv6 locator 1
peer 20.1.1.2 enable
#
segment-routing ipv6
encapsulation source-address 1::1
#
locator 1 ipv6-prefix 100:: 64 static 32
#
return
ASBR1
#
sysname ASBR1
#
isis 1
is-level level-2
cost-style wide
network-entity 10.2222.2222.2222.00
#
address-family ipv4 unicast
#
mpls lsr-id 2.2.2.2
#
mpls ldp
#
interface LoopBack0
ip address 2.2.2.2 255.255.255.255
isis enable 1
#
interface GigabitEthernet0/0/0
ip address 12.1.1.1 255.255.255.0
mpls enable
mpls ldp enable
#
interface GigabitEthernet0/0/1
ip address 11.1.1.2 255.255.255.0
isis enable 1
mpls enable
mpls ldp enable
#
bgp 100
peer 1.1.1.1 as-number 100
peer 1.1.1.1 connect-interface LoopBack0
peer 12.1.1.2 as-number 200
#
address-family vpnv4
undo policy vpn-target
peer 1.1.1.1 enable
peer 12.1.1.2 enable
#
return
ASBR2
#
sysname ASBR2
#
isis 1
is-level level-2
cost-style wide
network-entity 10.3333.3333.3333.00
#
address-family ipv6 unicast
segment-routing ipv6 locator 1
#
mpls lsr-id 3.3.3.3
#
interface LoopBack0
isis ipv6 enable 1
ipv6 address 2::2/128
#
interface GigabitEthernet0/0/0
ip address 12.1.1.2 255.255.255.0
mpls enable
#
interface GigabitEthernet0/0/1
isis ipv6 enable 1
ipv6 address auto link-local
#
bgp 200
peer 12.1.1.1 as-number 100
peer 1::1 as-number 200
peer 1::1 connect-interface LoopBack0
#
address-family vpnv4
undo policy vpn-target
segment-routing ipv6 best-effort
segment-routing ipv6 locator 1
srv6-mpls-interworking enable
peer 12.1.1.1 enable
peer 1::1 enable
peer 1::1 prefix-sid
#
segment-routing ipv6
encapsulation source-address 2::2
#
locator 1 ipv6-prefix 200:: 64 static 32
#
return