23.6. AF_XDP

AF_XDP(eXpress Data Path)是Linux内核v4.18引入的高速抓包框架。该技术通过将入口流量重定向到用户态内存环,从而绕过内核网络协议栈来提升抓包性能。

注意:使用 af_xdp 模式时,所选网卡将无法用于常规网络通信。

扩展阅读:

23.6.1. 编译Suricata

23.6.1.1. Linux系统

该功能需要libxdp和libbpf库支持。从源码构建时还需安装开发文件包。

示例::

dnf -y install libxdp-devel libbpf-devel

只要安装上述库就会自动启用此功能,无需额外配置选项。

可通过 --disable-af-xdp 参数显式禁用::

./configure --disable-af-xdp

23.6.2. 启动Suricata

入侵检测模式 ~~~

使用af-xdp启动命令如下::

af-xdp:
  suricata --af-xdp=<网卡名>
  suricata --af-xdp=igb0

上述示例将从igb0网络接口捕获流量。

23.6.3. AF_XDP配置

以下参数可在suricata.yaml配置文件的"通用捕获设置"章节的 af-xdp 部分进行配置。

建议线程数设置为等于网卡队列数/CPU核心数。也可选择 auto 自动根据网卡RSS队列数配置::

af-xdp:
  threads: <数值>
  threads: auto
  threads: 8

23.6.4. 高级配置

af-xdp默认使用预设参数运行,但可通过suricata.yaml调整以下选项:

23.6.4.1. 强制XDP模式

XDP程序支持两种运行模式: - XDP_DRV:驱动支持AF_XDP时的优选模式 - XDP_SKB:无AF_XDP支持时的回退模式

推荐使用XDP_DRV模式以获得最佳性能::

af-xdp:
  force-xdp-mode: <skb|drv|none>
  force-xdp-mode: drv

23.6.4.2. 强制绑定模式

内核优先尝试零拷贝模式(最优),失败时回退到拷贝模式::

af-xdp:
  force-bind-mode: <copy|zero|none>
  force-bind-mode: zero

注意:设置为非none值时将禁用自动回退,绑定失败则直接报错。

23.6.4.3. 非对齐内存模式

支持两种内存对齐模式: - 默认对齐块模式(保证UMEM数据对齐) - 非对齐块模式(使用大页内存)

大页内存最小2MB,最大可达1GB。需确保大页分配在NIC和CPU所在的NUMA节点上。每个线程需要16MB内存空间,可通过 cat /proc/meminfo 确认大页配置。

启用示例::

af-xdp:
  mem-unaligned: <yes/no>
  mem-unaligned: yes

Linux v5.11+引入的 SO_PREFER_BUSY_POLL 选项可实现真轮询模式,减少上下文切换开销。相关配置:

启用忙轮询 ~~~~~~~~~~~~~~~~:

af-xdp:
  enable-busy-poll: <yes/no>
  enable-busy-poll: yes

23.6.4.4. 轮询超时

设置无数据时的阻塞接收轮询时间(微秒)::

af-xdp:
  busy-poll-time: <时间值>
  busy-poll-time: 20

23.6.4.5. 轮询预算

控制帧批处理量,建议测试调整::

af-xdp:
  busy-poll-budget: <数值>
  busy-poll-budget: 64

23.6.4.6. Linux内核参数

需配合以下两个系统参数使用: - gro-flush-timeout:看门狗计时器超时 - napi-defer-hard-irq:队列扫描次数阈值

示例配置::

af-xdp:
  gro-flush-timeout: 2000000
  napi-defer-hard-irq: 2

23.6.5. 硬件配置

23.6.5.1. Intel网卡设置

通过特定哈希函数模拟对称哈希::

ifconfig eth3 down
ethtool -L eth3 combined 16  # 16核配置
ethtool -K eth3 rxhash on
ethtool -K eth3 ntuple on
ifconfig eth3 up
./set_irq_affinity 0-15 eth3
ethtool -X eth3 hkey 6D:5A... equal 16

注意: 使用特殊低熵哈希键实现对称哈希,详见技术白皮书。

23.6.5.2. 禁用网卡卸载

默认启用 disable-offloading 参数::

capture:
  #disable-offloading: false

23.6.5.3. 优化流量均衡

配置基于源/目的IP的负载均衡::

for proto in tcp4 udp4 ah4 esp4 sctp4 tcp6 udp6 ah6 esp6 sctp6; do
   ethtool -N eth3 rx-flow-hash $proto sd
done

该配置可确保分片流量也能被同一线程处理。