https://docs.fd.io/vpp/20.01/dd/db5/clicmd_src_vnet_srv6.html
https://www.sdnlab.com/23218.html
VPP版本:20.01
0.前言
VPP(Vector Packet Processing)是思科旗下的一款可拓展的开源框架,提供容易使用的、高质量的交换、路由功能。
VPP全称Vector Packet Processing(矢量数据包处理),最早是Cisco 于 2002年开发的商用代码。之后在2016年Linux基金会创建FD.io开源项目,Cisco将VPP代码的开源版本加入该项目,目前已成为该项目的核心。现在一般来讲的VPP特指 FD.io VPP,即Linux基金会发起的开源项目。这个项目在通用硬件平台上提供了具有灵活性、可扩展强、组件化等特点的高性能IO服务框架。该框架支持高吞吐量、低延迟、高资源利用率的IO服务,并可适用于多种硬件架构(x86/ARM/PowerPC)以及各种部署环境(裸机/VM/容器)。
VPP对于SRv6有着非常好的支持,并且提供高性能。关于SRv6原理及Linux SRv6常见功能VPN、流量工程、服务链。如上图所示,VPP原生已经支持了SRv6,包括常见的SRv6操作。在性能方面,VPP同样出色,比Linux 内核原生支持的SRv6吞吐能力要超出很多;成本方面相比智能网卡则有着巨大优势。目前很多开源项目以及商业项目也选用了VPP,其整体的稳定性和性能得到了广泛的验证。
1. SRv6控制命令归纳
- show sr localsids: 显示所有本地段id号。
vpp#show sr localsids
SRv6 - My LocalSID Table:
=========================
Address: fd01:1::1a
Behavior: DX4 (Endpoint with decapsulation and IPv4 cross-connect)
Iface: eth5
Next hop: 10.1.0.2
Good traffic: [0 packets : 0 bytes]
Bad traffic: [0 packets : 0 bytes]
--------------------
Address: fd01::1:1:a0a:102
Behavior: DX4 (Endpoint with decapsulation and IPv4 cross-connect)
Iface: eth5
Next hop: 10.10.1.2
Good traffic: [0 packets : 0 bytes]
Bad traffic: [0 packets : 0 bytes]
- show sr localsids behaviors: 显示所有本地段id号。
vpp#show sr localsids behaviors
SR LocalSIDs behaviors:
-----------------------
Default behaviors:
End -> Endpoint.
End.X -> Endpoint with Layer-3 cross-connect.
Parameters: '<iface> <ip6_next_hop>'
End.T -> Endpoint with specific IPv6 table lookup.
Parameters: '<fib_table>'
End.DX2 -> Endpoint with decapsulation and Layer-2 cross-connect.
Parameters: '<iface>'
End.DX6 -> Endpoint with decapsulation and IPv6 cross-connect.
Parameters: '<iface> <ip6_next_hop>'
End.DX4 -> Endpoint with decapsulation and IPv4 cross-connect.
Parameters: '<iface> <ip4_next_hop>'
End.DT6 -> Endpoint with decapsulation and specific IPv6 table lookup.
Parameters: '<ip6_fib_table>'
End.DT4 -> Endpoint with decapsulation and specific IPv4 table lookup.
Parameters: '<ip4_fib_table>'
Plugin behaviors:
End.AD -> Endpoint with dynamic proxy to SR-unaware appliance.
Parameters: 'nh <next-hop> oif <iface-out> iif <iface-in>'
End.AM -> Endpoint to SR-unaware appliance via masquerading.
Parameters: 'nh <next-hop> oif <iface-out> iif <iface-in>'
End.AS -> Endpoint with static proxy to SR-unaware appliance.
Parameters: 'nh <next-hop> oif <iface-out> iif <iface-in> src <src-addr> next <sid> [next <sid> ...]'
- show sr policies: 显示所有sr策略。
vpp#show sr policies
SR policies:
[0].- BSID: fd01::1:2:a0a:200
Behavior: Encapsulation
Type: Default
FIB table: 0
Segment Lists:
[0].- < fd01::1:1:a0a:102 > weight: 1
- show sr steering-policies: 显示所有steer引流和对应策略bsid。
vpp# show sr steering-policies
SR steering policies:
Traffic SR policy BSID
L3 10.10.2.0/24 fd01::1:2:a0a:200
- sr localsid: 设置本地段标签,以及终端解析转发的行为
范式:
vpp# sr localsid (del) address XX:XX::YY:YY(fib-table 8) behavior STRING.
创建段路由SG的localSID并绑定一个特殊行为参数:一种格式是localSID IPv6_addr(128b),或者是lSID IPv6 address (fib-table X)。VRF 通过SRv6本地localsid的行为字符串指定行为。
行为:End -> Endpoint. End.X -> Endpoint,表示解压缩和3层交叉连接;参数:'
- sr policy:设置转发策略标签以及每跳标签等
范式:
sr policy [add||del||mod] [bsid 2001::1||index 5] next A:: next B:: next C:: (weight 1) (fib-table 2) (encap|insert)
举例:
SR策略的操作。SR策略可能包含多个SID列表。每个SID列表都有一个权重,默认为1,并用于wECMP (uECMP)。段路由SR策略可能有封装类型或;
一个绑定BindingSID是本地分配的SegmentID。对每个接收的IPv6_DA:BSID包,这种流通信将被引导到SR策略中。add命令将通过第一段列表sl创建一个SR策略;mod命令允许在SR策略中增加、删除或修改已有的段列表标签;del命令允许删除一个SR策略和所有相关的SID列表。
- sr steer:设置转发策略标签以及每跳标签等
范式:
sr steer (del) [l3 <ip_addr/mask>|l2 <sf_if>] via [index <sr_policy_index>|bsid <bsid_ip6_addr>] (fib-table <fib_table_index>).
举例:
Steer a L2 or L3 traffic through an existing SR policy.
Examples:
sr steer l3 2001::/64 via sr_policy index 5
sr steer l3 2001::/64 via sr_policy bsid 2010::9999:1
sr steer l2 GigabitEthernet0/5/0 via sr_policy index 5
sr steer del l3 2001::/64 via sr_policy index 5
- set interface ip table:设置ip接口绑定vrf表
范式:
set interface ip table <interface> <table-id>.
描述:将指定网口加入支持的IPv4 FIB表中(VRF)。这个FIB表必须已通过ip table add 创建。如需显示当前的IPv4 FIB表,使用命令show ip fib。仅在有路由信息被加入该表中,或是表中网口已绑定IP地址(自动添加路由),才会显示该FIB表信息。通过命令show int address 查看端口和vrf表绑定状态。
注意:
在网口IP表被加入指定的FIB表后,再设置IP地址时,需要注意。如果表中加入IP地址后再改变table,这将会产生错误。控制台必须先删除这些地址,再改变表。VPP将不会自动将这些地址从旧表移到新表,因为它不知道该变化是否有效。
范例:
如何将网口增加到IPv4的FIB表中(其中2表示表ID号):
vpp# set ip fib table 2 //1.创建vrf表2
vpp# set interface ip table GigabitEthernet2/0/0 2 //2.将端口绑定vrf表ID号2
vpp# set int state GigabitEthernet2/0/0 2 up //3.启动端口
vpp# set int ip address GigabitEthernet2/0/0 2 10.10.10.1/24 //4.设置端口网段,必须在绑定vrf之后
- show ip6 fib :显示fib信息
范式:
show ip6 fib show ip6 fib [summary] [table <table-id>] [index <fib-id>] [<ip6-addr>[/<width>]] [detail]
概述:
show ip6 fib summary显示概略信息。
show ip6 fib table 显示table表信息,此处设置SRv6策略表不在策略中。
show ip6 fib index 显示指定策略信息路径,可以显示srv6策略,通过fib索引号查询。
2.SRv6测试用例
配置SRv6实现访问控制步骤:
##1.定义Segment fd01:1::1a的操作为End.DX4,将内部的IPv4包转发到eth5的10.1.1.2机器下(即Tester2)
ip table add 1 //创建vrf虚拟路由转发表,用于指定ip4 vrf表1
ip6 table add 1 //创建vrf虚拟路由转发表,用于指定ip6 vrf表1
set interface ip table eth5 1 //将接口绑定vrf表,需要在分配IPv4之前绑定,否则默认绑定vrf id 0.
set interface ip table eth6 1
set int state eth5 up
set int state eth6 up
set int ip address eth5 10.10.1.0/24
set int ip address eth6 10.10.2.0/24
sr localsid address fd01::1:1:0a0a:0a02 behavior end.dx4 eth5 10.10.1.0
//绑定指定索引表vrf的id号
// sr localsid address fd01::1:1:0a0a:0a02 fib-table 1 behavior end.dx4 eth5 10.10.1.0
##2\. #添加一个新的路由策略,包含2个标签Segment fd01::1:1:0a0a:0b01 fd01::1:1:0a0a:0c01
sr policy add bsid fd01::1:1:0a0a:0a01 next fd01::1:1:0a0a:0b01 next fd01::1:1:0a0a:0c01 encap
##3\. # 将去往10.10.2.0/24的包引导至新定义的SRv6 Policy
sr steer l3 10.10.2.0/24 via bsid fd01::1:1:0a0a:0a01
sr policy和sr steer看起来像是跟TE有关,SRv6 BE是不是不需要配置sr policy 和 sr steer