PE中基于VRF的VPP和FRR信息交互
本文主要解决问题: VPP与FRR的vrf网络通信问题;采用方案是VPP RouterPlugin方案,现不建议采用,可直接使用VPP中TAP映射或VETH的方式实现。
外部网络拓扑如图说是:
1.VPP与Linux kernel交互
PE中内部结构如下图所示:
# 进入docker环境操作
$ docker exec -it vsr-vpp-frr bash
配置完成VPP接管网卡,例如VPP的G0/G1等网卡,再做如下操作。
1.1.VPP中开启router-plugin模块
通过如下命令开启router-plugin模块
$ vppctl enable tap-inject
该命令会为每个VPP数据平面接口创建一个对应linux tap接口。 这些tap网络接口是基于VPP和Linux网络栈的双向交流通道。它们必须在被赋予各自VPP接口相同的IP地址。
如此做,可以用vppctl show tap-inject
命令查看Linux/VPP的接口映射,并合理使用iproute2配置tap接口。
$ vppctl show tap-inject
...
G0 -> vpp3
G1 -> vpp4
...
1.2.配置VPP数据平面
$ vppctl
//创建VRF号为1的表
vpp# ip table add 1
//将连接CE端的G0口绑定到VRF 1上
vpp# set interface ip table G0 1
//启动接口
vpp# set interface state G0 up
vpp# set interface state G1 up
//设置IP地址,G1设置IP后自动绑定到默认VRF 0上面
vpp# set interface ip address G0 10.10.10.1/24
vpp# set interface ip address G1 10.10.20.2/24
//查询接口绑定状态
vpp# show int addr
G0 (up):
L3 10.10.10.1/24 ip4 table-id 1 fib-idx 1
G1 (up):
L3 10.10.20.2/24
1.3.Linux Shell中操作命名空间vrf1
//1.启动网卡vpp0用于连接RR,采用默认命名空间
$ ip link set dev vpp4 up
$ ip addr add 10.10.20.2/24 dev vpp4
//2.netns命令创建vrf空间vrf1,并绑定连接CE的vpp3
$ ip netns add vrf1
$ ip link set dev vpp3 netns vrf1
//3.查询并设置命名空间vrf1中接口
$ ip netns exec vrf1 ip addr
//开启lo网卡用于环回
$ ip netns exec vrf1 ip link set lo up
//开启vpp1网卡用于外部连接
$ ip netns exec vrf1 ip link set vpp3 up
//对tap0网卡设置Ip地址
$ ip netns exec vrf1 ip addr add 10.10.10.1/24 dev vpp3
1.4.实验进行测试
CE节点ping PE 节点,可以ping通,如图所示:
PE节点ping CE节点,如下图所示可以ping通。
# 进行ping测试
$ ip netns exec vrf1 ping 10.10.10.2
2.Linux kernel与FRR交互
LinuxShell中,进入/etc/frr/目录
vi daemons
/*以下内容对应修改
bgpd=yes
zebra_options=" -A 127.0.0.1 -s 90000000 -n"*/
systemctl restart frr
//通过vtysh登录FRR控制接口
# show vrf //查看是否连接内核中netns
#show int vrf vrf1