cisco Linux SRv6 实战踩坑记录
环境:
使用虚拟机
版本不同:原文ubuntu16,本次使用18
apt Source不同:原文使用1807,2101
网络拓扑,改成host1-vpp1-routeA-vpp2-host2
两个虚拟机做vpp1、vpp2,(虚拟机设置-添加-网络适配器,添加4块网卡)
一个虚拟机做中间的routeA
modprobe vrfsysctl -w net.ipv6.conf.all.seg6_enabled=1
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.all.rp_filter=0
一、配置vpp
- 先down掉需要接管的网卡(因为up状态的网卡vpp不接管直接跳过)
机器连接的 PCI 网络设备的 ID,预留ens33
root@wl-virtual-machine:/home/wl# lshw -class network -businfo
Bus info Device Class Description
=====================================================
pci@0000:02:01.0 ens33 network 82545EM Gigabit Ethernet Controller (Copper)
pci@0000:02:02.0 ens34 network 82545EM Gigabit Ethernet Controller (Copper)
pci@0000:02:03.0 ens35 network 82545EM Gigabit Ethernet Controller (Copper)
pci@0000:02:04.0 ens36 network 82545EM Gigabit Ethernet Controller (Copper)
- 修改vpp startup.conf文件,添加内容,接管后面三块网卡
vi /etc/vpp/startup.confdpdk {dev 0000:02:02.0dev 0000:02:03.0dev 0000:02:04.0
}
保存文件,重启 VPP,可以看到:
systemctl restart vpproot@wl-virtual-machine:/etc/vpp# vppctl show pci
Address Sock VID:PID Link Speed Driver Product Name Vital Product Data
0000:02:01.0 0 8086:100f unknown e1000
0000:02:02.0 0 8086:100f unknown vfio-pci
0000:02:03.0 0 8086:100f unknown vfio-pci
0000:02:04.0 0 8086:100f unknown vfio-pci
root@wl-virtual-machine:/etc/vpp# vppctl show interface addr
GigabitEthernet2/2/0 (dn):
GigabitEthernet2/3/0 (dn):
GigabitEthernet2/4/0 (dn):
local0 (dn):
如果显示不了pci driver,就执行(参考)
modprobe vfio-pci
- 通过 Day0 配置文件来保存配置(每次启动不会丢失)
创建/usr/share/vpp/scripts/interface-up.txt
文件,内容(不能加注释)
vpp1
set interface state GigabitEthernet2/2/0 up
set interface ip address GigabitEthernet2/2/0 2001:1a::1/64ip route add ::/0 via 2001:1a::2set interface state GigabitEthernet2/3/0 up
set interface ip address GigabitEthernet2/3/0 10.0.0.1/24set interface state GigabitEthernet2/4/0 up
set interface ip address GigabitEthernet2/4/0 10.1.0.1/24loopback create-interface
set interface ip address loop0 fc00:1::1/64
set interface state loop0 up
vpp2
set interface state GigabitEthernet2/2/0 up
set interface ip address GigabitEthernet2/2/0 2001:2b::1/64ip route add ::/0 via 2001:2b::2set interface state GigabitEthernet2/3/0 up
set interface ip address GigabitEthernet2/3/0 10.0.1.1/24set interface state GigabitEthernet2/4/0 up
set interface ip address GigabitEthernet2/4/0 10.1.1.1/24loopback create-interface
set interface ip address loop0 fc00:2::1/64
set interface state loop0 up
修改配置文件由/etc/vpp/startup.conf
,unix中添加一行
startup-config /usr/share/vpp/scripts/interface-up.txt
重启
systemctl restart vpp
vppctl show interface addr
二、配置Route
使用linux,默认开启Srv6。
存疑,不配置segment的话,中间的路由遇到目的地址为vpp sid应该如何转发。原文档中间的几个route是否做了默认路由。
sysctl -w net.ipv6.conf.all.seg6_enabled=1
sysctl -w net.ipv6.conf.all.forwarding=1
ip -6 a add 2001:1a::2/64 dev ens34# 一端copy routeB的ip
ip -6 a add 2001:2b::2/64 dev ens35
vpp1 ping Route测试连通性
vpp# ping 2001:1a::2 source GigabitEthernet2/2/0
配置路由
#vpp1 --> vpp2
ip -6 route add fc00:a:1:0:1::/128 encap seg6local action End dev ens34
ip -6 route add fc00:2::1a/128 via 2001:2b::1 dev ens35#vpp2 --> vpp1
# 也可以不加这一条双向都用fc00:a:1:0:1::
# ip -6 route add fc00:b:1:0:1::/128 encap seg6local action End dev ens35
ip -6 route add fc00:1::1a/128 via 2001:1a::1 dev ens34
三、控制器配置
暂时跳过
四、实验
(一)Overlay 和 Underlay 整合下的性能测试
具有2个Segment 的 SRv6 Policy 的端到端转发性能
host1-vpp1-route-vpp2-host2
- 配置vpp2
使用vpp sr 一定要配置源地址,参考
vpp# set sr encaps source addr 2001:2b::1
vpp# show sr encaps source addr
SR encaps source addr = 2001:2b::1
# 定义 Segment fc00:2::1a 的操作为 End.DX4,将内部的 IPv4 包转发到 GigabitEthernet1b/0/0 的
10.1.1.2 机器下(即 Tester2)
vpp# sr localsid address fc00:2::1a behavior end.dx4 GigabitEthernet2/4/0 10.1.1.2# 添加一个新的 Policy,包含2个 Segment,先到 Router,最后到 VPP1
vpp# sr policy add bsid fc00:2::999:12 next fc00:b:1:0:1:: next fc00:1::1a encap# 将去往 10.1.0.0/24 的包引导至新定义的 SRv6 Policy
vpp# sr steer l3 10.1.0.0/24 via bsid fc00:2::999:12vpp# show sr policies
SR policies:
[0].- BSID: fc00:2::999:12Behavior: EncapsulationType: DefaultFIB table: 0Segment Lists:[0].- < fc00:b:1:0:1::, fc00:1::1a > weight: 1
-----------
vpp# show sr localsids
SRv6 - My LocalSID Table:
=========================Address: fc00:2::1a/128Behavior: DX4 (Endpoint with decapsulation and IPv4 cross-connect)Iface: GigabitEthernet2/4/0Next hop: 10.1.1.2Good traffic: [0 packets : 0 bytes]Bad traffic: [0 packets : 0 bytes]
--------------------
- 配置vpp1
vpp# set sr encaps source addr 2001:1a::1
vpp# show sr encaps source addr
SR encaps source addr = 2001:1a::1
# 定义 Segment fc00:1::1a 的操作为 End.DX4,将内部的 IPv4 包转发到 GigabitEthernet13/0/0 的
10.1.0.2 机器下(即 Tester1)
vpp# sr localsid address fc00:1::1a behavior end.dx4 GigabitEthernet2/4/0 10.1.0.2# 添加一个新的 Policy,回程直接到 VPP2
vpp# sr policy add bsid fc00:1::999:1a next fc00:a:1:0:1:: next fc00:2::1a encap# 将去往 10.1.1.0/24 的包引导至新定义的 SRv6 Policy
vpp# sr steer l3 10.1.1.0/24 via bsid fc00:1::999:1avpp# show sr policies
SR policies:
[0].- BSID: fc00:1::999:1aBehavior: EncapsulationType: DefaultFIB table: 0Segment Lists:[0].- < fc00:a:1:0:1::, fc00:2::1a > weight: 1
-----------
vpp# show sr localsids
SRv6 - My LocalSID Table:
=========================Address: fc00:1::1a/128Behavior: DX4 (Endpoint with decapsulation and IPv4 cross-connect)Iface: GigabitEthernet2/4/0Next hop: 10.1.0.2Good traffic: [0 packets : 0 bytes]Bad traffic: [0 packets : 0 bytes]
--------------------
如果提示已有localsid。先删除
sr localsid del address fc00:1::1a
补:
# 删除policy
vppctl sr policy del bsid fe01::1a
# 删除steer
vppctl sr steer del l3 10.1.1.0/24 via bsid fe10::1a
- 跳过配置两端的trex。配置两端host的ip、网关、端口。互相ping通。
(二)控制器应用程序实现动态路径调整和策略下发
没有NCS5500或者XTC控制器,跳过计算算路部分。
网络配置
VPP1用3端口直接连接VPP2,创造一条短链路。(在Route上抓包,确定ping的时候不经过Route)
vpp1
vpp# set interface ip address del GigabitEthernet2/3/0 10.0.0.1/24
vpp# set interface ip address GigabitEthernet2/3/0 2001:12::1/64
vpp# show int addr
GigabitEthernet2/2/0 (up):L3 2001:1a::1/64
GigabitEthernet2/3/0 (up):L3 2001:12::1/64
GigabitEthernet2/4/0 (up):L3 10.1.0.1/24
local0 (dn):
loop0 (up):L3 fc00:1::1/64
vpp# ping 2001:12::2 source GigabitEthernet2/3/0#添加路由
vpp# ip route add fc00:2::1a/128 via 2001:12::2
vpp2
vpp# set interface ip address del GigabitEthernet2/3/0 10.0.1.1/24
vpp# set interface ip address GigabitEthernet2/3/0 2001:12::2/64
vpp# show int addr
GigabitEthernet2/2/0 (up):L3 2001:2b::1/64
GigabitEthernet2/3/0 (up):L3 2001:12::2/64
GigabitEthernet2/4/0 (up):L3 10.1.1.1/24
local0 (dn):
loop0 (up):L3 fc00:2::1/64
vpp# ping 2001:12::1 source GigabitEthernet2/3/0#添加路由
vpp# ip route add fc00:1::1a/128 via 2001:12::1
分析代码:
Python实现,main.py。主函数负责循环调用查看算路结果(PathFinder)和下发新的SRv6策略(VPP Controller_CLI)
主程序main.py
pf=PathFinder(xtc["ip"],xtc["username"],xtc["password"],config["node_table"])
配置文件config.json(注意和(一)的配置不同)
VPP1 VPP2的sid,需要提前用vppctl配置到vpp上。(还需要提前配置VPP SR封包源地址)
"node_dx4_sid":["fc00:2::a","fc00:3::a"]
VPP2、VPP1 Intf1目的地址网段
"node_prefix":["10.0.1.0/24","10.0.2.0/24"],
控制器
文件
config.json
{"xtc_node":{"ip":"10.xx.xx.xx","username":"cisco","password":"cisco"},"vpp_node1":{"ip":"192.168.159.154","username":"root","password":"123456"},"vpp_node2":{"ip":"192.168.159.154","username":"root","password":"123456"},"node_list":["node1"],"node_table":{"node1":"192.168.159.160"},"node_sid":{"node1": "fc00:a:1:0:1::"},"node_prefix":["10.1.1.0/24","10.1.0.0/24"],"node_dx4_sid":["fc00:2::1a","fc00:1::1a"]
}
main.py
import jsonimport requests
import paramiko
import time
def load_config():data={}with open('config.json', 'r') as f:data = json.loads(f.read())return dataclass PathFinder(object):def __init__(self,ip,username,password,node_table):self.ip=ipself.username=usernameself.password=passwordself.node_table=node_tableself.ip_table=dict(zip(self.node_table.values(),self.node_table.keys()))passdef _build_url(self):return "http://{}:8080/lsp/compute/simple".format(self.ip)def compute(self,source,dest,method):data={}with open('route.json', 'r') as f:data = json.loads(f.read())return self._calculate_path(data["{}".format(source)])def _calculate_path(self,json):jumps=[]for data in json:jumps.append(self.ip_table[data])return jumpsclass Translator(object):def __init__(self,node_sid):self.node_sid=node_siddef translate(self,node):return self.node_sid[node]class VPPController_CLI(object):"""Multiple ways to configure the VPP controller.This is the implimentation of the CLI APP by VPP."""def __init__(self,ip,username,password):"""Use SSH to connect to vpp instance and configure"""self.client = paramiko.SSHClient()self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())self.client.connect(hostname=ip, port=22, username=username, password=password)passdef show_policy(self):stdin, stdout, stderr = self.client.exec_command("vppctl show sr policies")for line in stdout.readlines():print(line)# print(stdout.read())# output=subprocess.check_output(["vppctl","show","sr","policies"])# for line in output.splitlines():# print(line)def add_policy(self,bsid,sids):assert type(bsid)==strassert type(sids)==list and len(sids)!=0sid_param=""for sid in sids:sid_param=sid_param+"next {} ".format(sid)cmd="vppctl sr policy add bsid {} {} encap".format(bsid,sid_param)print("EXEC: "+cmd)stdin, stdout, stderr = self.client.exec_command(cmd)for line in stdout.readlines():if "already a FIB entry for the BindingSID address" in line:print("ERROR : SID Already exist")return Falseelse:print(line)passdef update_steering(self,ip_prefix,bsid):cmd="vppctl sr steer l3 {} via bsid {}".format(ip_prefix,bsid)stdin, stdout, stderr = self.client.exec_command(cmd)for line in stdout.readlines():print(line)def del_policy(self,bsid):cmd="vppctl sr policy del bsid {}".format(bsid)stdin, stdout, stderr =self.client.exec_command(cmd)print(stdout)passif __name__ == '__main__':print("VPP Demo Controller")config=load_config()xtc=config["xtc_node"]pf=PathFinder(xtc["ip"],xtc["username"],xtc["password"],config["node_table"])# print(pf.compute("node1","node3","latency"))# print(pf.compute("node1","node2","latency"))# print(pf.compute("node2","node1","latency"))# print(pf.compute("node3","node1","latency"))vpp=config["vpp_node1"]vpp1=VPPController_CLI(vpp["ip"],vpp["username"],vpp["password"])vpp=config["vpp_node2"]vpp2=VPPController_CLI(vpp["ip"],vpp["username"],vpp["password"])# vpp.show_policy()# vpp.add_policy("fc00:1::999:10",["fc00:1::a","fc00:2::a"])# # vpp.show_policy()# # vpp.add_policy("fc00:1::999:10",["fc00:1::a","fc00:2::a"])## vpp.del_policy("fc00:1::999:10")# vpp.update_steering("10.0.1.0/24",)# vpp.show_policy()trans=Translator(config["node_sid"])# 更新两条路由# VPPA->VPPBroute1=[]# VPPB->VPPAroute2=[]while True:result1=pf.compute("node1", "node2", "latency")result2=pf.compute("node2", "node1", "latency")changed1=Falsechanged2=Falseif result1!=route1:print("Node1 to Node2 Route updating : {}".format(result1))sid_list=[trans.translate(i) for i in result1]sid_list.append(config["node_dx4_sid"][0])# 写死:R1下发的policy是fc00:1::999:12vpp1.del_policy("fc00:1::999:12")vpp1.add_policy("fc00:1::999:12",sid_list)vpp1.update_steering(config["node_prefix"][0],"fc00:1::999:12")route1=result1changed1=Trueif result2!=route2:print("Node1 to Node3 Route updating : {}".format(result2))sid_list=[trans.translate(i) for i in result2]sid_list.append(config["node_dx4_sid"][1])vpp2.del_policy("fc00:2::999:12")vpp2.add_policy("fc00:2::999:12",sid_list)vpp2.update_steering(config["node_prefix"][1],"fc00:2::999:12")route2=result2changed2=Trueif changed1:print("VPP1 SRv6 Policy Updated:")vpp1.show_policy()if changed2:print("VPP2 SRv6 Policy Updated:")vpp2.show_policy()time.sleep(5)
route.json
经过Route
{"node1": ["192.168.159.160"],"node2": ["192.168.159.160"]
}
不经过Route
{"node1": [],"node2": []
}
执行
安装python3
安装pip3
apt install python3
apt install python3-pip
pip3 install paramiko# 如果出现问题执行
python3 -m pip install --upgrade pip
运行
python3 main.py
五、中间出现的问题:
vpp状态,not enough DPDK crypto resources
——结论:目前不影响
root@wl-virtual-machine:/home/wl# systemctl status vpp
● vpp.service - vector packet processing engineLoaded: loaded (/lib/systemd/system/vpp.service; enabled; vendor preset: enabled)Active: active (running) since Tue 2022-02-15 11:10:42 CST; 11min agoProcess: 2189 ExecStopPost=/bin/rm -f /dev/shm/db /dev/shm/global_vm /dev/shm/vpe-api (code=exited, status=0/SUCCESS)Process: 2190 ExecStartPre=/sbin/modprobe uio_pci_generic (code=exited, status=0/SUCCESS)Main PID: 2191 (vpp_main)Tasks: 2 (limit: 9484)CGroup: /system.slice/vpp.service└─2191 /usr/bin/vpp -c /etc/vpp/startup.conf2月 15 11:10:42 wl-virtual-machine systemd[1]: Starting vector packet processing engine...
2月 15 11:10:42 wl-virtual-machine systemd[1]: Started vector packet processing engine.
2月 15 11:10:42 wl-virtual-machine vpp[2191]: unix_config:475: couldn't open log '/var/log/vpp/vpp.log'
2月 15 11:10:43 wl-virtual-machine vnet[2191]: dpdk: not enough DPDK crypto resources
2月 15 11:10:43 wl-virtual-machine vnet[2191]: dpdk/cryptodev: dpdk_cryptodev_init: Not enough cryptodevs
根据VPP IPSec implementation using DPDK Cryptodev API,startup.conf配置vdev crypto_aesni_mb0,socket_id=1
发现vpp启动失败。
也可能是数量不对
0: dpdk_ipsec_process:1010: not enough DPDK crypto resources, default to OpenSSL
/etc/vpp/startup.conf文件里的参数配置不对:
vdev cryptodev_aesni_mb_pmd0,socket_id=0表示使用dpdk加密的库,一个支持4 core,而我的环境是16core,所以要设置4个。
————————————————
版权声明:本文为CSDN博主「这月色」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42265069/article/details/95475153
cisco Linux SRv6 实战踩坑记录相关推荐
- 编写 Linux shell 脚本 踩坑记录
几年前,抽出一段时间学习了Linux Shell 脚本的学习,用于自动化项目的自动化发布. 如今,几年过去了,忘记的差不多了. 前几天刚写了一个脚本,漏洞百出,将踩过的坑再次记录下来,提醒自己. 1. ...
- ElasticSearch实战踩坑记录
1.ElasticSearch的数据结构中关于Arrays的聚合检索问题? 官方建议Arrays使用Nested(嵌套)方式处理.~
- 陶晶驰串口屏与香橙派linux开发板踩坑记录
一开始我是这么接线的,想着反正香橙派能对外输出5V,这样就不用外部电源了,但是发现指令执行异常,非常诡异,只有第一条指令能执行,后面的不行,重启后,还是这么个轮回. 直到我发现 外部供电接法 - 淘晶 ...
- Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子
Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子 目录 Python打包工具Pyintealler打包py文件为windows exe文件过程 ...
- sonar覆盖率怎么统计的_实战|Java 测试覆盖率 Jacoco插桩的不同形式总结和踩坑记录(上)...
本文为霍格沃兹测试学院优秀学员关于 Jacoco 的小结和踩坑记录.测试开发进阶学习,文末加群. 一.概述 测试覆盖率是老生常谈的话题.因为我测试理论基础不是很好,这里就不提需求.覆盖率等内容,直奔主 ...
- mvn exec: java_实战|Java 测试覆盖率 Jacoco插桩的不同形式总结和踩坑记录(下)
本文为霍格沃兹测试学院优秀学员关于 Jacoco 的小结和踩坑记录.测试开发进阶学习,文末加群. 六.注意事项汇总 修改 JAVA_OPTS 参数时,如果位置不对,可能造成代理无法启动. java - ...
- 安卓 Native+Flutter 应用开发入门资料、亲身实战及踩坑记录
安卓 Native+Flutter 应用开发实战及踩坑记录,练手入门项目:FluLearn 入门资料 第三方共享包检索(国内).第三方共享包检索(国外) Flutter开发环境搭建(中文版).Flut ...
- linux命令行下载cuda,linux 命令行下安装特定版本的 cuda (踩坑记录)
其实可直接看第 4 步的总结...... 实验室服务器 Ubuntu 16.04 系统下原本安装的 cuda 版本是 9.0,硬件条件是一张 1080 Ti 的 GPU,在使用 PyTorch 的过程 ...
- mybatis学习与踩坑记录
mybatis resultmap高级映射 应用场景:如果sql查询的列名和pojo的属性名不一致,可以使用resultMap将列名和pojo的属性名作一个对应关系,就可以映射成功了.(如果返回值为i ...
最新文章
- Noip前的大抱佛脚----字符串
- 使用nginx源代码编译安装lnmp
- laravel auth login 重定向自定义_Laravel学习之路(一):最简单的API 认证(Passport)实践...
- 408. Valid Word Abbreviation有效的单词缩写
- 累积计税法:算一算您一年缴了多少个税
- 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告
- .Net中的多态知识点
- 客座编辑:崔辰州(1976-),男,博士,中国科学院国家天文台研究员、硕士生导师,国家天文台信息与计算中心主任...
- 【Shell教程】二----Shell变量,通配符,转义符
- 苹果地图副总裁_苹果地图表现糟糕 iOS副总裁福斯特难辞其咎
- 一个经典的多线程同步问题
- 2017-3-31/socket
- python3.6.5安装步骤-Ubuntu16.04安装python3.6.5步骤详解
- anylogic中编写java代码_anylogic 使用
- flash 林度_flash怎么制作呢 ?
- 单片机攻略3——C51入门
- TP-LINK路由器如何设置DHCP
- Android电视直播 v5.6,龙龙直播app下载|龙龙直播apk2019官方版下载 v5.6.1 安卓版 - 数码资源网...
- 中国铜行业市场消费量调研及投资潜力预测分析报告2022-2027年
- [转载]JSP与EJB
热门文章
- [行人重识别论文阅读]无监督学习发展与小结
- bmp、jpg转换为icon图像
- C# 使用 Direct2D 实现斜角效果
- Python实现猫脸识别 | 喵主子福利
- 无线降噪蓝牙耳机对比:NANK南卡和苹果AirPods Pro哪个好用?
- 使用Nightwatch.js做基于浏览器的web应用自动测试
- MySQL 数据库管理教程
- CIFAR10攻略:基于TensorFlow2.1
- nexus在docker安装nexus与初始密码问题
- java常见错误Cause java.sql.SQLSyntaxErrorException Table ‘m