来自:https://www.cnblogs.com/lxgeek/p/3893790.html
1.背景
以下为项目经验:
1. 进程安装环境
当前的进程在运行在cgsl V4.03.20
对应的网卡驱动必须是我们自己提供的,igb必须是4.1.2;e1000e是2.0.0.1。(数据不通大多数都是网卡驱动的原因)
PF_RING驱动安装方式:
PF_RING安装分两部分
1) 内核与库
这些是随iEPC的安装程序一起装的,不需要特别处理
2) 驱动
这个需要在服务器上手工安装。在以后的版本会发布一个PF_RING的压缩包,上传到服务器,解压后./PF_RING/drivers/PF_RING_aware/intel
在这个目录会看到各中intel芯片的驱动,我们通过
ethtool -i eth0(网卡名)。 查到自己的网卡类型,如上上图中的drivers:igb。
用igb做例子。 到./PF_RING/drivers/PF_RING_aware/intel/igb/src执行命令
make
make install
rmmod igb && insmod ./igb.ko
通过这3条命令就可以切换到新的PF_RING驱动版本.
注意: 最后一条命令我试过在ssh上一起执行是成功的,不用到服务器上去执行。但因为rmmod igb会断开网络,连续执行不一定能成功。 所以不偷懒的话,还是到服务器上去执行比较安全。
2. 测试网卡收包正确性
目录:
/PF_RING/userland/examples
Make
./pfcount –i eth1
可以看网卡上的包一直在增加,说明运转正常。
上传*.zip
Unzip *.zip
cd ./kernel
make
insmod pf_ring.ko transparent_mode=0
cd ../userland/
cd lib
make clean
./configure
make
make install
cd ../libpcap
make clean
./configure
make
make install
安装完成后需要pf_ring.ko复制到/z/s/libs下,并把insmod pf_ring.ko加入到启动项中。
在 /etc/rc.local 中加入以下语句。注意pf_ring.ko 必须是绝对路径
insmod (路径)/pf_ring.ko transparent_mode=0
编译安装内核
[root@CGSLOnPC pfring]# cd kernel/
[root@CGSLOnPC kernel]# ls
[root@CGSLOnPC kernel]# make
[root@CGSLOnPC kernel]# cat /etc/klinux-release
TAG_CGS_MAIN_V3_02_00_P3
[root@CGSLOnPC kernel]# pwd
/root/lyq/6120/pfring/kernel
[root@CGSLOnPC kernel]# ls
linux Makefile Module.markers Module.symvers pf_ring.c pf_ring.ko pf_ring.mod.c pf_ring.mod.o pf_ring.o plugins README
//============insmod pf_ring.ko
[root@CGSLOnPC kernel]# make install
mkdir -p /lib/modules/2.6.18-164.el5/kernel/net/pf_ring
cp *.ko /lib/modules/2.6.18-164.el5/kernel/net/pf_ring
cp linux/pf_ring.h /usr/include/linux
/sbin/depmod 2.6.18-164.el5
编译安装网卡驱动
[root@CGSLOnPC pfring]# cd drivers/
[root@CGSLOnPC drivers]# ls
DNA Makefile PF_RING_aware README.drivers
[root@CGSLOnPC drivers]# cd PF_RING_aware/
[root@CGSLOnPC PF_RING_aware]# ls
2.6.x broadcom chelsio intel Makefile README
[root@CGSLOnPC PF_RING_aware]# cd intel/
[root@CGSLOnPC intel]# ls
e1000 e1000e igb ixgbe Makefile README
[root@CGSLOnPC intel]# ethtool -i eth0
driver: e1000e
version: 1.0.2-k2
firmware-version: 0.4-3
bus-info: 0000:00:19.0
[root@CGSLOnPC intel]# ls
e1000 e1000e igb ixgbe Makefile README
[root@CGSLOnPC intel]# cd e1000e/
[root@CGSLOnPC e1000e]# ls
e1000e-2.0.0.1
//-----------实际使用的igb的驱动
[root@CGSLOnPC e1000e]# cd e1000e-2.0.0.1/
[root@CGSLOnPC e1000e-2.0.0.1]# ls
COPYING e1000e.7 e1000e.spec pci.updates README src SUMS
[root@CGSLOnPC e1000e-2.0.0.1]# cd src
[root@CGSLOnPC src]# make
[root@CGSLOnPC src]# make install
[root@CGSLOnPC src]# ll
[root@CGSLOnPC src]# insmod e1000e.ko
编译安装lib
[root@CGSLOnPC lib]# chmod -R go+wrx ./
[root@CGSLOnPC lib]# ./configure
[root@CGSLOnPC lib]# make
[root@CGSLOnPC lib]# make install
编译安装libpcap
[root@CGSLOnPC libpcap]# chmod -R go+wrx ./
[root@CGSLOnPC libpcap]# ./configure
[root@CGSLOnPC libpcap]# make
[root@CGSLOnPC libpcap]# make install
编译安装libpcap-1.1.1-ring
[root@CGSLOnPC libpcap-1.1.1-ring]# ./configure
[root@CGSLOnPC libpcap-1.1.1-ring]# make
[root@CGSLOnPC libpcap-1.1.1-ring]# make install
库已经自动拷贝到/usr/local/lib
[root@CGSLOnPC PFringTest]# ls /usr/local/lib
libcares.a libcares.so.2 libpcap.so libpfring.a libsbc-kcs.so libsctp.so lksctp-tools
libcares.la libcares.so.2.1.0 libpcap.so.1 libpfring.so libsctp.a libsctp.so.1 pkgconfig
libcares.so libpcap.a libpcap.so.1.1.1 libsbc-kcs.a libsctp.la libsctp.so.1.0.11 valgrind
Makefile中新增链接库
LIBS += -L../include/fbi/lib_linux64 -lfbclient -L/usr/local/lib/ -lpfring -L/usr/local/lib/ -lpcap
[root@localhost src]# rmmod igb
[root@localhost lib]# cd /proc/net/pf_ring/
dev/ info plugins_info stats/
[root@localhost kernel]# rmmod pf_ring.ko
[root@localhost kernel]# insmod pf_ring.ko
注意网卡必须配置了IP才能pfring
[root@localhost log]# ethtool -i eth1
driver: igb
version: 4.2.16
firmware-version: 1.63, 0x800009fb, 1.791.0
bus-info: 0000:03:00.0
//-------------不同网卡必须配置不同网段地址,否则对端ARP -a会发现两个网卡的mac会相同,导致无法正常通信
[root@localhost log]# ifconfig
eth0 Link encap:Ethernet HWaddr 44:39:C4:52:65:93
inet addr:172.16.0.201 Bcast:172.16.255.255 Mask:255.255.0.0
inet6 addr: fe80::4639:c4ff:fe52:6593/64 Scope:Link
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:88161328 errors:0 dropped:0 overruns:0 frame:0
TX packets:2949088 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12779067453 (11.9 GiB) TX bytes:1436770981 (1.3 GiB)
Interrupt:20 Memory:f7f00000-f7f20000
eth1 Link encap:Ethernet HWaddr 00:1B:21:13:13:25
inet addr:17.16.0.203 Bcast:17.16.0.255 Mask:255.255.255.0
inet6 addr: fe80::21b:21ff:fe13:1325/64 Scope:Link
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:84033962 errors:0 dropped:0 overruns:0 frame:0
TX packets:519 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10422366178 (9.7 GiB) TX bytes:45590 (44.5 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:4946796 errors:0 dropped:0 overruns:0 frame:0
TX packets:4946796 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1016417750 (969.3 MiB) TX bytes:1016417750 (969.3 MiB)
1.从IP得到网卡名
2.pfring_open,2500,PF_RING_DO_NOT_PARSE|PF_RING_DO_NOT_TIMESTAMP
3.pfring_set_direction,rx_only_direction
4.pfring_set_socket_mode,recv_only_mode
5.pfring_set_poll_duaration
6.pfring_enable_ring
7.pfing_loop,循环接收,在回调函数中进行处理,
8.回调函数中收到的是以太网包,含mac地址等。