23.5. Netmap

Netmap 是一个面向 Linux 和 FreeBSD 的高速抓包框架。在 Linux 系统中,它作为外部模块提供;而在 FreeBSD 11 及以上版本中,它默认集成于内核中。

23.5.1. 编译 Suricata

23.5.1.1. FreeBSD

在 FreeBSD 11 及以上版本中,NETMAP 默认已集成并启用内核支持。

要为 Suricata 启用 NETMAP 编译,在配置命令中添加 --enable-netmap 参数。无需指定 NETMAP 头文件路径(默认位于 /usr/src/sys/net/)。

23.5.1.2. Linux

Linux 系统默认不包含 NETMAP 支持,需从 github 获取源码。请遵循 NETMAP 代码库中的安装说明进行操作。

安装 NETMAP 后,在配置 Suricata 时添加 --enable-netmap 参数。若头文件未安装在标准路径,需在配置时指定位置。

示例:

./configure --enable-netmap --with-netmap-includes=/usr/local/include/netmap/

23.5.2. 启动 Suricata

当打开网络接口时,netmap 可在接口字符串中使用多种特殊字符作为选项。

Warning

netmap 占用的接口将无法用于常规网络操作。错误配置可能导致系统失联。

23.5.2.1. IDS 模式

Suricata 可通过两种方式使用 netmap 启动:

suricata --netmap=<接口名>
suricata --netmap=igb0

上述示例中,Suricata 将从 igb0 网络接口抓包。创建的线程数取决于网卡的 RSS 队列数量。

suricata --netmap

此方式下,Suricata 会读取配置文件中的 netmap 区块并打开所有列出的接口。

netmap:
  - interface: igb0
    threads: 2
  - interface: igb1
    threads: 4

此配置会同时打开 igb0igb1 接口,分别为它们分配 2 个和 4 个抓包线程。

Warning

此多线程配置仅在网卡支持对称 RSS 哈希时有效。若不支持,请使用下文介绍的 'lb' 方案。

23.5.2.2. IPS 模式

基于 Netmap 的 IPS 模式通过在两接口间创建二层软件桥实现。Suricata 从一个接口读取数据包,经检测后从另一接口转发。

被 IPS 策略拦截的数据包将不被转发。

netmap:
  - interface: igb0
    copy-mode: ips
    copy-iface: igb1
  - interface: igb1
    copy-mode: ips
    copy-iface: igb0

23.5.3. 高级配置

23.5.4. 负载均衡 (lb)

"lb" 是 Seth Hall 开发的负载均衡工具,支持单/多工具流量分发。典型场景是让 Suricata 和 Zeek 并行处理相同流量。

启动 lb:

lb -i eth0 -p suricata:6 -p zeek:6

Note

FreeBSD 11 不支持命名管道前缀。

yaml 配置:

netmap:
  - interface: netmap:suricata
    threads: 6

启动命令:

suricata --netmap=netmap:suricata

接口名称中的 'netmap:' 前缀告知 Suricata 从 netmap 管道而非真实接口读取数据。

Zeek(原 Bro)可配置为启动 6 个实例。两者将获取相同流量副本,且管道数量无需相同。

23.5.4.1. FreeBSD 11 注意事项

FreeBSD 11 不支持命名管道。

启动 lb:

lb -i eth0 -p 6

yaml 配置:

netmap:
  - interface: netmap:eth0
    threads: 6

启动命令:

suricata --netmap

Note

"lb" 工具已随 netmap 捆绑发布。

23.5.4.2. 单网卡方案

当接口进入 NETMAP 模式后,操作系统将无法使用该接口。若需保留接口可用性,可采用特殊的内联模式。

netmap:
  - interface: igb0
    copy-mode: tap
    copy-iface: igb0^
  - interface: igb0^
    copy-mode: tap
    copy-iface: igb0

copy-mode 可设为 'tap' 或 'ips',前者不会根据策略丢弃数据包,后者可能丢弃数据包。

Warning

错误配置可能导致网络中断,请谨慎操作。

Note

此方案也可用于将 NETMAP 与 pf 或 ipfw 等防火墙方案结合使用。

23.5.4.3. VALE 虚拟交换机

VALE 是一种虚拟交换机,可构建纯虚拟网络或虚实混合网络。

纯虚拟配置示例:

vale-ctl -n vi0
vale-ctl -a vale0:vi0
vale-ctl -n vi1
vale-ctl -a vale0:vi1

此时已创建包含 "vi0" 和 "vi1" 两个端口的虚拟交换机 "vale0"。

启动 Suricata 监听其中一个端口:

suricata --netmap=vale0:vi1

23.5.5. 内联 IDS 模式

内联 IDS 与前述 IPS 配置类似,但不会执行 drop 策略。

netmap:
  - interface: igb0
    copy-mode: tap
    copy-iface: igb1
  - interface: igb1
    copy-mode: tap
    copy-iface: igb0

与 IPS 模式的唯一区别在于将 copy-mode 设为 tap