VPP使用介绍(route、tun、memif、abf)

零、参考文献

        由于是付费文章,我把参考文献放头部,不想购买的可以看参考文献(最全、最完整,如果遇到解决不了的问题还是得去官方文档找答案)。下面的文章是我在项目中运用的经验总结,由于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 documentationhttps://s3-docs.fd.io/vpp/21.10/FD.io VPP: Vector Packet Processinghttps://docs.fd.io/vpp/21.10/

----------------------------------------------------------------------------------------------------------------------

目录(目录看看文章结构就行了,别点,CSDN的目录有毒

一、VPP的安装

二、VPP Run

三、VPP Route

四、VPP中使用TUN和Memif

       1、tun

       2、memif

五、ABF的使用

     1、ACL

     2、ABF


一、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

         项目demo:GitHub - AtaoistPriest/SimpleTunDemo: This is a simple tun demo by Golang.https://github.com/AtaoistPriest/SimpleTunDemo

       2、memif

        memif的使用场景与tun类似,也是为了VPP路由到memif,之后隧道进行处理转发。同样需要最新版22.02的,以支持mode ip。

create interface memif id 1 master mode ip

        使用过程中需要注意,vpp的为master决策。隧道程序那端需要添加正确的domain socket路径。

        使用demo:GitHub - AtaoistPriest/SimpleMemifDemo: This is a simple Memif Demo by Golanghttps://github.com/AtaoistPriest/SimpleMemifDemo

五、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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要出家当道士

打赏是不可能,这辈子都不可能

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值