实验环境:操作系统Centos7.6,原生Linux系统内核版本3.10;
实现租户路由域间通信的方式选择——vrf与netns之间:因为Linux内核自4.8以后才较好支持vrf功能,所以采用vrf方式实现VPP到FRR通信需要升级Linux系统内核;但现有生产环境采用原生3.10版本,升级系统版本会产生不稳定风险,例如vpp通过网卡驱动接管虚拟网卡问题等;同时系统版本3.10已很好支持netns,VPP和FRR对netns的支持也较完善,故初步采用netns方式;
实验相关参考文档https://segmentfault.com/a/1190000020000400。
解决数据平面和控制平面分离:本文并未实现数据平面和控制平面分离问题。对于该问题,官方建议采用VPPSandBox模块进行解决。目前官方只有vpp18.04版本的vppsb,19以上并未支持。官方相关资料显示该问题目前示无多余人在开发,日期为19年7月。
vpp自版本更新到19以上修改较大,很多东西无法支持,需要重新探索。例如我们计划采用的方案vppsb。目前作者正构思解决该问题,需要深入理解内部运行机制。
1.打通VPP->Linux Kernel netns途径
1.1.创建不同命名空间,并关闭待接管网卡;
//创建网络命名空间net7和net8
# ip netns add net7
# ip netns add net8
1.2.创建网卡直通tap方式
该方式使得tap网卡同linux内核中已有网卡通过netlink建立连接,数据包也会在二层就转发;vpp采用 v20.01,通过vppctl控制台登录;
//1.创建tap直连到linux内核网卡指定网络空间net7和net8,并设置内核中网卡名称为g7和g8
vpp# create tap id 7 host-if-name g7 host-ns net7
vpp# create tap id 8 host-if-name g8 host-ns net8
vpp# show tap
//2.VPP中创建vrf,并指定vrf的ID号
vpp# ip table add 7
vpp# ip table add 8
//3.vpp中tap端口绑定对应vrf
vpp# set interface ip table tap7 7
vpp# set interface ip table tap8 8
//4.启动tap端口,并设置ip;若删除或端口换绑定关系,需首先删除IP;
vpp# set interface state tap7 up
vpp# set interface state tap8 up
vpp# set interface ip address tap7 10.10.7.1/24
vpp# set interface ip address tap8 10.10.8.1/24
vpp# show int addr //查看vrf绑定端口情况
1.3.Linux内核中设置对应网卡
# ip netns exec net7 ip link set g7 up
# ip netns exec net8 ip link set g8 up
# ip netns exec net7 ip addr add 10.10.7.2/24 dev g7
# ip netns exec net8 ip addr add 10.10.8.2/24 dev g8
# ip netns exec net7 ip link set lo up
# ip netns exec net8 ip link set lo up
# ip netns list
# ip netns exec net7 ip addr //查看namespace net7的端口绑定情况
# ip netns exec net8 ip addr
//如果需要在netns中直接加入某命令空间netns,可采用如下方法
//ip link add dummy5 type dummy netns ns1
//ip link set eth0 netns ns1
2.打通FRR->Linux Kernel netns途径
通过官方文档可知,Frr中模块zebra支持对多个接口、地址、静态路由的同步;
通过配置/etc/frr/daemons文档,zebra模块添加-n选项可实现frr对netns的支持,如下图所示;随后,zebra会自动同步linux kernel中netns中空间到FRR中;也可通过配置/etc/frr/zebra.conf完成指定VRF,启动时加-f /etc/frr/zebra.conf;
然后重启frr服务, systemctl restart frr;通过vtysh登录CLI并配置;
#1.查看从linux内核netns同步的vrf
root# show vrf
#2.查看已接管netns以及routes等信息
root# show zebra
#3.查看路由信息
root# show ip route vrf net7