歷史經驗之Linux下PF_RING的編譯和安裝過程

官方網址:http://www.ntop.org/products/pf_ring/
下載網址:http://sourceforge.net/projects/ntop/files/PF_RING/

Linux環境:
Linux version 3.10.0-229.el7.x86_64 ([email protected]) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Fri Mar 6 11:36:42 UTC 2015

1)確認是否安裝PF_RING

如果你已經安裝pf_ring,你可能需要執行:rmmodpf_ring

如果你不確定你是否安裝pf_ring,執行:modinfopf_ring

2)從下載網址下載最新版本的PF_RING:

PF_RING-7.0.0.tar.gz

以root用戶登錄到服務器:

#cd /home
#tar zxf PF_RING-7.0.0.tar.gz
#cd PF_RING-7.0.0

編譯和安裝PF_RING

1)編譯pf_ring內核文件

進入內核模塊目錄:

#cd /home/PF_RING-7.0.0/kernel

編譯pf_ring內核模塊:

#./configure
#make 
#make install

PF_RING內核模塊安裝的目錄:

/lib/modules/3.10.0-229.el7.x86_64/kernel/net/pf_ring

加載pf_ring內核模塊:

#modprobe pf_ring transparent_mode=1

pfring(pf_ring)運行的幾種模式
插入pfring(pf_ring)模塊時可以加入以下參數:

insmod <PF_RING PATH>/kernel/pf_ring.ko [transparent_mode=0|1|2]
[min_num_slots=x][enable_tx_capture=1|0] [ enable_ip_defrag=1|0] [quick_mode=1|0]

其中,transparent_mode指定pfring的運行模式;
transparent_mode=0:數據包從標準接口上來;此模式和一般的libpcap沒有區別,性能甚至沒有一般的libpcap好,建議不用;
transparent_mode=1:數據包從標準接口上來,複製一份到pfring接口中,需要支持pfring的驅動;
transparent_mode=2:純pfring模式,需要支持pfring的驅動,數據包只從pfring上去,一般的libpcap程序不能收到數據包;此模式效率最高;

或者

insmod<PF_RINGPATH>/kernel/pf_ring.ko [transparent_mode=0|1|2] [min_num_slots=x][enable_tx_capture=1|0][enable_ip_defrag=1|0]  [quick_mode=1|0]
insmod /lib/modules/3.10.0-229.el7.x86_64/kernel/net/pf_ring/pf_ring.ko transparent_mode=2

檢查是否加載pf_ring內核模塊:

#lsmod | grep pf_ring

查看加載信息:

#cat /proc/net/pf_ring/info

刪除pf_ring內核模塊:

#rmmod pf_ring

2)編譯pf_ring開發庫

進入到/home/PF_RING-7.0.0/userland/lib目錄下編譯pf_ring庫:

   #cd /home/PF_RING-7.0.0/userland/lib
   #./configure

報錯:checkingif libnuma is present… no

Please install libnuma-dev in order to usePF_RING

解決:需要安裝libnuma-dev庫,可以從光盤或者ISO鏡像中查找numactl*.rpm包使用rpm -ivh命令進行安裝。

   #make
   #make intall

注:編譯完成的pf_ring庫和頭文件可以在/usr/local/include中找到。

注:缺少lib/pf_ring.h頭文件可以在/usr/include/linux/pf_ring.h中找到,或則/home/PF_RING-7.0.0/kernel/linux目錄下找到。

3)編譯支持PF_RING的libpcap庫

   #cd /home/PF_RING-7.0.0/userland/libpcap

   #./configure

   #make
   #make install

注:修改源碼,將pf_ring的內核ring緩衝區設爲10M,默認是2M
源代碼:userland/libpcap-1.8.1/pcap-linux.c
函數:int activate_mmap(pcap_t*handle);

代碼片段:

  3310         if (handle->opt.buffer_size == 0) {

  3311                 /* by defaultrequest 2M for the ring buffer */

  3312                handle->opt.buffer_size = 2*1024*1024;

  3313         } 

注:編譯完成的libpcap庫和頭文件可以在/usr/local/include/pcap中找到。

