一 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.网卡驱动卸载:
1 | ethtool -i ens192 #ens192使用ifconfig命令查看网卡名称 |
显示如下:
driver: igb
version: 3.2.6-k
firmware-version: 1.10-0
...
驱动名是igb
使用命令确认驱动存在:
使用命令卸载驱动:
1 | rmmod igb #执行此步 会导致xshell断开,可以使用串口通信查询目标机器 |
4.内核编译安装:
1 2 3 4 5 6 7 | #解压压缩包并进入 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等):
1 2 3 | cd PF_RING-7.8.0 /userland/lib . /configure && make && make install #也可以直接执行make install 因为解压包时编译好的库 |
6.libpcap库编译及安装(需要卸载原系统自带的libpcap):
1 2 3 4 5 6 7 | #卸载原系统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.编译及安装网卡驱动(在实体机验证通过 虚拟机卸载网卡驱动后在编译安装,重启后出现虚拟机启动不了情况):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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库安装成功:
1 2 3 | cd PF_RING-7.8.0 /userland/examples . /configure && make && make install #这步也可以不做 因为压缩包里是编译好的二进制文件 . /pfcount -i eth2 |
执行功,显示如下:
8.pfring-daq-module安装(可选):
1 2 3 4 5 | 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.执行指令:
1 | 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,增加宏定义:
1 2 3 | #ifndef HAVE_PF_RING #define HAVE_PF_RING #endif |
修改makefile,增加:
1 2 3 | RUNLIB = ... -lpfring ... CFLAG = -DHAVE_PF_RING |
3.编译