什么是Segment Routing?
Segment Routing是一种源路由协议,其核心思想是将网络报文转发路径切割为不同的分段,并在路径起始点往报文中插入分段信息指导报文转发。目前,Segment Routing支持MPLS和IPv6两种数据平面,对应着两种技术方案:基于MPLS数据平面的Segment Routing称为SR-MPLS;基于IPv6数据平面的Segment Routing称为SRv6。
Segment Routing是如何产生的?
全球信息化的进程使得互联网应用得到了迅速而蓬勃的发展,随着网络规模的扩大以及云时代的到来,网络业务种类越来越多,不同业务对网络的要求不尽相同,传统IP/MPLS网络遇到不少挑战:
- IP承载网的孤岛问题。MPLS统一了承载网,但是IP骨干网、城域网、移动承载网之间是独立的MPLS域,是相互分离的,需要使用跨域VPN等复杂的技术来互联,导致端到端业务的部署非常复杂。 而且在L2VPN、L3VPN多种业务并存的情况下,设备中可能同时存在LDP、RSVP、IGP、BGP等协议,管理复杂,不适合大规模业务部署。
- IPv4与MPLS的可编程空间有限。当前很多新业务需要在转发平面加入更多的转发信息,但IETF已经发表声明,停止为IPv4制定更新的标准,另外MPLS只有20bit的标签空间,且标签字段固定、长度固定,缺乏可扩展性,导致很难满足未来业务的网络编程需求。
- 应用与承载网隔离。目前应用与承载网的解耦,导致网络自身的优化困难,难以提升网络的价值。当前运营商普遍面临被管道化的挑战,无法从增值应用中获得相应的收益;而应用信息的缺失,也使得运营商只能采用粗放的方式进行网络调度和优化,造成资源的浪费。MPLS也曾试图更靠近主机和应用,但因为其本身网络边界多、管理复杂度大等多方面的原因,均以失败告终。
- 传统网络数据面和控制面紧密耦合,相互绑定销售,在演进上相互依赖,业务上线周期长,难以应对现在新兴业务快速发展的局面。
为了破解上述困局,出现了很多新的网络技术思潮。SDN(Software-Defined Networking,软件定义网络)就是其中的佼佼者。SDN是一种新的网络体系架构,由美国斯坦福大学 尼克 · 麦基翁(Nick McKeown)教授的团队提出,通过借鉴计算机领域通用硬件、软件定义和开源理念来解决传统网络架构中网络设备硬件、操作系统和网络应用紧密耦合,相互依赖的问题。SDN主要有3大特征:网络开放可编程、逻辑上的集中控制、控制平面与转发平面分离。符合这3大特征的网络都可以称为SDN。
Segment Routing技术就是在SDN思潮的影响下产生的,其核心思想是将报文转发路径切割为不同的分段,并在路径起始点往报文中插入分段信息,中间节点只需要按照报文里携带的分段信息转发即可。Segment Routing具有简单、高效、易扩展的特点,其优势体现在以下几方面:
- 具备网络路径可编程能力:Segment Routing具备源路由优势,仅在源节点对报文进行标签操作即可任意控制业务路径,且中间节点不需要维护路径信息,设备控制平面压力小。
- 简化设备控制平面,减少路由协议数量,简化运维成本;标签转发表简单,标签占用少,设备资源占用率低。
- 更好的向SDN网络平滑演进:面向SDN架构设计的协议,融合了设备自主转发和集中编程控制的优势,能够更好地实现应用驱动网络。同时,支持传统网络和SDN网络,兼容现有设备,保障现有网络平滑演进到SDN网络。
Segment Routing有哪些技术方案?
Segment Routing的设计理念在现实生活中屡见不鲜,下面举一个例子,来更好的理解其原理。假设你从上海出发去巴黎旅游,需要在维也纳转机。那么你的出行路线分为两段,上海→维也纳、维也纳→巴黎。则你只需要在上海买好上海途经维也纳到巴黎的票,按照计划根据机票,经过两段,飞到巴黎即可。
上海到巴黎出行示意图
网络报文利用Segment Routing技术进行转发的过程也是类似的。Segment Routing技术关键在于两点:对路径进行分段(Segment)以及在起始节点对路径进行排序组合(Segment List),确定出行路径。在Segment Routing技术中,将代表不同功能的Segment进行组合,可以实现对路径的编程,满足不同路径服务质量的需求。
Segment Routing技术支持MPLS和IPv6两种转发平面,对应着两种主流的技术方案:基于MPLS转发平面的Segment Routing称为SR-MPLS(Segment Routing MPLS);基于IPv6转发平面的Segment Routing称为SRv6。
接下来我们进入正题开始配置SR-MPLS,并通过TE隧道来进行转发
拓扑图
介绍
本实验采用6台CX的设备来进行模拟实验,设备的互联地址为配置为10.1.XY.X&Y,拿CX1和CX2举例,也就是10.1.12.1/24,10.1.12.2/24。环回口地址为1.1.1.X,拿CX1举例,那么环回地址为1.1.1.1/32,设备的SRGB和Prefix值都在图中标注好了,接下来开始配置。
配置过程
1、首先为全网设备配置IP地址(CX2-CX5略,请自行配置)
[CX1]interface Ethernet1/0/0
[CX1-Ethernet1/0/0] undo shutdown
[CX1-Ethernet1/0/0] ip address 10.1.12.1 255.255.255.0 //添加接口IP地址
[CX1]interface LoopBack0
[CX1-LoopBack0] ip address 1.1.1.1 255.255.255.255 //添加环回地址
2、配置全网OSPF并查看状态(CX2-CX5略,请自行配置)
[CX1]ospf 1 router-id 1.1.1.1 //开启ospf进程1并配置router-id为1.1.1.1
[CX1-ospf-1] area 0.0.0.0 //进入区域0视图
[CX1-ospf-1-area-0.0.0.0] network 1.1.1.1 0.0.0.0 //发布环回地址
[CX1-ospf-1-area-0.0.0.0] network 10.1.12.0 0.0.0.255 //发布接口地址
配置完成后查看邻居状态
可以看到邻居为1.1.1.2,并且状态为FULL了
3、为每台设备配置MPLS LSR-ID、MPLS TE,同时也需要在接口上开启MPLS、MPLS TE
注:在BGP MPLS VPN中我们通常使用LDP来分发标签,但是在SR中,BE隧道只需要开启MPLS,TE隧道需要开启MPLS及MPLSTE,只有在SRv6中才完全不需要MPLS了。
[CX1]mpls lsr-id 1.1.1.1 //为MPLS分配ID
[CX1]Mpls //开启MPLS功能
[CX1-mpls]mpls te //开启MPLS TE功能
[CX1]interface Ethernet1/0/0
[CX1-Ethernet1/0/0] undo shutdown
[CX1-Ethernet1/0/0] ip address 10.1.12.1 255.255.255.0
[CX1-Ethernet1/0/0] mpls //开启接口MPLS功能
[CX1-Ethernet1/0/0] mpls te //开启接口MPLS TE功能
4、为SR分配Prefix ID并且在OSPF中打开不透明的LSA功能,接着开启MPLS并配置转发平面为MPLS,最后在区域0内开启MPLS-TE功能(CX2-CX5略,请自行配置)
[CX1]interface LoopBack0
[CX1-LoopBack0]ospf prefix-sid index 1 //配置sr的prefix id为1
[CX1]ospf 1
[CX1-ospf-1] opaque-capability enable
[CX1-ospf-1] segment-routing mpls
[CX1-ospf-1] segment-routing global-block 16000 17000
[CX1-ospf-1]area 0.0.0.0
[CX1-ospf-1-area-0.0.0.0] mpls-te enable
查看 SR的MPLS转发表
可以看到所有的标签都有了
注:这里说明一下,每台设备的标签值为SRGB+Index也就是prefix值算出来的,以CX1为例,SRGB为16000-17000,Prefix值为1,那么CX1的标签就是16001了。
5、接着我们在CX1上开始配置SR隧道,这里我们通过显式路径来让CX1访问CX6的路径为CX1-CX2-CX3-CX4-CX6(隧道可以只在CX1上配置,也可以两端都配置,如果CX6没配置那么CX6回包会通过BE隧道来回)
首先我们先创建一个名为CX1_CX6的显式路径
[CX1]explicit-path CX1_CX6 //创建显式路径
[CX1-explicit-path-CX1_CX6] next sid label 16002 type prefix //配置显式路径第一跳
[CX1-explicit-path-CX1_CX6] next sid label 16003 type prefix //配置显式路径第二跳
[CX1-explicit-path-CX1_CX6] next sid label 16004 type prefix //配置显式路径第三跳
[CX1-explicit-path-CX1_CX6] next sid label 16006 type prefix //配置显式路径第四跳
接着创建隧道
[CX1]interface Tunnel0/0/0
[CX1-Tunnel0/0/0] ip address unnumbered interface LoopBack0 //借用环回地址
[CX1-Tunnel0/0/0] tunnel-protocol mpls te //将隧道协议修改为MPLS TE
[CX1-Tunnel0/0/0] destination 1.1.1.6 //配置目的地址围为1.1.1.6
[CX1-Tunnel0/0/0] mpls te signal-protocol segment-routing //配置MPLS TE的信令为SR
[CX1-Tunnel0/0/0] mpls te tunnel-id 1 //配置隧道ID
[CX1-Tunnel0/0/0] mpls te path explicit-path CX1_CX6 //将显式路径应用到隧道内
查看隧道状态
可以看到隧道口已经UP了
注:因为SR隧道式是无状态隧道的,只需要本端创建并符合条件转发隧道口就能够UP
接着我们查看所有隧道
可以看到前往1.1.1.6的TE隧道已经建立成功
6、在CX1和CX6上创建VPN实例并绑定Loopback 1口
[CX1]ip vpn-instance huawei //配置VPN实例
[CX1-vpn-instance-huawei] ipv4-family
[CX1-vpn-instance-huawei] route-distinguisher 100:1 //配置RD值
[CX1-vpn-instance-huawei-af-ipv4] vpn-target 100:1 export-extcommunity //配置出向RT值
[CX1-vpn-instance-huawei-af-ipv4] vpn-target 100:1 import-extcommunity //配置入向RT值
[CX1]interface LoopBack1
[CX1-LoopBack1] ip binding vpn-instance huawei
[CX1-LoopBack1] ip address 11.11.11.11 255.255.255.255 //绑定VPN实例后IP地址会被清空,需要重新配置
[CX6]ip vpn-instance huawei //配置VPN实例
[CX6-vpn-instance-huawei] ipv4-family
[CX6-vpn-instance-huawei] route-distinguisher 100:1 //配置RD值
[CX6-vpn-instance-huawei-af-ipv4] vpn-target 100:1 export-extcommunity //配置出向RT值
[CX6-vpn-instance-huawei-af-ipv4] vpn-target 100:1 import-extcommunity //配置入向RT值
[CX6]interface LoopBack1
[CX6-LoopBack1] ip binding vpn-instance huawei
[CX6-LoopBack1] ip address 66.66.66.66 255.255.255.255 //绑定VPN实例后IP地址会被清空,需要重新配置
7、在CX1和CX6上创建相互的VPNV4的IBGP邻居,并在BGP VPN实例视图引入直连路由
[CX1]bgp 100
[CX1-bgp] peer 1.1.1.6 as-number 100
[CX1-bgp] peer 1.1.1.6 connect-interface LoopBack0
[CX1-bgp]ipv4-family vpnv4 unicast
[CX1-bgp-af-vpnv4] peer 1.1.1.6 enable
[CX1-bgp] ipv4-family vpn-instance huawei
[CX1-bgp-huawei] import-route direct
[CX6]bgp 100
[CX6-bgp] peer 1.1.1.1 as-number 100
[CX6-bgp] peer 1.1.1.1 connect-interface LoopBack0
[CX6-bgp]ipv4-family vpnv4 unicast
[CX6-bgp-af-vpnv4] peer 1.1.1.1 enable
[CX6-bgp] ipv4-family vpn-instance huawei
[CX6-bgp-huawei] import-route direct
查看BGP邻居状态
可以看到已经从对端学习到了一条路由了
接着我们查看VPN的路由转发表
可以看到CX1去往CX6的路由已经学到了,但是下一条并没有通过隧道进行转发,接着我们查看这条路由的详细信息,是否存在关于隧道的信息
可以看到的确存在隧道的信息,但是我们重新查看隧道表项
这样可以看到,去往CX6的路由是通过BE隧道进行转发的
注:华为的隧道转发顺序为BE比TE优先,所以在TE和BE同时存在的情况下,优先从BE转发出去了。
7、创建隧道策略,将TE转发改为优先选择
[CX1]tunnel-policy CX1
[CX1-tunnel-policy-CX1] tunnel select-seq sr-te sr-lsp load-balance-number 1 //配置隧道转发方式的顺序为TE然后再选择BE
[CX1]ip vpn-instance huawei //进入VPN实例
[CX1-vpn-instance-huawei]tnl-policy CX1 //应用隧道策略CX1
接着我们重新查看VPN实例的路由转发表和详细信息
可以看到去往 CX6的路由下一条已经选择了TE隧道了
最后我们抓包来验证实验效果
去往CX6的数据包会携带BGP分配的内层标签和SR分配的外层标签,也就每台设备的SRGB+index。那么标签就为内层:48120+16006+16004+16003,因为CX2为CX1的下一条,所以这个标签已经弹出了,不会出现在表里面,接着到达CX2、CX3、CX4进行剥离、只剩下内层标签,直接由CX4进行转发。
因为在CX6没有配置显式路径和隧道策略,所以CX6的回包是通过BE隧道来回的
接着我们查看回包,由于回包走的是BE隧道,所以标签只有内层标签:48060
8、接着我们在CX6上也配置一个显式路径,名为CX6_CX1,同时配置回包的路径为CX6-CX4-CX5-CX2-CX1,让他走下面回来。
[CX6]explicit-path CX6_CX1 //创建显式路径
[CX6-explicit-path-CX6_CX1] next sid label 16004 type prefix //配置显式路径第一跳
[CX6-explicit-path-CX6_CX1] next sid label 16005 type prefix //配置显式路径第二跳
[CX6-explicit-path-CX6_CX1] next sid label 16002 type prefix //配置显式路径第三跳
[CX6-explicit-path-CX6_CX1] next sid label 16001 type prefix //配置显式路径第四跳
[CX6]tunnel-policy CX6
[CX6-tunnel-policy-CX6] tunnel select-seq sr-te sr-lsp load-balance-number 1 //配置隧道转发方式的顺序为TE然后再选择BE
[CX6]ip vpn-instance huawei //进入VPN实例
[CX6-vpn-instance-huawei]tnl-policy CX6 //应用隧道策略CX1
可以看到去往CX1的路由下一跳已经变成Tunnel口了
接在在CX6的0口进行抓包,除了CX4的标签弹出外,路径和我们配置的显式路径完全一样。
好了我们的实验就到这了,有感兴趣的小伙伴点个赞吧