PF_RING 用户指南
Linux 高速包捕获
版本 5.4.4
2012 年 7 月
©2004-12 ntop.org
目 录
PF_RING 用户指南 ......................................................................................................................... 1
1. 介绍........................................................................................................................................... 4
1.1. PF_RING 用户指南的更新列表 .................................................................................... 4
2. 欢迎进入 PF_RING ................................................................................................................... 5
2.1. 数据包过滤 ................................................................................................................... 6
2.2. 数据包流程 ................................................................................................................... 6
2.3. 数据包汇聚 ................................................................................................................... 6
3. PF_RING 驱动家族 ................................................................................................................... 7
3.1. PF_RING 支持的驱动.................................................................................................... 7
3.2. TNAPI ............................................................................................................................. 7
3.3. DNA ............................................................................................................................... 8
4. DNA 的 Libzero 库 ..................................................................................................................... 8
4.1. DNA Cluster ................................................................................................................... 8
4.2. DNA Bouncer ................................................................................................................. 9
5. PF_RING 安装 ........................................................................................................................... 9
5.1. Linux 内核模块安装 ................................................................................................... 10
6. 运行 PF_RING ......................................................................................................................... 10
6.1. 检查 PF_RING 的设备配置 ......................................................................................... 11
6.2. Libpfring 和 Libpcap 安装 ........................................................................................... 11
6.3. 应用程序实例 ............................................................................................................. 12
6.4. PF_RING 其他模块...................................................................................................... 12
7. PF_RING 应用程序开发者...................................................................................................... 13
7.1. PF_RING API ................................................................................................................ 13
7.2. 返回码 ......................................................................................................................... 14
7.3. PF_RING 设备名称约定 .............................................................................................. 14
7.4. PF_RING:SOCKET 初始化 ......................................................................................... 14
7.5. PF_RING:设备关闭................................................................................................... 15
7.6. PF_RING:读取输入数据包 ....................................................................................... 15
7.7. PF_RING:ring Clusters............................................................................................... 17
7.8. PF_RING:数据包镜像 ............................................................................................... 17
7.9. PF_RING:包采样....................................................................................................... 18
7.10. PF_RING:包过滤....................................................................................................... 18
7.10.1. PF_RING:通配符过滤 ................................................................................... 18
7.10.2. PF_RING:哈希过滤 ....................................................................................... 19
7.10.3. PF_RING:BPF 过滤........................................................................................ 20
7.11. PF_RING:NIC 上包过滤 ............................................................................................ 21
7.12. PF_RING:过滤策略................................................................................................... 22
7.13. PF_RING:报文发送 ............................................................................................... 22
7.14. PF_RING:其它函数 ............................................................................................... 23
7.15. C++ PF_RING 接口 ...................................................................................................... 28
8. DNA 的 libzero 库 ................................................................................................................... 28
8.1. DNA Cluster ................................................................................................................. 28
8.1.1. 主 API .............................................................................................................. 28
8.1.2. Slave API .......................................................................................................... 31
8.2. DNA Bouncer ............................................................................................................... 33
8.2.1. DNA Bouncer API ............................................................................................. 33
8.3. 常用的实例的代码片段 ............................................................................................. 34
8.3.1. DNA Cluster:接收数据包和输出 .................................................................... 34
8.3.2. DNA Cluster:接收一个数据包并且以零拷贝发送 ..................................... 34
8.3.3. DNA Cluster:使用自定义函数替代缺省负载均衡函数 ................................ 35
8.3.4. DNA Cluster:使用扇出函数替代确实的负载均衡函数 ................................ 35
8.3.5. DNA Cluster:不通过 Slave 直接发送一个输入数据包 .................................. 35
9. 编写 PF_RING 插件 ................................................................................................................ 36
9.1. 实现 PF_RING 插件..................................................................................................... 36
9.2. PF_RING 插件:处理输入数据包 .............................................................................. 37
9.3. PF_RING 插件:过滤输入数据包 .............................................................................. 38
9.4. PF_RING 插件:读取数据包统计 .............................................................................. 38
9.5. 使用 PF_RING 插件..................................................................................................... 39
10. PF_RING 数据结构.......................................................................................................... 39
11. 虚拟机上的 PF_RING DNA ............................................................................................. 41
11.1. BOIS 配置 .................................................................................................................... 41
11.2. VMware ESX 配置 ....................................................................................................... 42
11.3. KVM 配置 .................................................................................................................... 45
1. 介绍
PF_RING 是一个高速数据包捕获库,它把通用 PC 计算机变成一个有效且便宜的网络测
量工具箱,适用于数据包和现网流量的分析和操作。并且,PF_RING 完整的开发一个市场,
它可以用来创建更有效的应用程序,例如:使用一些代码可以实现流量均衡或者数据包过滤。
本手册分为两个部分:
1) PF_RING 安装和配置;
2) PF_RING SDK(软件开发工具箱)。
1.1. PF_RING 用户指南的更新列表
5.4.0 版本发布(2012 年 5 月)
更新用户指南到 PF_RING 5.4.0 版本
在 DNA 基础上增加灵活的零拷贝数据包处理库(libzero)
5.3.1 版本发布(2012 年 3 月)
更新用户指南到 PF_RING 5.3.1 版本
5.2.1 版本发布(2012 年 1 月)
更新用户指南到 PF_RING 5.2.1 版本
增加管理硬件时钟和时间戳的新 API 函数
增加内核插件调用
5.1 版本发布(2011 年 9 月)
更新用户指南到 PF_RING 5.1.0 版本
4.7.1 版本发布(2011 年 7 月)
更新用户指南到 PF_RING 4.7.1 版本
描述 PF_RING 模块库和一些模块(DAG,DNA)
4.6.1 版本发布(2011 年 3 月)
更新用户指南到 PF_RING 4.6.1 版本
4.6 版本发布(2011 年 2 月)
更新用户指南到 PF_RING 4.6.0 版本
1.1 版本发布(2008 年 1 月)
描述 PF_RING 插件架构
1.0 版本发布(2008 年 1 月)
开始编写 PF_RING 用户指南
2. 欢迎进入 PF_RING
在上图中描述了 PF_RING 的架构,说明如下。
主要的结构单元有:
1) 加速的内核模块,提供低级数据包拷贝到 PF_RING 的环中;
2) 用户空间 PF_RING SDK 提供传输 PF_RING 支持的数据到用户空间的应用程序的功能;
3) 专用的 PF_RING 支持的驱动(可选)允许更进一步的加速数据包捕获,在不通过内
核数据结构的情况下,更有效地把数据包从驱动拷贝到 PF_RING 中。请注意 PF_RING
可以使用任何的 NIC 驱动,但是必须使用这些专用的驱动以便获得最大化的性能,
它们可以在 PF_RING 发行包的 kernel 目录中找到。注意,在使用 transparent_mode
参数来加载 PF_RING 内核模块时,可以选择传递数据包到 PF_RING 的驱动方式。
PF_RING 实现一种新的 socket 类型(称为 PF_RING), 这样用户空间的应用程序可以与
PF_RING 内核模块进行通讯,应用程序获得 PF_RING 的句柄,然后调用本手册后面描述的
API。一个句柄可以绑定到:
1) 物理网络接口;
2) 一个 RX 队列,只是用于多队列网卡适配器;
3) 任何的虚拟接口,这意味着可以在使用的系统接口上接收/发送数据包。
正如上面描述的,你可以从一个创建时分配的内存 ring 中读取数据包。产生的数据包
从内核模块中拷贝到环(ring)中,并且用户空间的应用程序可以读取它。不必执行每个数
据包的内存分配和释放。一旦数据包从 ring 中读取出来,ring 中用来存储数据包的空间将会
分配给后续的数据包使用。因此,应用程序需要保存一个数据包的备份,必须保留这些刚才