PF_RING 用户指南
Linux 高速包捕获
版本 5.4.4
2012 年 7 月
©2004-12 ntop.org
目 录
PF_RING 用户指南 ......................................................................................................................... 1
4.1.
4.2.
5.1.
1.1.
3.1.
3.2.
3.3.
1. 介绍........................................................................................................................................... 4
PF_RING 用户指南的更新列表 .................................................................................... 4
2. 欢迎进入 PF_RING ................................................................................................................... 5
2.1. 数据包过滤 ................................................................................................................... 6
2.2. 数据包流程 ................................................................................................................... 6
2.3. 数据包汇聚 ................................................................................................................... 6
3. PF_RING 驱动家族 ................................................................................................................... 7
PF_RING 支持的驱动.................................................................................................... 7
TNAPI ............................................................................................................................. 7
DNA ............................................................................................................................... 8
4. DNA 的 Libzero 库 ..................................................................................................................... 8
DNA Cluster ................................................................................................................... 8
DNA Bouncer ................................................................................................................. 9
5. PF_RING 安装 ........................................................................................................................... 9
Linux 内核模块安装 ................................................................................................... 10
6. 运行 PF_RING ......................................................................................................................... 10
6.1. 检查 PF_RING 的设备配置 ......................................................................................... 11
Libpfring 和 Libpcap 安装 ........................................................................................... 11
6.2.
6.3. 应用程序实例 ............................................................................................................. 12
PF_RING 其他模块...................................................................................................... 12
6.4.
7. PF_RING 应用程序开发者...................................................................................................... 13
PF_RING API ................................................................................................................ 13
7.1.
7.2. 返回码 ......................................................................................................................... 14
PF_RING 设备名称约定 .............................................................................................. 14
7.3.
PF_RING:SOCKET 初始化 ......................................................................................... 14
7.4.
PF_RING:设备关闭................................................................................................... 15
7.5.
PF_RING:读取输入数据包 ....................................................................................... 15
7.6.
PF_RING:ring Clusters............................................................................................... 17
7.7.
PF_RING:数据包镜像 ............................................................................................... 17
7.8.
PF_RING:包采样....................................................................................................... 18
7.9.
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.
8.2.
8.2.1.
8.3.1.
8.3.2.
8.3.3.
8.3.4.
8.3.5.
DNA Cluster ................................................................................................................. 28
8.1.1. 主 API .............................................................................................................. 28
8.1.2.
Slave API .......................................................................................................... 31
DNA Bouncer ............................................................................................................... 33
DNA Bouncer API ............................................................................................. 33
8.3. 常用的实例的代码片段 ............................................................................................. 34
DNA Cluster:接收数据包和输出 .................................................................... 34
DNA Cluster:接收一个数据包并且以零拷贝发送 ..................................... 34
DNA Cluster:使用自定义函数替代缺省负载均衡函数 ................................ 35
DNA Cluster:使用扇出函数替代确实的负载均衡函数 ................................ 35
DNA Cluster:不通过 Slave 直接发送一个输入数据包 .................................. 35
9. 编写 PF_RING 插件 ................................................................................................................ 36
9.1. 实现 PF_RING 插件..................................................................................................... 36
PF_RING 插件:处理输入数据包 .............................................................................. 37
9.2.
PF_RING 插件:过滤输入数据包 .............................................................................. 38
9.3.
PF_RING 插件:读取数据包统计 .............................................................................. 38
9.4.
9.5. 使用 PF_RING 插件..................................................................................................... 39
PF_RING 数据结构.......................................................................................................... 39
虚拟机上的 PF_RING DNA ............................................................................................. 41
11.1. BOIS 配置 .................................................................................................................... 41
11.2. VMware ESX 配置 ....................................................................................................... 42
11.3. KVM 配置 .................................................................................................................... 45
10.
11.
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 中用来存储数据包的空间将会
分配给后续的数据包使用。因此,应用程序需要保存一个数据包的备份,必须保留这些刚才
读取的数据包,因为 PF_RING 自身不会保留它们。
2.1. 数据包过滤
PF_RING 支持遗留(以前)的 BPF 过滤器(例如:基于 pcap 应用程序(如:tcpdump)
支持的),同时也支持两种其他的过滤器类型(称为通配符和精准过滤器,这依赖于指定一
些或者全部的过滤元素),这提供给开发者更多的选择。过滤器在内核中的 PF_RING 模块中
进行评估。一些最新的适配器,例如:基于 Intel 82599 的时适配器,或 Silicom 重定向 NIC,
PF_RING 使用专用的 API 调用也支持基于硬件过滤器(例如:pfring_add_hw_rule)。PF_RING
过滤器(除硬件过滤器以外)把一个用户指定的操作告诉 PF_RING 内核模块,在给定的数据
包匹配上时过滤器时执行什么操作,操作包括通过或者不通过过滤器送到用户空间应用程序
中、停止评估过滤器链、镜像数据包等。在 PF_RING 中,数据包镜像可以传输(不修改)匹
配上过滤器的数据包到一个网络接口上(不包括数据包接收的接口)。整个镜像功能在
PF_RING 内核模块的内部实现,上报给用户空间应用程序的唯一动作是没有符合任何数据包
处理的过滤器描述。
2.2. 数据包流程
在把数据包缓冲到 PF_RING ring 队列之前,PF_RING 中数据包流程相当长,如下图所示。
2.3. 数据包汇聚
PF_RING 也可以通过实现两个机制(称为负载均衡和汇聚)来增加数据包捕获应用程序
的性能。这些机制允许应用程序(将并行处理一组数据包)来处理整个数据包流的一部分,
此时发送所有的剩余数据包到另外一些 Cluster 上。这意味着不同打开 PF_RING 套接字的应
用程序可以把它们绑定到执行的 Cluter 编号(利用 pfring_set_cluster)上从而集中力量来分
析数据包的一部分。
通过这种方式,数据包被分配到不同的使用 Cluster 规则(例如:所有属于同一个元组
的数据包)指定的 Cluster 套接字上。这意味着,如果你选择
per-flow 均衡,所有属于同一个流的数据包(例如 5 元组指定的)将会进入同一个应用程序,
然而带有循环提示器的应用程序将接收到相同数据的数据包,但是这不能保证属于相同队列
的数据包由单个应用程序接收。因此,一方面 per-flow 均衡允许你表示应用程序的逻辑,在
这种情况下应用程序将接收所有数据包的一个子集,但是这些流量应该是前后一致的。另一
方面,如果你有一个带有许多流量的指定流,那么处理这些流的应用程序将会被数据包益出,
因此流量将不会大量的均衡。
3. PF_RING 驱动家族
正如前面所描述的,PF_RING 可以工作在标准 NIC 驱动或者专用驱动上面。PF_RING 内
核模块是相同的,但是基于使用的驱动程序,在功能和性能上会有所不同。
3.1. PF_RING 支持的驱动
这些驱动(在 PF_RING/driver/PF_RING-aware 中可用)设计用于提高数据包捕获,它把
数据包直接放入到 PF_RING 中,不经过标准 Linux 数据包分发机制。使用这些驱动程序,你
能使用带有 1 或 2 值的 trasparent_mode。(更多信息请参见文档的下面部分)。
除了 PF_RING 支持的驱动程序(对一些可选的适配器)以外,使用其他驱动程序类型来
进一步改善数据包捕获是可能的。
3.2. TNAPI
驱动程序第一个系列称为 TNAPI(线程 NAPI),它们允许数据包使用 TNAPI 驱动直接激
活的内核线程从而更加有效的存放到 PF_RING 中。TNAPI 驱动设计用于改进数据包捕获,但
是它们不能用于发送数据包,因为 TX 方向上是禁用的。
3.3. DNA
对于那些希望在 CPU 利用率为 0%(拷贝包到主机)情况下需要最大数据包捕获速度的
用户(例如:NAPI 轮询机制不能使用)来说,使用不同类型的驱动(称为 DNA)也是可能
的,它允许数据直接从网络接口上读取,它以零拷贝的方式同步的从 Linux 内核传递到
PF_RING 模块中。
在 DNA 中同时支持 RX 和 TX 操作。当内核旁路的时候,一些 PF_RING 的功能会失效,
它们包括:
1) 内核包过滤(BPF 和 PF_RING 过滤器);
2) PF_RING 内核插件无效;
4. DNA 的 Libzero 库
许多应用程序需要复杂的包处理特征,从 PF_RING 5.4.0 开始,称为 libzero 的库被介绍,
它位于低级 DNA 接口之上,实现了零拷贝数据包处理。libzero 提供两个主要组件:DNA Cluster
和 DNA Bouncer。
4.1. DNA Cluster
DNA Cluster 实现包的汇聚,因此所有属于相同 Cluster 的应用程序可以共享输入数据
包,使用一个简单的负载均衡函数,以零拷贝的方式传输所有的数据包。RSS 的定制实
现允许把数据报文分流道网络适配器的多个队列中。Cluster 允许用于定义过滤、分发