概述
关于vpp和dpdk的原理、用途、牛鼻之处等,本文不再赘述,可以参考官网:
https://wiki.fd.io/view/VPP
https://www.dpdk.org/
本文只是简单罗列了如何开局,即主要根据vpp官网的文档,介绍了vpp的简单安装、编译安装、和几个基本功能的测试,写这个的目的有两个:
- 自己做一个记录
- 网关和网上文档主要以ubuntu为例,本文以centos7.7为例,有一点点差别
本文分成两种模式(直接安装和编译安装),主要测试了路由器的最基础的三个功能:dhcp、dns、和nat。
测试用了两台centos工控机,基础信息如下:
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
[root@localhost ~]#
cpu:
Intel(R) Celeron(R) CPU J1900 @ 1.99GHz
memory:4GB
网卡:4张千兆网卡,因为只是千兆网卡,所以这里的测试并不能体现vpp的性能,只是做了一些功能性的测试。
直接安装测试:
根据官网的步骤,安装vpp,在过程中发现会缺少一些依赖,也会需要用到dpdk等,所以总结起来要安装如下软件:
yum install pygpgme yum-utils
yum install vpp
yum -y install vpp-plugins vpp-devel vpp-api-python vpp-api-lua vpp-api-java vpp-debuginfo vpp-devel libvpp0
yum -y install vpp-plugins
yum -y install vpp-devel
yum -y install vpp-api-python
yum -y install vpp-api-lua
yum -y install vpp-api-java
yum -y install vpp-debuginfo
yum -y install vpp-devel
yum -y install libvpp0
yum -y install epel-release
yum -y install mbedtls-devel
yum -y install dpdk
yum -y install dpdk-devel dpdk-tools
编译安装测试:
根据官网的步骤,编译过程如下:
git clone -b v20.05 https://github.com/FDio/vpp.git
cd vpp
make install-dep
make build
make pkg-rpm
测试能否正常运行:
make run
提取rpm安装包:
find -name *.rpm | xargs tar -czvf
安装:
find -name *.rpm | xargs rpm -ivh
需要注意的是,在同一台机器上先直接安装、然后编译安装的话,容易报错,即使是remove之前的安装也报错,感觉应该是remove不干净,所以只有强制安装:find -name *.rpm | xargs rpm -ivh –force
测试
测试步骤包括三部分:
- 机器A的 enp2s0 作为wan口,上联一个普通的路由器,通过dhcp获取地址
- 机器A的 enp3s0 作为lan口,机器A上启动dnsmasq提供dhcp server和dns服务
- 机器B的 enp2s0 作为wan口,上联机器A的enp3s0,实现:dhcp获取地址、域名解析、以及通过机器A访问外网。
备注:
为了方便测试,将机器A和机器B的enp4s0都配置了静态地址:169.254.100.x/24,接到一台傻瓜交换机上,PC通过傻瓜交换机配置静态地址(169.254.100.101)访问两台机器。
wan口作为dhcp client
在机器A上的主机中:
ifconfig enp2s0 down
ifconfig enp3s0 down
然后启动vpp:
systemctl start vpp.service
启动vppctl,输入以下命令:
#set dhcp client del intfc GigabitEthernet2/0/0 hostname vppgate
set dhcp client intfc GigabitEthernet2/0/0 hostname vppgate
set interface state GigabitEthernet2/0/0 up
show interface address
其中 show interface address 可能要执行多次,或者等待几秒十几秒的时候才能拿到地址。
lan口提供dhcp和dns服务
首先在机器A上配置和启动dnsmasq,在默认配置的基础上要修改两点:
1. dhcp-range=192.168.1.50,192.168.1.150,2h
2. dhcp-option=3,192.168.1.1
尤其要注意 (dhcp-option=3,192.168.1.1),结合后面的命令,要确保dhcp分配给下联设备时,指定网关为 192.168.1.1,即vpp的loop0才行。
在vppctl中执行:
loopback create-interface
set int l2 bridge loop0 1 bvi
set int ip address loop0 192.168.1.1/24
set int state loop0 up
set int l2 bridge GigabitEthernet3/0/0 1
set int state GigabitEthernet3/0/0 up
create tap host-if-name lstack host-ip4-addr 192.168.1.2/24
set int l2 bridge tap0 1
set int state tap0 up
执行这些命令后,可以在机器A上看到多了一个lstack的interface,且地址为192.168.1.2,如果dnsmasq.conf中没有配置option3,则dhcp分配出去的网关地址就是192.168.1.2,这一点尤其要注意。
其次将机器A的enp3s0和机器B的enp2s0连接,机器B的enp2s0配置dhcp获取地址的模式,等待几秒或者十几秒后,可以看到enp2s0可以拿到192.168.1.x/24的地址,且通过ip route可以看到默认网关是192.168.1.1,表示dhcp正常了。
此时,在机器B上执行域名解析的动作(比如ping www.baidu.com),可以看到域名解析是正常,但是无法访问外网,这是因为在机器A的vpp中还没有配置nat,配置nat的命令如下:
nat44 add interface address GigabitEthernet2/0/0
set interface nat44 in loop0 out GigabitEthernet2/0/0
最后再去机器B上测试,可以发现可以访问外网了(这里可以通过查询路由表,确保机器B只有一个出口地址enp2s0)。