suricata文档中有关ips的内容:https://www.jianshu.com/p/7cf491575cec
一、简介
在IPS模式下,您可以使用以下action阻止两个网络接口之间桥接之间的流量:
1.Drop
包含签名的报文将被立即丢弃,不再继续发送。接收方没有收到消息,导致超时。一个流的所有后续数据包将被丢弃。
2.Reject
积极拒绝分组,接收器和发件人接收拒绝数据包。如果数据包关注TCP,则将是一个重置包(reset-packet),否则它将是所有其他协议的ICMP错误数据包。
Note: Suricata在两种IPS模式下都会产生alert。
二、分类
要启用suricata的ips或者inline模式,可以采用下面几种策略:
NFQ
使用linux的Netfilter工具(即iptables)。
iptables工具详解见:https://www.jianshu.com/p/a1e92d3aaffc
NFQ支持多个队列处理,您应该在iptables规则和suricata命令行选项中显式指定。例如,您可以使用NFQ配置负载均衡,如下所示:
iptables -A INPUT -j NFQUEUE --queue-balance 0:3
suricata -c /etc/suricata/suricata.yaml -q 0 -q 1 -q 2 -q 3
AF_PACKET
是layer 2 Linux bridge,支持自动负载平衡以获得更好的性能。
PF_RING
抓包性能较强,如果您的NIC也支持零拷贝(ZC)模式,请通过PF_RING ZC提高您的性能。注意,PF_RING ZC功能是付费的。
三、NFQ详解
NFQUEUE是一个IPTables和IP6Tables目标实体,其将数据包的决定委托给IP等用户空间软件。
启动NFQ功能:
1.安装netfilter工具包:
sudo apt-get -y install libnetfilter-queue-dev libnetfilter-queue1 libnfnetlink-dev libnfnetlink0
2.configure suricata源码时添加选项后缀:
--enable-nfqueue
3.build以及install
4.配置iptables:
(1)要扫描桥接数据包,请添加规则:
sudo iptables -I FORWARD -j NFQUEUE
(2)要使用Repeat Suricata NFQ模式,请在下面添加规则,指定您需要的源链:
iptables -I FORWARD -m mark ! --mark $MARK/$MASK -j NFQUEUE
此规则仅在数据包处理之后的SURICATA中没有设置的指定标记时,才将数据包转发到NFQUEUE。
如果停止Suricata,则不会处理进入NFQueue的数据包,结果将不会进一步传递。
5.在suricata.yaml中配置suricata的NFQ模式:
Accept
在默认的NFQ模式下,Suricata会生成终端验证:pass或drop。其余的IPTables规则不会检查数据包。
Repeat
Suricata产生非终端判决,并标记将在IPTables的第一个规则中再次重新加注的数据包。将以下规则添加到iptables:
iptables -I FORWARD -m mark ! --mark $MARK/$MASK -j NFQUEUE
Route
若要在接受决定后将数据包发送到另一个队列,请将mode设置为route并设置route-queue值。使用路由模式,可以在同一个虚拟机上使用多个网络扫描仪扫描数据包。
配置好的一个示例如下:
nfq:
mode: accept # nfq mode: accept, repeat, route
repeat-mark: 1 # used for repeat mode to mark a packet
repeat-mask: 1 # used for repeat mode to mark a packet
route-queue: 2 # for 'route' mode
batchcount: 20 # max length of a batching verdict cache
fail-open: yes # a packet is accepted when queue is full
6.启动Suricata以过滤NFQueue的数据包:
suricata -c /etc/suricata/suricata.yaml -q 0 -D
四、AF_PACKET模式详解
AF_PACKET通过将报文从一个接口复制到另一个接口(并反向复制),在两个接口之间建立了一个软件桥。
启用AF_PACKET:
1.在suricata.yaml配置文件中编辑af-packet部分:
af-packet:
- interface: eth0
threads: auto
defrag: yes
cluster-type: cluster_flow
cluster-id: 98
copy-mode: ips
copy-iface: eth1
buffer-size: 64535
use-mmap: yes
- interface: eth1
threads: auto
cluster-id: 97
defrag: yes
cluster-type: cluster_flow
copy-mode: ips
copy-iface: eth0
buffer-size: 64535
use-mmap: yes
Cluster-ID用于在负载平衡时为相应的接口进行分组线程。对于每个接口,Cluster-ID值应该是不同的。
2.启动suricata时增加--af-packet选项后缀:
suricata -c /etc/suricata/suricata.yaml --af-packet -D
3.验证Suricata是否已打开IPS模式
(1)修改/etc/suricata/rules/test.rules文件中的测试规则,以丢弃或拒绝数据包:
drop http any any -> any any (msg:"Alarm detected"; content:"Alarm"; nocase; classtype:policy-violation; sid:1; rev:1;)
or
reject http any any -> any any (msg:"Alarm detected"; content:"Alarm"; nocase; classtype:policy-violation; sid:1; rev:1;)
(2)在IPS VM上查看目标接口ETH1上的HTTP流量:
sudo tcpdump -i eth1 tcp port -A -w tcpdump.output
(3)使用IPS VM上的Alarm Word下载测试文件。例如:
wget http:///test
(4)终止tcpdump,并在tcpdump输出日志(包含到目的接口eth1的桥接流量)中验证带有“Alarm”字的测试文件是否被IPS阻断。
五、PF_RING模式详解
PF_RING是一个Linux网络套接字,它使用NAPI将数据包从网卡复制到PF_RING循环缓冲区,然后用户空间应用程序从环读取数据包。
开启PF_RING:
1.安装PF_RING包:
sudo apt-get install build-essential bison flex linux-headers-$(uname -r) libnuma-dev
2.下载最新的PF_RING库,提取并构建该库:
wget http://sourceforge.net/projects/ntop/files/PF_RING/PF_RING-6.2.0.tar.gz
tar -xvzf PF_RING-6.2.0.tar.gz
cd PF_RING-6.2.0/
make
cd kernel; sudo make install
cd ../userland/lib; sudo make install
cd ../userland/libpcap; ./configure; make
sudo cp libpcap* /usr/local/lib/; sudo cp pcap.h /usr/local/include/
请确认Suricata在配置时可以找到新的libpcap库。例如,在/usr/local/lib/目录下。否则,您将看到以下警告消息:WARNING! libcap-ng library not found。
3.验证PF_Ring Linux内核模块已成功加载:
modinfo pf_ring
cat /proc/net/pf_ring/info
4.使用--enable-pfring选项和库的路径配置Suricata,并包含头文件。例如:
LIBS="-lrt -lnuma"
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
--enable-pfring --with-libpfring-includes=/usr/local/include \
--with-libpfring-libraries=/usr/local/lib
5.build & install
make && make install
6.采用PF_RING模式开启suricata:
sudo suricata --pfring-int=eth0 --pfring-cluster-id=99 \
--pfring-cluster-type=cluster_flow \
-c /etc/suricata/suricata.yaml -D
7.如果又需要,可以在suricata中优化PF_RING。yaml。eth0接口默认为开启状态:
pfring:
- interface: eth0
threads: 1
cluster-id: 99
cluster-type: cluster_flow
8.测试suricata的ids模式
(1)创建/etc/suricata/rules/test.rules文件,并写入以下规则:
alert http any any -> any any (msg:"Alarm detected"; content:"Alarm"; nocase; classtype:policy-violation; sid:1; rev:1;)”
(2)将test.rules添加到suricata.yaml配置文件中的规则列表中。
(3)在守护进程模式下手动启动Suricata:
sudo suricata --pfring-int=eth0 --pfring-cluster-id=99 \
--pfring-cluster-type=cluster_flow \
-c /etc/suricata/suricata.yaml -D
或者在不重启Suricata的情况下更新活动规则集:
sudo kill -USR2
(4)确认Suricata .log在Suricata启动后没有错误:
tail -f /etc/suricata/suricata.log
(5)发送任何带有"Alarm"字段的HTTP请求。例如:
curl http://google.com/Alarm
(6)查看Fast.log以验证Suricata是否生成警报消息:检测到警报:
tail -f /etc/suricata/fast.log
要查看更多PF_RING相关的话,可以去官网查看:
- PF_RING
- PF_RING Overview
- PF_RING Documentation
- PF_RING ZC