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
此配置会同时打开 igb0
和 igb1
接口,分别为它们分配 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
。