在上一篇中,我们尝试了使用VPP实现二层转发,这次我们在试试用VPP来实现三层转发。
环境配置
VPP的安装和部署可以参照这篇。测试环境的拓扑如下图所示:
整体上来说,本次的拓扑与上次的很像;不同的是,为了做三层转发,我们让vnic1和vnic2使用了两个不同网段的IP地址。
安装完VPP之后,执行如下的配置。
创建两对Veth设备
1
2
3
4
5
6
7
|
$ ip link add name vnic1 type veth peer name vnic1vpp
$ ip l set dev vnic1 up
$ ip l set dev vnic1vpp up
$ ip link add name vnic2 type veth peer name vnic2vpp
$ ip l set dev vnic2 up
$ ip l set dev vnic2vpp up
|
创建两个命名空间
1
2
|
$ ip netns add ns1
$ ip netns add ns2
|
将设备移到vpp和命名空间
1
2
3
4
5
6
7
8
9
10
11
12
|
# 将vnic1移到ns1
$ ip l set dev vnic1 netns ns1
# 将vnic2移到ns2
$ ip l set dev vnic2 netns ns2
# 将vnic1vpp和vnic2vpp移到vpp里面
$ vppctl
vpp# create host-interface name vnic1vpp
host-vnic1vpp
vpp# create host-interface name vnic2vpp
host-vnic2vpp
vpp#
|
配置IP地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 设置vnic1的ip地址为10.10.1.1
$ ip netns exec ns1 ip l set lo up
$ ip netns exec ns1 ip l set vnic1 up
$ ip netns exec ns1 ip a add 10.10.1.2/24 dev vnic1
$ ip netns exec ns1 ip r add 10.10.2.0/24 via 10.10.1.1
$ ip netns exec ns1 ip r
10.10.1.0/24 dev vnic1 proto kernel scope link src 10.10.1.2
10.10.2.0/24 via 10.10.1.1 dev vnic1
# 设置vnic2的ip地址为10.10.2.2
$ ip netns exec ns2 ip l set lo up
$ ip netns exec ns2 ip l set vnic2 up
$ ip netns exec ns2 ip a add 10.10.2.2/24 dev vnic2
$ ip netns exec ns2 ip r add 10.10.1.0/24 via 10.10.2.1
$ ip netns exec ns2 ip r
10.10.1.0/24 via 10.10.2.1 dev vnic2
10.10.2.0/24 dev vnic2 proto kernel scope link src 10.10.2.2
|
配置VPP
VPP不配置的情况下,网络是不通的。我们对VPP进行配置,将其配置为一个三层交换机。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
root@vpp-1:~# vppctl
vpp# set interface state host-vnic1vpp up
vpp# set interface state host-vnic2vpp up
# 给host-vnic1vpp/host-vnic2vpp设置ip
vpp# set int ip address host-vnic1vpp 10.10.1.1/24
vpp# set int ip address host-vnic2vpp 10.10.2.1/24
vpp# show int addr
host-vnic1vpp (up):
L3 10.10.1.1/24
host-vnic2vpp (up):
L3 10.10.2.1/24
vpp#
|
测试连通性
配置完vpp之后,我们再次看看网络是否可以通。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
root@vpp-1:~# ip netns exec ns1 ping -c2 10.10.2.1
PING 10.10.2.1 (10.10.2.1) 56(84) bytes of data.
64 bytes from 10.10.2.1: icmp_seq=1 ttl=64 time=7.33 ms
64 bytes from 10.10.2.1: icmp_seq=2 ttl=64 time=5.85 ms
--- 10.10.2.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 5.850/6.590/7.331/0.740 ms
root@vpp-1:~# ip netns exec ns1 ping -c2 10.10.2.2
PING 10.10.2.2 (10.10.2.2) 56(84) bytes of data.
64 bytes from 10.10.2.2: icmp_seq=1 ttl=63 time=9.40 ms
64 bytes from 10.10.2.2: icmp_seq=2 ttl=63 time=8.28 ms
--- 10.10.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 8.277/8.838/9.400/0.561 ms
# 从vnic2在ping下vnic1
root@vpp-1:~# ip netns exec ns2 ping -c2 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 56(84) bytes of data.
64 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=0.990 ms
64 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=8.25 ms
--- 10.10.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.990/4.620/8.250/3.630 ms
root@vpp-1:~# ip netns exec ns2 ping -c2 10.10.1.2
PING 10.10.1.2 (10.10.1.2) 56(84) bytes of data.
64 bytes from 10.10.1.2: icmp_seq=1 ttl=63 time=11.1 ms
64 bytes from 10.10.1.2: icmp_seq=2 ttl=63 time=9.92 ms
--- 10.10.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 9.917/10.484/11.052/0.567 ms
|
从上面的结果可以看出,我们使用vpp作为路由器,实现三层转发,vnic1和vnic2是可以通信了。
参考资料
- https://s3-docs.fd.io/vpp/22.06/gettingstarted/progressivevpp/index.html
- https://s3-docs.fd.io/vpp/22.06/gettingstarted/progressivevpp/routing.html
- https://blog.51cto.com/u_15301988/5181050