AF_XDP ====== AF_XDP(eXpress Data Path)是Linux内核v4.18引入的高速抓包框架。该技术通过将入口流量重定向到用户态内存环,从而绕过内核网络协议栈来提升抓包性能。 注意:使用 ``af_xdp`` 模式时,所选网卡将无法用于常规网络通信。 扩展阅读: - https://www.kernel.org/doc/html/latest/networking/af_xdp.html 编译Suricata ------------------ Linux系统 ~~~~~ 该功能需要libxdp和libbpf库支持。从源码构建时还需安装开发文件包。 示例:: dnf -y install libxdp-devel libbpf-devel 只要安装上述库就会自动启用此功能,无需额外配置选项。 可通过 ``--disable-af-xdp`` 参数显式禁用:: ./configure --disable-af-xdp 启动Suricata ----------------- 入侵检测模式 ~~~ 使用af-xdp启动命令如下::: af-xdp: suricata --af-xdp=<网卡名> suricata --af-xdp=igb0 上述示例将从igb0网络接口捕获流量。 AF_XDP配置 -------------------- 以下参数可在suricata.yaml配置文件的"通用捕获设置"章节的 ``af-xdp`` 部分进行配置。 建议线程数设置为等于网卡队列数/CPU核心数。也可选择 ``auto`` 自动根据网卡RSS队列数配置::: af-xdp: threads: <数值> threads: auto threads: 8 高级配置 --------------- af-xdp默认使用预设参数运行,但可通过suricata.yaml调整以下选项: 强制XDP模式 ~~~~~~~~~~~~~~ XDP程序支持两种运行模式: - XDP_DRV:驱动支持AF_XDP时的优选模式 - XDP_SKB:无AF_XDP支持时的回退模式 推荐使用XDP_DRV模式以获得最佳性能::: af-xdp: force-xdp-mode: force-xdp-mode: drv 强制绑定模式 ~~~~~~~~~~~~~~~ 内核优先尝试零拷贝模式(最优),失败时回退到拷贝模式::: af-xdp: force-bind-mode: force-bind-mode: zero 注意:设置为非none值时将禁用自动回退,绑定失败则直接报错。 非对齐内存模式 ~~~~~~~~~~~~~~~~ 支持两种内存对齐模式: - 默认对齐块模式(保证UMEM数据对齐) - 非对齐块模式(使用大页内存) 大页内存最小2MB,最大可达1GB。需确保大页分配在NIC和CPU所在的NUMA节点上。每个线程需要16MB内存空间,可通过 ``cat /proc/meminfo`` 确认大页配置。 启用示例::: af-xdp: mem-unaligned: mem-unaligned: yes Linux v5.11+引入的 ``SO_PREFER_BUSY_POLL`` 选项可实现真轮询模式,减少上下文切换开销。相关配置: 启用忙轮询 ~~~~~~~~~~~~~~~~:: af-xdp: enable-busy-poll: enable-busy-poll: yes 轮询超时 ~~~~~~~~~~~~~~ 设置无数据时的阻塞接收轮询时间(微秒)::: af-xdp: busy-poll-time: <时间值> busy-poll-time: 20 轮询预算 ~~~~~~~~~~~~~~~~ 控制帧批处理量,建议测试调整::: af-xdp: busy-poll-budget: <数值> busy-poll-budget: 64 Linux内核参数 ~~~~~~~~~~~~~~~ 需配合以下两个系统参数使用: - gro-flush-timeout:看门狗计时器超时 - napi-defer-hard-irq:队列扫描次数阈值 示例配置::: af-xdp: gro-flush-timeout: 2000000 napi-defer-hard-irq: 2 硬件配置 --------------- 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 **注意:** 使用特殊低熵哈希键实现对称哈希,详见技术白皮书。 禁用网卡卸载 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 默认启用 ``disable-offloading`` 参数::: capture: #disable-offloading: false 优化流量均衡 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 配置基于源/目的IP的负载均衡::: for proto in tcp4 udp4 ah4 esp4 sctp4 tcp6 udp6 ah6 esp6 sctp6; do ethtool -N eth3 rx-flow-hash $proto sd done 该配置可确保分片流量也能被同一线程处理。