为Linux设置IPS/内联模式 ================================ 使用Netfilter设置IPS ----------------------------- 本指南将讨论如何使用 ``iptables`` 在第三层 `内联模式` 下运行Suricata。 首先,确保编译Suricata时启用了NFQ支持。具体步骤请参考 `Ubuntu安装指南 `_ 。关于NFQ和 ``iptables`` 的更多信息,请参阅 :ref:`suricata-yaml-nfq` 。 要检查Suricata是否启用了NFQ支持,可以运行以下命令: :: suricata --build-info 确保输出中包含NFQ。 要以NFQ模式运行Suricata,需要使用 ``-q`` 选项指定队列号: :: sudo suricata -c /etc/suricata/suricata.yaml -q 0 Iptables配置 ~~~~~~~~~~~~~~~~~~~~~~ 首先,明确需要将哪些流量发送到Suricata。有两种选择: 1. 经过本机的流量 2. 本机生成的流量 .. image:: setting-up-ipsinline-for-linux/IPtables.png .. image:: setting-up-ipsinline-for-linux/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 .. image:: setting-up-ipsinline-for-linux/iptables2.png .. image:: setting-up-ipsinline-for-linux/IPtables3.png 验证规则是否正确: :: sudo iptables -vnL 输出中可查看数据包统计(示例见图)。 .. image:: setting-up-ipsinline-for-linux/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 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 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`:无监听程序时放行流量(但会失去拦截功能) 设置第二层IPS ------------------------- .. _afp-ips-l2-mode: 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` 需设为 `auto` 或 `yes` `copy-mode` 可选值: - `ips`:支持丢包动作 - `tap`:仅镜像流量 多线程优化建议使用eBPF负载均衡(需配置 `cluster-type: cluster_ebpf` 并指定BPF文件路径)。 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亲和性 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相同。