4)編譯pf_ring示例代碼

   #cd /home/PF_RING-7.0.0/userland/examples
   #make
   #./alldevs
			1. eth0 (PF_RING)
			2. em1 (PF_RING)
			3. br1 (PF_RING)
			4. any (Pseudo-device that captures on all interfaces)
			5. lo (PF_RING)
			6. virbr0 (PF_RING)
			7. eth1 (PF_RING)
			8. em2 (PF_RING)
			9. em3 (PF_RING)
			10. em4 (PF_RING)
			11. usbmon0 (All USB buses)
			12. nflog (Linux netfilter log (NFLOG) interface)
			13. nfqueue (Linux netfilter queue (NFQUEUE) interface)
			14. usbmon1 (USB bus number 1)
			15. usbmon2 (USB bus number 2)

 該目錄下還有一些實用的PF_RING工具:pfcount、pfsend等。
 
		 #./pfcount -i eth0
			Using PF_RING v.7.0.0
			Capturing from eth0 [mac: 90:E2:BA:24:98:A0][if_index: 4][speed: 1000Mb/s]
			# Device RX channels: 8
			# Polling threads:    1
			Dumping statistics on /proc/net/pf_ring/stats/37705-eth0.4
			=========================
			Absolute Stats: [17 pkts total][0 pkts dropped][0.0% dropped]
			[17 pkts rcvd][1'472 bytes rcvd]
			=========================
			
			^CLeaving...
			=========================
			Absolute Stats: [44 pkts total][0 pkts dropped][0.0% dropped]
			[44 pkts rcvd][3'828 bytes rcvd][83.76 pkt/sec][0.06 Mbit/sec]
			=========================
			Actual Stats: [27 pkts rcvd][525.30 ms][51.40 pps][0.00 Gbps]
			=========================			 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

5)編譯和安裝PF_RING支持的驅動

*使用ethtool工具查看網卡的型號,例如:ethtool -i eth0

   #lspci | grep Ethernet

*進入到驅動目錄,注意這裏使用非零拷貝的驅動:

cd /home/PF_RING-7.0.0/drivers/PF_RING_aware/non-ZC-drivers/intel

編譯PF_RING支持的網卡:

#cd e1000/e1000-8.0.35/src
#make && make install

網卡驅動安裝的位置:

 /lib/modules/3.10.0-229.el7.x86_64/kernel/drivers/net/e1000/e1000.ko

卸載和安裝PF_RING驅動:

卸載驅動:# rmmod e1000
安裝驅動:# modprobe e1000
查看驅動:# ethtol -i eth0

注意:當通信網卡也使用該驅動程序時,請務必現場操作,如果使用ssh遠程卸載驅動會造成網絡不能連接。

注:建議採集使用的網卡和通信使用的網卡分別使用不同的驅動。

注:設置網卡名稱和MAC地址,請編譯下面的文件:

/etc/udev/rules.d/70-persistent-net.rules

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

6)總結

編譯和安裝PF_RING的命令整理如下(無需作爲root用戶執行):

#編譯內核

cd /home/PF_RING-7.0.0/kernel
make && sudo make install

#編譯PF_RING庫

cd ../userland/lib
./configure

#編譯libpcap庫

cd ../libpcap-1.8.1
./configure –prefix=/usr/local/pfring&& make && sudo make install

#編譯TCPDUMP

cd ../tcpdump-4.1.1
./configure –prefix=/usr/local/pfring&& make && sudo make install

#更新動態庫

sudo ldconfig

#加載模塊

sudo modprobe pf_ring

#提升到root權限,執行

modinfo pf_ring && cat/proc/net/pf_ring/info

#增加ixgbe模塊的節流率

rmmod ixgbe
modprobe ixgbe InterruptThrottleRate=4000

#爲了符合高速網絡的需要,我們需要增加ring槽位的數量

rmmod pf_ring
modprobe pf_ring transparent_mode=1 min_num_slots=65534 enable_tx_capture=0

使用PF_RING

如果使用支持PF_RING的libpcap的話,記得在應用程序的頭文件中加入#define HAVE_PF_RING定義或CXXFLAGS中加入-DHAVE_PF_RING。

如果直接使用PF_RINGAPI編寫代碼不需要加入上面的定義。

PF_RINGAPI使用請閱讀doc目錄下的UserGuide.pdf文件,或者閱讀userland目錄下examples中的pfcount代碼。

附錄A 編譯PF_RING問題

問題1:./runlex.sh: line 83: flex: command not found;

./runlex.sh: line 118: flex: command not found

回答: sudo yuminstall flex

問題2:make[2]: yacc: Command not found

 answer:sudo yum install bison

問題3:cannot find -lnuma

answer:sudo yum install numactl-devel

對於Redhat 6.3版本需要從網上下載:numactl-devel-2.0.7-3.el6.x86_64.rpm

問題4:grammar.c:(.text+0x44e): undefined reference to `pcap_lex’

answer: 刪除掉老的libpcap 1.0.0之前的版本。

#rpm -aq | grep libpcap  如果存在則刪除它
#yum remove libpcap

問題5:insmod: error inserting ‘pf_ring.ko’: -1 Unknown symbol in module

解決:沒有卸載當前的網卡驅動,導致新的驅動加載不了,因此需要先卸載網卡驅動後再重新進行加載。

問題6: --nodefs: unknown option

解決:rpm --nodeps -e libpcap

附錄B 配置PF_RING

1.加載ixgbe驅動,我們發現設置InterruptThrottleRate爲4000是最優的。

modprobe ixgbe InterruptThrottleRate=4000

2.加載PF_RING驅動,使用透傳模式2,並且設置合理的緩衝區大小。

modprobe pf_ring.ko transparent_mode=2min_num_slots=16384

3.優化以太網設備,關閉影響吞吐量的選項。使用合適的接口替代eth3。

ethtool -C eth3 rx-usecs 1000
ethtool -C eth3 adaptive-rx off
ethtool -K eth3 tso off
ethtool -K eth3 gro off
ethtool -K eth3 lro off
ethtool -K eth3 gso off
ethtool -K eth3 rx off
ethtool -K eth3 tx off
ethtool -K eth3 sg off

4.設置CPU的親和力

爲了讓Snort達到5Gbps吞吐量,我們需要更好的硬件(24核CPU Intel X567),使用PF_RING NAPI或DNA進行加速,選擇使用Silicom網卡。

禁用TX捕獲:insmodpf_ring.ko enable_tx_capture=0
增加ring slots數量,使用透傳模式1:insmod pf_ring.ko enable_tx_capture=0transparent_mode=1 min_num_slots=16384

參考連接:https://blog.csdn.net/weixin_41486034/article/details/106240240

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章