一 PF_RING简介

1.与libpcap不同,pf_ring核心思想是通过DMA将网卡流量直接MMAP到用户空间(绕过内核网络协议栈),避免libpcap的网卡->内核,内核→用户空间的方式,压缩拷贝次数,节省了CPU处理时间;

2.pf_ring每创建一个socket便分配一个环形缓冲区(ring_buffer),用户可以通过mmap直接访问ring_buffer,新数据从网卡抓取时可以直接覆盖ring_buffer已被用户读取的空间,如果ring_buffer已满,新数据被丢弃;

3.pf_ring自带的libpcap可与原libpcap应用程序无缝集成,只需增加相关宏定义;

4.使用pf_ring零拷贝功能,需要卸载原机器网卡驱动,并编译安装与原机器型号匹配的pf_ring支持的网卡驱动。

二 PF_RING编译安装及部署

1.pf_ring源码:

2.pf_ring编译安装顺序:

卸载网卡驱动=》编译安装内核=》编译安装库=》编译安装libpcap=》编译安装网卡驱动=》编译安装dap(可选)=》重启机器

3.网卡驱动卸载:

ethtool -i ens192 #ens192使用ifconfig命令查看网卡名称


显示如下:

driver: igb

version: 3.2.6-k

firmware-version: 1.10-0

...

驱动名是igb

使用命令确认驱动存在:

lsmod | grep igb

使用命令卸载驱动:

rmmod igb #执行此步 会导致xshell断开,可以使用串口通信查询目标机器

4.内核编译安装:

#解压压缩包并进入

cd PF_RING-7.8.0/kernel

./configure && make && make install

#也可以直接执行make install 因为解压包时编译好的内核

#安装内核3

insmod pf_ring.ko transparent_mode=1 #安装内核

cat /proc/net/pf_ring/info # 验证内核是否支持pf_ring

显示如下:

 

5.userland库编译及安装(包括libpf_ring.so等):

cd PF_RING-7.8.0/userland/lib

./configure && make && make install

#也可以直接执行make install 因为解压包时编译好的库

6.libpcap库编译及安装(需要卸载原系统自带的libpcap):

#卸载原系统libpcap

rpm -qa libpcap #卸载libpcap包,执行该命令后,系统的/usr/lib64/libpcap.so*会被删除

rpm -e libpcap --nodeps #--nodeps不验证依赖包 -e直接卸载

#安装pf_ring自带libpcap

cd PF_RING-7.8.0/userland/libpcap #libpcap是1.9.1版本和libpcap_1.9.1一样,哪个目录都行

./configure && make && make install

#也可以直接执行make install 因为解压包时编译好的库

安装成功,显示如下:

 

7.编译及安装网卡驱动(在实体机验证通过 虚拟机卸载网卡驱动后在编译安装,重启后出现虚拟机启动不了情况):

cd PF_RING-7.8.0/drivers #这个目录有Makefile

make #如果报pf_ring.h找不到,转下面步骤:

vim /etc/profile

#添加:

C_INCLUDE_PATH=/usr/include/linux #pf_ring.h在此目录里

CPLUS_INCLUDE_PATH=/usr/include/linux

export C_INCLUDE_PATH

export CPLUS_INCLUDE_PATH

#保存退出,执行:

source /etc/profile

cd intel

#选择与原网卡驱动一致的目录,比如igb目录,执行:

cd igb/igb-5.3.18-zc/src

modprobe ptp #此步在insmod之前执行 是igb.ko依赖步骤

insmod igb.ko

modprobe igb

reboot #必须重启机器生效

#注意,压缩包时编译好的驱动,因此可跳过make直接进行安装

8.验证pf_ring库安装成功:

cd PF_RING-7.8.0/userland/examples

./configure && make && make install #这步也可以不做 因为压缩包里是编译好的二进制文件

./pfcount -i eth2

执行功,显示如下:

 

8.pfring-daq-module安装(可选):

cd PF_RING/userland/snort/pfring-daq-module

autoreconf -ivf

./configure

make

cp .libs/daq_pfring.so /usr/local/lib/daq/

三 使用PF_RING测试snort

1.编译安装snort

2.执行指令:

snort --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode passive -i ens192 -v -e

显示:

 

由上图可看成snort已加载了pfring驱动。

四 抓包引擎支持PF_RING

1.确保编译环境已卸载系统自带的libpcap并且已安装pf_ring的libpcap

2.修改.cpp,增加宏定义:

#ifndef HAVE_PF_RING

#define HAVE_PF_RING

#endif

修改makefile,增加:

RUNLIB = ... -lpfring

...

CFLAG = -DHAVE_PF_RING

3.编译