1. 概述
PF_RING是Luca Deri發明的提高內核處理數據包效率,並兼顧應用程序的補丁,如Libpcap和TCPDUMP等,以及一些輔助性程序(如ntop查看並分析網絡流量等)。PF_RING是一種新型的網絡socket,它可以極大的改進包捕獲的速度。並且有如下特征:
1) 可以用於Linux 2.6.18以上的內核;
2) 4.x版本的PF_RING可以直接應用於內核,不需要給內核打補丁;
3) PF_RING驅動可以進行包捕獲的加速;
4) 支持使用商用網絡適配器的10 GB的硬件包過濾
5) 設備驅動無關(推薦使用支持NAPI的網卡(intel網卡)來獲得最好的性能);
6) 基於內核的包捕獲和采樣;
7) Lipcap支持與基於pcap的應用程序的無縫集成;
8) 可以指定上百個頭過濾到BPF中;
9) 內容檢查,以至於只有符合負載過濾的包才能通過;
10)PF_RING的插件可以用於增強包解析和內容過濾;
11)可以工作在混雜模式(經過網卡的報文全部可以被捕獲到);
最新版本6.0.1,下載網址 http://www.ntop.org/products/pf_ring/
最新版本的目錄結構:
Drivers/
Kernel/ 內核有關的補丁
Userland/ 用戶空間代碼
Userland/lib 用戶空間庫用於控制PF_RING
Userland/libpcap-1.1.1-ring PF_RING支持的Libpcap增強庫
Userland/examples/ 包計數應用(使用它作為測試使用)
###
基本庫:
libnuma-dev
yum install numactl-devel
###
2. 編譯
編譯安裝PF_RING之前需要卸載原來的網卡驅動,卸載之前使用ethtool命令查看當前網卡的類型和驅動版本。
ethtool -i eth0 lsmod | grep igb
rmmod igb
注:如果使用ssh遠程卸載驅動會造成網絡不能連接,務必現場操作。
2.1. 編譯內核
解壓縮PF_RING安裝包,進入到Kernel目錄下編譯和安裝內核補丁。
tar zxvf PF_RING-6.0.1.tar.gz cd PF_RING.6.0.1/kernel make make install
insmod pf_ring.ko transparent_mode=1
當PF_RING激活時,會創建/proc/net/pf_ring目錄,使用cat命令查看設置:
cat /proc/net/pf_ring/info
注1:為了編譯PF_RING內核模塊,你需要安裝Linux內核的頭文件(或者內核源代碼)。
2.2. 編譯用戶空間PF_RING庫
進入到用戶空間庫userland/lib下,編譯和安裝。
cd ../userland/lib ./configure make make install
如果需要使用libpcap抓包分析,請卸載之前安裝的libpcap,然后進入/userland/libpcap-1.1.1-ring/目錄下配置、編譯和安裝驅動。
rpm -qa libpcap 查看安裝的libpcap,如果有libpcap則強制卸載 rpm -e libpcap --nodeps cd ../libpcap-1.1.1-ring ./configure make make install
注:為了使用PF_RING的優點,請使用PF_RING使能的libpcap.a重新編譯應用。
進入到userland/examples目錄編譯例子程序。
cd /userland/examples make ./pfcount -i eth0
注:使用drivers/intel/ixgbe下的驅動(支持DNA的ixgbe驅動的網卡)+DNA驅動技術可以達到線速采集,PF_RING模塊必須在DNA驅動之前加載。
2.3. 編譯網卡的驅動
進入到drivers目錄下,根據ethtool -i ethx命令查看的網卡類型和驅動進入指定的目錄進行編譯和安裝。
cd ../../drivers/PF_RING_aware/non-ZC-drivers/intel/e1000/e1000-8.0.35/src make make install
開始安裝驅動
進入/lib/modules/2.6.32-431.el6.x86_64/kernel/net目錄,可以看到有pf_ring目錄,進入到該目錄下進行PF_RING模塊的安裝。
cd cd /lib/modules/2.6.32-431.el6.x86_64/kernel/net insmod pf_ring.ko transparent_mode=1
安裝網卡驅動
進入到目錄/lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net下進行網卡驅動安裝。
insmod e1000.ko 若沒有卸載原有驅動會報錯 modprobe e1000 (只能載入/lib/modules/2.6.32-431.el6.x86_64/中模塊)
安裝完畢,使用dmesg命令查看驅動是否安裝成功,如果成功的話,可以看到:
dmesg
[PR_RING]…… 信息。
PF_RING會安裝一個類型為27的協議簇,可以使用sock(PF_RING, SOCK_RAW,0)打開一個socket,使用libpcap的朋友不需要修改程序,需要重新編譯,鏈接的時候請加上libpfring.so。
3. 使用
使用用戶空間中的PF_RING庫API來編寫代碼,並且使用用戶空間中的libpfring.a和libpcap.a編譯代碼就可以使用PF_RING來提高包捕獲的性能。
請詳細的內容請參考網址:http://www.ntop.org/PF_RING.html
用戶手冊:https://svn.ntop.org/svn/ntop/trunk/PF_RING/doc/UsersGuide.pdf