PF_RING调研及实践
原创
©著作权归作者所有:来自51CTO博客作者我是006的原创作品,请联系作者获取转载授权,否则将追究法律责任
一 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
使用命令确认驱动存在:
使用命令卸载驱动:
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.编译