9.2. 数据包捕获

9.2.1. 负载平衡

为了获得最佳性能,Suricata需要以“工人”模式运行。这实际上意味着存在多个线程,每个线程运行一个完整的包管道,每个线程从捕获方法接收数据包。这意味着我们依靠捕获方法在不同的线程上分发数据包。这一点的一个关键方面是,Suricata需要以正确的顺序将流的两侧置于同一线程中。

af_数据包和pf_环捕获方法都有选择“群集类型”的选项。这些默认值为“cluster_flow”,指示捕获方法按流散列(5个元组)。此哈希是对称的。Netmap没有内置的群集流模式。它可以通过使用“lb”工具单独添加:https://github.com/luigrizzo/netmap/tree/master/apps/lb

> WARNING 最近的af_数据包更改“中断”:https://redmine.openinfosefoundation.org/issues/1777这种对称性。“解决这一问题”的工作正在进行中:https://redmine.openinfosefoundation.org/issues/1777 note-7,但目前仍停留在内核上<=4.2或更新到4.4.16+、4.6.5+或4.7+。

在几乎是任何现代NIC的多队列NIC上,需要考虑RSS设置。

9.2.2. RSS

接收端扩展是网卡用来在网卡上的不同队列上分配传入流量的一种技术。这是为了提高性能,但必须认识到它是为正常流量而设计的,而不是为IDS包捕获方案设计的。RSS使用散列算法将传入流量分布到各个队列上。这个哈希通常是 not 对称的。这意味着,当接收到流的两侧时,每一侧都可能结束在不同的队列中。遗憾的是,在部署Surica时,这是使用SPAN端口或TAP时的常见情况。

这里的问题是,通过在不同的队列中拥有流量的两侧,数据包的处理顺序变得不可预测。NIC、驱动程序、内核和Suricata上的时间差异将导致数据包以不同于有线的顺序进入的可能性很大。这特别是关于两个交通方向之间的不匹配。例如,Suricata跟踪TCP 3路握手。由于这个时间问题,SYN/ACK只能在客户端到服务器端已经开始发送数据很久之后才能通过SURICA接收。Suricata会认为此流量无效。

所有支持的捕获方法(如af_数据包、pf_环或netmap)都不能解决这个问题。它将需要缓冲和包重新排序,这是昂贵的。

要查看配置了多少队列:

$ ethtool -l ens2f1
Channel parameters for ens2f1:
Pre-set maximums:
RX:             0
TX:             0
Other:          1
Combined:       64
Current hardware settings:
RX:             0
TX:             0
Other:          1
Combined:       8

有些网卡允许您将其设置为对称模式。英特尔X(L)710卡理论上可以做到这一点,但驱动程序还不能实现这一点(目前正在努力解决这一问题)。另一种解决方法是设置一个特殊的“随机密钥”,使RSS对称。见http://www.ndsl.kaist.edu/~kyoungsoo/papers/tr-symrss.pdf(pdf)。

然而,在大多数情况下,最佳解决方案是将RSS队列的数量减少到1:

例子:

# Intel X710 with i40e driver:
ethtool -L $DEV combined 1

有些驱动程序不支持通过ethtool设置队列数。在某些情况下,有一个模块加载时间选项。阅读驱动程序文档了解详细信息。

9.2.3. 卸载

网卡、驱动程序和内核本身都有各种加速数据包处理的技术。一般来说,这些都必须被禁用。

lro/gro导致将各种较小的包合并成大的“超级包”。这些将需要被禁用,因为它们会破坏dsize关键字以及TCP状态跟踪。

校验和卸载可以在af_数据包和pf_环上保持启用状态,但需要在pcap、netmap和其他设备上禁用。

9.2.4. 建议

阅读您的驱动程序文档!例如,对于i40e,如果操作错误,RSS队列的ethtool更改可能导致内核崩溃。

常规:将RSS队列设置为1或确保RSS哈希是对称的。禁用NIC卸载。

af_packet:1个rss队列,停留在kernel<=4.2上,或者确保您有>=4.4.16、>=4.6.5或>=4.7。例外:如果rss是对称集群,则可以使用“cluster qm”将suricata绑定到rss队列。禁用除RX/TX CSUM以外的NIC卸载。

pf_ring:1 rss队列,使用集群类型“cluster_flow”。禁用除RX/TX CSUM以外的NIC卸载。

netmap:1个RSS队列。虽然没有内置基于流的负载平衡,但是“lb”工具可能会有所帮助。另一个选项是使用“autopp”运行模式。例外:如果RSS是对称的,则负载平衡基于RSS哈希,并且可以使用多个RSS队列。禁用所有NIC卸载。