13. 为Linux设置ips/inline

13.1. 使用Netfilter设置IP

在本指南中,我们将讨论如何在第3层中使用Suricata inline mode 使用 iptables .

首先,从使用NFQ支持编译Suricata开始。有关说明,请参阅 Ubuntu Installation . 有关NFQ和 iptablesNFQ .

要检查您是否在Suricata生成中启用了NFQ,请输入以下命令:::

suricata --build-info

并确保NFS列在输出中。

要使用NFQ模式运行Suricata,必须使用 -q 选项。这个选项告诉Suricata它应该使用哪个队列号。

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

13.1.1. iptables配置

首先,重要的是要知道你想发送哪些流量到Suricata。有两种选择:

  1. 通过计算机的流量

  2. 由您的计算机生成的流量。

_images/IPtables.png _images/iptables1.png

如果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上的所有输入和输出。

_images/iptables2.png _images/IPtables3.png

看看你是否已经 iptables 规则正确确保Suricata正在运行并输入:

sudo iptables -vnL

在这个示例中,您可以看到是否正在记录数据包。

_images/iptables_vnL.png

此说明使用 iptables 是将其与IPv4一起使用的方法。要在IPv6中使用它,前面提到的所有命令都必须以 ip6tables . 也可以让苏瑞塔检查这两种流量。

还有一种方法可以使用 iptables 具有多个网络(和接口卡)。例子:

_images/iptables4.png
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

fanoutbypass 有两个可用选项:

  • fanout :当与负载平衡一起使用时,它将使用CPU ID而不是连接哈希作为索引将数据包映射到队列。这样做的目的是,如果每个CPU有一个队列,就可以提高性能。这需要指定total,队列数大于1。

  • bypass :默认情况下,如果没有用户空间程序在侦听Netfilter队列,则将丢弃要排队的所有数据包。使用此选项时,如果没有程序侦听,队列规则的行为类似于ACCEPT,包将移动到下一个表。

这个 bypass 当Suricata不运行时,选项可用于避免链路停机,但这也意味着阻塞特性将不存在。

13.2. 在第二层设置IP

13.2.1. 自动分组IPS模式

AFéu包捕获方法支持IPS/Tap模式。在这种模式下,您只需要启动接口。Suricata将负责将数据包从一个接口复制到另一个接口。不 iptablesnftables 配置是必需的。

您需要为此模式专用两个网络接口。通过AF_分组接口描述中可用的配置变量来进行配置。

例如,下面的配置将创建一个Suricata作为接口之间的ip eth0eth1 ::

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-mmapyes 在两个接口上。

  • 两个接口上的MTU必须相等:从一个接口到另一个接口的拷贝是直接的,大于MTU的包将被内核丢弃。

  • 设置不同的值 cluster-id 以避免冲突。

  • 任何网卡卸载创建比物理层更大的数据报(如GRO、LRO、TSO)都会导致数据包丢失,因为传输路径无法处理这些数据包。

  • 集合 stream.inlineautoyes 所以苏瑞塔切换到阻塞模式。

这个 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 更多信息。