零、参考文献
由于是付费文章,我把参考文献放头部,不想购买的可以看参考文献(最全、最完整,如果遇到解决不了的问题还是得去官方文档找答案)。下面的文章是我在项目中运用的经验总结,由于VPP的用法有很多,下面的文章主要介绍VPP的安装、VPP的路由功能、VPP的TUN与Memif接口使用和ABF(ACL Based Forward)的使用。其中,ABF是我遇到最坑的,网上的答案基本都是使用VAT这个工具,但我使用没有发挥效果,ACL策略写不进去,好在还有另外一种方法。如果没有您想要的内容请勿购买。VPP - fd.iohttps://wiki.fd.io/view/VPPWhat is the Vector Packet Processor (VPP) — The Vector Packet Processor 20.01 documentation
https://s3-docs.fd.io/vpp/21.10/FD.io VPP: Vector Packet Processing
https://docs.fd.io/vpp/21.10/
----------------------------------------------------------------------------------------------------------------------
目录(目录看看文章结构就行了,别点,CSDN的目录有毒)
一、VPP的安装
此处按照官网的教程来就行,通过添加源在线下载比较方便,源码编译我没试过(没这个需求)。在线安装的版本,ubuntu已经是22.02了,是最新的了,VPP对ubuntu的支持一直很好;但centos 7在线的版本是21.10, centos 8 在线版本好像是19,所以如果想要使用最新的功能,要么换ubuntu,要么源码安装(centos源码安装可行的,我同事安装成功了,可以自己编译出rpm包后可离线安装),见链接(centos7编译源码安装vpp_zby枣菠鱼的博客-CSDN博客),里面也提供了已经编译好的rpm包。还有一点需要注意,安装VPP的时候主机内存最好4G或以上,否则很可能安装失败。
如下链接,centos已经从VPP CI/CD 移除。所以建议还是使用ubuntu或Debian。
Re: [vpp-dev] Centos 8 install problems (mail-archive.com)https://www.mail-archive.com/vpp-dev@lists.fd.io/msg16753.html 使用不同的版本,你需要看不同的版本对应的文档。
Ubuntu - Setup the FD.io Repository — The Vector Packet Processor v22.02-rc0-297-ga3767bda9 documentationhttps://s3-docs.fd.io/vpp/22.02/gettingstarted/installing/ubuntu.html 下面的安装以ubuntu18.04为例,过程和官网介绍一致。
apt-get update
在 /etc/apt/sources.list.d/99fd.io.list 文件中添加如下内容:
deb [trusted=yes] https://packagecloud.io/fdio/master/ubuntu bionic main
Get the key
curl -L https://packagecloud.io/fdio/master/gpgkey | sudo apt-key add -
安装(最后一步,官网多一个vpp-api-python,需要去掉)
sudo apt-get update
sudo apt-get install vpp vpp-plugin-core vpp-plugin-dpdk
sudo apt-get install python3-vpp-api vpp-dbg vpp-dev
二、VPP Run
VPP的启动配置存放在 /etc/vpp/startup.conf文件中。VPP安装完毕后默认是服务自启,使用的是默认的配置。你可以根据自己需求设置配置文件。
详细的配置文件说明见官方文档:VPP Configuration - CLI and ‘startup.conf’ — The Vector Packet Processor 20.01 documentationhttps://s3-docs.fd.io/vpp/21.10/gettingstarted/users/configuring/startup.html#startup 当然你也可以自己启动VPP,并运行自定义配置文件。如下所示:
startUpSelf.conf(官网示例)
unix {
cli-listen /run/vpp/cli-vpp-self.sock
}
api-segment {
prefix vpp1
}
plugins {
plugin dpdk_plugin.so { disable }
}
之后运行VPP
# 关掉自启的VPP
sudo service vpp stop
# 进入配置文件所在目录
cd /etc/vpp
# 运行VPP、并载入自定义配置文件startUpSelf.conf
/usr/bin/vpp -c startUpSelf.conf
开启后,可以通过ps查看进程
ps -eaf | grep vpp
三、VPP Route
如上图所示,A和D两个主机分别位于不同的网段,不相通。接下来我们通过在B主机和C主机上设置VPP路由使得A与D相通。其中B主机的ens33是A主机的默认网关,C主机的ens33是D主机的默认网关。过程中需要关掉B和C主机的系统路由。
sudo sysctl -w net.ipv4.ip_forward=0
接下来我们需要将B主机和C主机的两块物理网卡添加到VPP中,这个过程是由vppctl这个工具完成的。VPP在运行的时候会在 /run/vpp 文件夹中生成一个cli-vpp.sock文件(具体的文件名由VPP配置文件中的cli-listen参数决定,如上我们自定义的名称为cli-vpp-self.sock),运行 /usr/bin/vppctl 并加载这个文件即可。
cd /usr/bin
sudo vppctl -s /run/vpp/cli-vpp-self.sock
vppctl启动后,运行如下命令。
注意:
1、下面的示例,以主机B为例,主机C改一下网络参数即可;
2、vppctl中创建的网卡,设置的网卡名和网络参数(ip、mac)都需要与真实的网卡参数一致。成功创建后VPP会自动在其前面添加host。
# add interface
# 注意此处设置的MAC地址要与主机B的两块物理网卡的MAC地址一致
# 创建host-interface默认使用af_packet抓包,如果对性能由需求,最好使用dpdk。
create host-interface name ens33 hw-addr 00:0c:29:d4:03:5d
create host-interface name ens38 hw-addr 00:0c:29:d4:03:5e
# set interface alive
set int state host-ens33 up
set int state host-ens38 up
# set interface ip
#注意此处设置的IP地址要与主机B的两块网卡ip一致
set int ip address host-ens33 192.168.1.2/24
set int ip address host-ens38 192.168.3.1/24
#set ip router
ip route add 192.168.2.0/24 via 192.168.3.2
在实际使用中,我们可能需要频繁的测试,机器可能会重启好多次。如果每次重启之后都重新配置,太繁琐。好在VPP支持在shell中使用vppctl。
#!/bin/bash
sudo vppctl create host-interface name ens33 hw-addr 00:0c:29:d4:03:5d
sudo vppctl create host-interface name ens38 hw-addr 00:0c:29:d4:03:5e
sudo vppctl set int state host-ens33 up
sudo vppctl set int state host-ens38 up
sudo vppctl set int ip address host-ens33 192.168.1.2/24
sudo vppctl set int ip address host-ens38 192.168.3.1/24
sudo vppctl ip route add 192.168.2.0/24 via 192.168.3.2
四、VPP中使用TUN和Memif
1、tun
我们的项目需要添加TUN模块,即VPP路由的时候需要路由到TUN接口,之后隧道从TUN抓包。但在实际使用中,TUN只能有一个进程操作。如果VPP使用tap创建TUN接口,那么隧道程序则无法使用与设置,所以只能是VPP接入隧道创建的TUN。
由于tun是三层的,创建tun的时候需要在其后添加mode ip。(这个是最新版VPP22.02才有的功能)
create host-inteface name tun0 mode ip
之后即可把host-tun0当做interface进行路由决策,隧道收到路由的包后进行处理后转发。
vppctl ip route add 192.168.4.0/24 via host-tun0
2、memif
memif的使用场景与tun类似,也是为了VPP路由到memif,之后隧道进行处理转发。同样需要最新版22.02的,以支持mode ip。
create interface memif id 1 master mode ip
使用过程中需要注意,vpp的为master决策。隧道程序那端需要添加正确的domain socket路径。
五、ABF的使用
1、ACL
网上的教程大多使用VAT(/usr/bin/vpp-api-test)这个工具管理ACL,但我使用的时候一直无法成功的将ACL策略写进去,很疑惑,应该是我使用的问题,但一直没找到哪里出了问题。这个网上有很多教程,官网也有对命令的详细解释,下面贴几个具有代表性的。VPP/SecurityGroups - fd.iohttps://wiki.fd.io/view/VPP/SecurityGroupsVPP中ACL(访问控制列表)的使用——系列一_turbock的博客-CSDN博客目录〇、前言一、ACL_PLUGIN实现访问控制1.1.ACL_PLUGIN控制命令归纳1.2.ACL_PLUGIN简单实验测试二、CLASSIFY实现访问控制2.1.CLASSIFY中ACL命令归纳2.2.CLASSIFY简单实验测试参考官方文档:https://docs.fd.io/vpp/19.08/clicmd_src_plugins_acl.h...
https://blog.csdn.net/turbock/article/details/100731125VPP中ACL(访问控制列表)的使用——系列二_turbock的博客-CSDN博客目录一、ACL_PLUGIN测试1.三层测试2.黑名单实现3.二层测试二、CLASSIFY测试1.二层测试2.三层测试3.四层测试4.Hex测试:某session中配置多个过滤条件5.多table组成表链测试6.单table配多条session测试一、ACL_PLUGIN测试1.三层测试因为acl_plugin默认采用白名单机制,策略挂...
https://blog.csdn.net/turbock/article/details/102397894 按照他们的教程来,如果顺利应该可以,但我没成功,很遗憾。
我的方法是按照官网提供另一个工具,其实就是vppctl。FD.io VPP: src/plugins/aclhttps://docs.fd.io/vpp/21.10/d0/d37/clicmd_src_plugins_acl.html#clicmd_set_acl-plugin 我提炼了以下,其实主要就是两个命令:
# set acl 添加多个策略,需要以 , 分割
set acl-plugin acl <permit|deny> src <PREFIX> dst <PREFIX> proto X
sport X-Y dport X-Y [tag FOO]
# set interface acl,将 acl 应用到网卡,分两个方向( in 和 out )
set acl-plugin interface <interface> <input|output> <acl INDEX> [del]
2、ABF
ACL设置好之后需要添加到ABF中,进行决策路由,即符合ACL策略的路由到那个接口。
VPP/ABF - fd.iohttps://wiki.fd.io/view/VPP/ABF 主要分为两步,首先添加ABF路由规则,之后绑定到网卡上,期间通过ACL的id和ABF policy的id进行绑定。
# 添加 policy
abf policy [add | del] id <index> acl <index> via ...
# 绑定网卡
abf attach <ip4 | ip6> [del] policy <value> <interface>