13. 为Linux设置ips/inline¶
13.1. 使用Netfilter设置IP¶
在本指南中,我们将讨论如何在第3层中使用Suricata inline mode 使用 iptables
.
首先,从使用NFQ支持编译Suricata开始。有关说明,请参阅 Ubuntu Installation . 有关NFQ和 iptables
见 NFQ .
要检查您是否在Suricata生成中启用了NFQ,请输入以下命令:::
suricata --build-info
并确保NFS列在输出中。
要使用NFQ模式运行Suricata,必须使用 -q
选项。这个选项告诉Suricata它应该使用哪个队列号。
sudo suricata -c /etc/suricata/suricata.yaml -q 0
13.1.1. iptables配置¶
首先,重要的是要知道你想发送哪些流量到Suricata。有两种选择:
通过计算机的流量
由您的计算机生成的流量。


如果Suricata在网关上运行,并且是为了保护该网关后面的计算机,那么您将处理第一个场景: forward_ing .
如果Suricata必须保护它正在运行的计算机,那么您将处理第二种情况: host (见图2)。
这两种使用Suricata的方法也可以结合使用。
在网关方案中,向Suricata发送流量的最简单规则是:
sudo iptables -I FORWARD -j NFQUEUE
在这种情况下,所有转发的流量都会发送到suricata。
在主人的情况下,这两个是最简单的 iptables
规则;
sudo iptables -I INPUT -j NFQUEUE
sudo iptables -I OUTPUT -j NFQUEUE
可以设置队列号。如果不这样做,默认情况下,队列号将为0。
假设您希望Suricata检查TCP流量,或端口80上的所有传入流量,或目标端口80上的所有流量,您可以这样做:
sudo iptables -I INPUT -p tcp -j NFQUEUE
sudo iptables -I OUTPUT -p tcp -j NFQUEUE
在这种情况下,Surica只检查TCP流量。
sudo iptables -I INPUT -p tcp --sport 80 -j NFQUEUE
sudo iptables -I OUTPUT -p tcp --dport 80 -j NFQUEUE
在本例中,Surica检查端口80上的所有输入和输出。


看看你是否已经 iptables
规则正确确保Suricata正在运行并输入:
sudo iptables -vnL
在这个示例中,您可以看到是否正在记录数据包。

此说明使用 iptables
是将其与IPv4一起使用的方法。要在IPv6中使用它,前面提到的所有命令都必须以 ip6tables
. 也可以让苏瑞塔检查这两种流量。
还有一种方法可以使用 iptables
具有多个网络(和接口卡)。例子:

sudo iptables -I FORWARD -i eth0 -o eth1 -j NFQUEUE
sudo iptables -I FORWARD -i eth1 -o eth0 -j NFQUEUE
选项 -i
(输入) -o
(输出)可与前面提到的所有选项组合。
如果你停止使用Suricata并使用互联网,流量将无法通过。要使internet正常工作,首先删除所有 iptables
规则。
全部删除 iptables
规则,输入:
sudo iptables -F
13.1.2. Nftables配置¶
NFtables配置是直接的,允许将防火墙规则与IPS混合使用。其概念是为IP创建一个专用链,在防火墙规则之后将对其进行评估。如果主表名为 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
13.1.3. NFQUEUE高级选项¶
NFQUEUE机制支持一些有趣的选项。这个 nftables
配置将显示在那里,但功能也在中提供 iptables
.
排队机制的完整语法如下:
nft add rule filter IPS queue num 3-5 options fanout,bypass
此规则将匹配的数据包发送到3个负载平衡队列(从3开始到5结束)。要使用此设置获取Suricata中的数据包,需要在命令行:::
suricata -q 3 -q 4 -q 5
fanout 和 bypass 有两个可用选项:
fanout :当与负载平衡一起使用时,它将使用CPU ID而不是连接哈希作为索引将数据包映射到队列。这样做的目的是,如果每个CPU有一个队列,就可以提高性能。这需要指定total,队列数大于1。
bypass :默认情况下,如果没有用户空间程序在侦听Netfilter队列,则将丢弃要排队的所有数据包。使用此选项时,如果没有程序侦听,队列规则的行为类似于ACCEPT,包将移动到下一个表。
这个 bypass 当Suricata不运行时,选项可用于避免链路停机,但这也意味着阻塞特性将不存在。
13.2. 在第二层设置IP¶
13.2.1. 自动分组IPS模式¶
AFéu包捕获方法支持IPS/Tap模式。在这种模式下,您只需要启动接口。Suricata将负责将数据包从一个接口复制到另一个接口。不 iptables
或 nftables
配置是必需的。
您需要为此模式专用两个网络接口。通过AF_分组接口描述中可用的配置变量来进行配置。
例如,下面的配置将创建一个Suricata作为接口之间的ip eth0
和 eth1
::
af-packet:
- interface: eth0
threads: 1
defrag: no
cluster-type: cluster_flow
cluster-id: 98
copy-mode: ips
copy-iface: eth1
buffer-size: 64535
use-mmap: yes
- interface: eth1
threads: 1
cluster-id: 97
defrag: no
cluster-type: cluster_flow
copy-mode: ips
copy-iface: eth0
buffer-size: 64535
use-mmap: yes
这是使用两个接口的基本af包配置。接口 eth0
将所有接收到的数据包复制到 eth1
因为 copy-* 配置变量:
copy-mode: ips
copy-iface: eth1
上的配置 eth1
对称的:
copy-mode: ips
copy-iface: eth0
设置此模式时,需要考虑以下几个要点:
这种模式的实现依赖于AF_包的零拷贝模式。所以你需要设置 use-mmap 到 yes 在两个接口上。
两个接口上的MTU必须相等:从一个接口到另一个接口的拷贝是直接的,大于MTU的包将被内核丢弃。
设置不同的值 cluster-id 以避免冲突。
任何网卡卸载创建比物理层更大的数据报(如GRO、LRO、TSO)都会导致数据包丢失,因为传输路径无法处理这些数据包。
集合 stream.inline 到 auto 或 yes 所以苏瑞塔切换到阻塞模式。
这个 copy-mode 变量可以采用以下值:
ips :使用drop关键字并删除匹配的数据包。
tap :不发生坠落,Suricata充当桥梁
多线程的捕获方法必须特别注意。由于我们不能使用会生成太大帧的碎片整理,内核内的负载平衡将是不正确的:只有IP的片段不会到达同一流的全功能数据包的同一线程,因为端口信息将不存在。
一种解决方案是使用eBPF负载平衡来实现IP对的负载平衡,而不会出现碎片。使用多线程和eBPF负载平衡的AF_PACKET IPS配置如下所示:
af-packet:
- interface: eth0
threads: 16
defrag: no
cluster-type: cluster_ebpf
ebpf-lb-file: /usr/libexec/suricata/ebpf/lb.bpf
cluster-id: 98
copy-mode: ips
copy-iface: eth1
buffer-size: 64535
use-mmap: yes
- interface: eth1
threads: 16
cluster-id: 97
defrag: no
cluster-type: cluster_ebpf
ebpf-lb-file: /usr/libexec/suricata/ebpf/lb.bpf
copy-mode: ips
copy-iface: eth0
buffer-size: 64535
use-mmap: yes
eBPF文件 /usr/libexec/suricata/ebpf/lb.bpf
磁盘上可能不存在。看到了吗 EBPF和XDP 更多信息。