17. 为Linux设置IPS/内联模式

17.1. 使用Netfilter设置IPS

本指南将讨论如何使用 iptables 在第三层 内联模式 下运行Suricata。

首先,确保编译Suricata时启用了NFQ支持。具体步骤请参考 Ubuntu安装指南 。关于NFQ和 iptables 的更多信息,请参阅 suricata-yaml-nfq

要检查Suricata是否启用了NFQ支持,可以运行以下命令:

suricata --build-info

确保输出中包含NFQ。

要以NFQ模式运行Suricata,需要使用 -q 选项指定队列号:

sudo suricata -c /etc/suricata/suricata.yaml -q 0

17.1.1. Iptables配置

首先,明确需要将哪些流量发送到Suricata。有两种选择:

  1. 经过本机的流量

  2. 本机生成的流量

_images/IPtables.png _images/iptables1.png

如果Suricata运行在网关上用于保护后端设备(第一种场景),需处理 转发 流量。 如果用于保护本机(第二种场景),则处理 主机 流量(见图2)。 两种模式也可以组合使用。

网关场景下最简单的规则是将所有转发流量发送到Suricata:

sudo iptables -I FORWARD -j NFQUEUE

主机场景下的基础规则如下:

sudo iptables -I INPUT -j NFQUEUE
sudo iptables -I OUTPUT -j NFQUEUE

默认队列号为0,也可手动指定。例如,仅检查TCP流量或特定端口的流量:

sudo iptables -I INPUT -p tcp  -j NFQUEUE
sudo iptables -I OUTPUT -p tcp -j NFQUEUE

或针对端口80的流量:

sudo iptables -I INPUT -p tcp --sport 80  -j NFQUEUE
sudo iptables -I OUTPUT -p tcp --dport 80 -j NFQUEUE
_images/iptables2.png _images/IPtables3.png

验证规则是否正确:

sudo iptables -vnL

输出中可查看数据包统计(示例见图)。

_images/iptables_vnL.png

上述命令适用于IPv4,IPv6需将 iptables 替换为 ip6tables 。也可同时检查两种流量。

多网卡场景的配置示例:

sudo iptables -I FORWARD -i eth0 -o eth1 -j NFQUEUE
sudo iptables -I FORWARD -i eth1 -o eth0 -j NFQUEUE

停止Suricata时需清除所有规则以恢复网络:

sudo iptables -F

17.1.2. NFtables配置

NFtables配置更简洁,支持混合防火墙与IPS规则。例如在 filter 表中创建专用链:

nft> add chain filter IPS { type filter hook forward priority 10;}

转发所有流量到Suricata:

nft> add rule filter IPS queue

仅处理eth0与eth1间的流量:

nft> add rule filter IPS iif eth0 oif eth1 queue
nft> add rule filter IPS iif eth1 oif eth0 queue

17.1.3. NFQUEUE高级选项

NFQUEUE支持负载均衡等高级功能。 nftables 配置示例如下( iptables 同样适用):

nft add rule filter IPS queue num 3-5 options fanout,bypass

启动Suricata时需指定多个队列:

suricata -q 3 -q 4 -q 5

选项说明: - fanout:按CPU核心分配队列提升性能 - bypass:无监听程序时放行流量(但会失去拦截功能)

17.2. 设置第二层IPS

17.2.1. AF_PACKET IPS模式

AF_PACKET支持IPS/Tap模式,无需 iptables 配置。需指定两个网卡并通过 copy-* 参数建立关联:

af-packet:
  - interface: eth0
    copy-mode: ips
    copy-iface: eth1
  - interface: eth1
    copy-mode: ips
    copy-iface: eth0

注意事项: - 双端MTU需一致 - 禁用GRO/LRO/TSO等分片卸载功能 - stream.inline 需设为 autoyes

copy-mode 可选值: - ips:支持丢包动作 - tap:仅镜像流量

多线程优化建议使用eBPF负载均衡(需配置 cluster-type: cluster_ebpf 并指定BPF文件路径)。

17.2.2. DPDK IPS模式

配置类似AF_PACKET,需成对设置网卡参数:

dpdk:
  interfaces:
  - interface: 0000:3b:00.1
    copy-mode: ips
    copy-iface: 0000:3b:00.0
  - interface: 0000:3b:00.0
    copy-mode: ips
    copy-iface: 0000:3b:00.1

关键要求: - 双端线程数/MTU相同 - 需配置CPU亲和性

17.2.3. Netmap IPS模式

支持物理网卡配对或单网卡主机栈模式。基础配置示例:

netmap:
  - interface: enp6s0f0
    copy-mode: ips
    copy-iface: enp6s0f1
  - interface: enp6s0f1
    copy-mode: ips
    copy-iface: enp6s0f0

主机栈模式(单网卡)配置:

- interface: enp60s0f0
  copy-mode: ips
  copy-iface: enp6s0f0^

注意事项: - 禁用分片卸载功能 - workers 模式下启用零拷贝

copy-mode 选项与AF_PACKET相同。