1. Endace DAG
Suricata附带原生Endace DAG卡支持。这意味着Suricata可以直接使用libdag接口,代替libpcap(它也应该工作)
步骤如下:
(1)配置DAG支持
./configure--enable-dag
显示
Suricata Configuration:
AF_PACKET support: no
PF_RING support: no
NFQueue support: no
IPFW support: no
DAG enabled: yes
Napatech enabled: no
(2)启动
suricata -c suricata.yaml --dag 0:0
显示如下:
[5570]10/7/2012--13:52:30-(source-erf-dag.c:262)<Info>(ReceiveErfDagThreadInit)--Attachedandstartedstream:0onDAG:/dev/dag0
[5570]10/7/2012--13:52:30-(source-erf-dag.c:288)<Info>(ReceiveErfDagThreadInit)--Startingprocessingpacketsfromstream:0onDAG:/dev/dag0
2. Napatech Suricata 安装指南
2.1 内容
(1)介绍
(2)包安装
(3)基本配置
(4)高级多线程配置
2.2 介绍
Napatech数据包捕获加速器卡可以使用以下基于硬件的功能大大提高Suricata的性能
(1)板载突发缓冲(最高12GB)
(2)零拷贝内核旁路DMA
(3)非阻塞PCIe性能
(4)端口合并
(5)负载分配到128个主机缓冲区
(6)精确的时间戳
(7)准确的时间同步
Napatech软件套件(驱动程序包)有两种类型,NAC和OEM。NAC软件包分发deb和rpm软件包以简化安装。OEM软件包使用专有的shell脚本来处理安装过程。在任何一种情况下,都需要gcc,make和内核头文件来编译内核模块并安装软件。
2.3 包安装
(2.3.1)Napatech NAC 包
Red Hat:
yum install kernel-devel-$(uname -r) gcc make ncurses-libs
yum install nac-pcap-<release>.x86_64.rpm
某些发行版将要求您对NAC Software Suite包文件使用-nogpgcheck选项:
yum --nogpgcheck install nac-pcap-<release>.x86_64.rpm
Debian :
apt-get install linux-headers-$(uname .r) gcc make libncurses5
dpkg .i nac-pcap_<release>_amd64.deb
要完成所有发行版的安装,请停止ntservice
/opt/napatech3/bin/ntstop.sh -m
删除这些现有的安装文件:
cd /opt/napatech3/config
rm ntservice.ini setup.ini
重启ntservice(将自动生成一个新的ntservice.ini配置文件):
/opt/napatech3/bin/ntstart.sh -m
(2.3.2)Napatech OEM包
请注意,系统将提示您安装Napatech libpcap库。如果您想使用Napatech在WIreshark,tcpdump或其他基于pcap的应用程序中捕获数据包,请回答“是”。Suricata不需要Libpcap,因为包含本机Napatech API支持。
Red Hat
yum install kernel-devel-$(uname -r) gcc make
./package_install_3gd.sh
Debian
apt-get install linux-headers-$(uname .r) gcc make
./package_install_3gd.sh
要完成所有发行版ntservice的安装
/opt/napatech3/bin/ntstart.sh -m
2.4 suricata安装
下载并解Suricata压缩包后,您需要运行configure以启用Napatech支持并准备编译
./configure --enable-napatech --with-napatech-includes=/opt/napatech3/include --with-napatech-libraries=/opt/napatech3/lib
现在编辑suricata.yaml文件以配置要使用的最大流数。如果您计划在Napatech加速器中使用负载分配(类似RSS)功能,则该列表应包含与ntservice.ini中定义的主机缓冲区相同数量的流:
注意:仅当与另一个应用程序共享流时,hba才有用。当启用hba时,当主机缓冲区利用率达到hba值指示的高水位标记时,数据包将被丢弃(即未传递给suricata)。这确保了,如果suricata在其数据包处理中落后,其他应用程序仍将接收所有数据包。如果在没有其他应用程序共享流的情况下启用此功能,则会导致次优的数据包缓冲。
2.5 基础配置
对于基本安装,我们将设置Napatech捕获加速器,将所有物理端口合并为Suricata可以读取的单个流。对于此配置,Suricata将处理数据包分发到多个线程。
以下是/opt/napatech3/bin/ntservice.ini中需要更改的行以获得最佳单缓冲区性能:
TimeSyncReferencePriority=OSTime # Timestamp clock synchronized to the OS
HostBuffersRx=[1,16,0] # [number of host buffers, Size(MB), NUMA node]
在对ntservice进行更改后停止并重新启动ntservice:
/opt/napatech3/bin/ntstop.sh -m
/opt/napatech3/bin/ntstart.sh -m
现在我们需要执行一些NTPL(Napatech编程语言)命令来完成设置。创建文件将使用以下命令:
Delete=All # Delete any existing filters
Setup[numaNode=0]=streamid==0 # Set stream ID 0 to NUMA 0
Assign[priority=0;streamid=0]=all # Assign all phisical ports to stream ID 0
接下来使用ntpl工具执行这些命令:
/opt/napatech3/bin/ntpl -f <my_ntpl_file>
现在您已准备好开始suricata:
suricata -c /usr/local/etc/suricata/suricata.yaml --napatech --runmode workers
2.6 高级多线程配置
现在让我们进行更高级的配置,我们将在加速器中使用负载分配(类似RSS)功能。我们将创建8个流并设置加速器以基于5元组散列分配负载。仅当CPU内核完全饱和时,增加缓冲区大小才能最大限度地减少数据包丢失 如果CPU内核保持运行,设置最小缓冲区大小(16MB)将提供最佳性能(最小化L3缓存命中率)。
请注意,定义主机缓冲区的NUMA节点与Napatech加速器插入的物理CPU插槽相同是非常重要的。
首先让我们修改ntservice.ini文件以增加主机缓冲区的数量和大小。
HostBuffersRx=[8,256,0] # [number of host buffers, Size (MB), NUMA node]
在对ntservice进行更改后停止并重新启动ntservice:
/opt/napatech3/bin/ntstop.sh -m
/opt/napatech3/bin/ntstart.sh -m
现在让我们将流分配给主机缓冲区并配置负载分配。将设置负载分配以支持隧道和非隧道流量。创建一个包含以下ntpl命令的文件:
Delete=All # Delete any existing filters
Setup[numaNode=0] = streamid==0
Setup[numaNode=0] = streamid==1
Setup[numaNode=0] = streamid==2
Setup[numaNode=0] = streamid==3
Setup[numaNode=0] = streamid==4
Setup[numaNode=0] = streamid==5
Setup[numaNode=0] = streamid==6
Setup[numaNode=0] = streamid==7
HashMode[priority=4]=Hash5TupleSorted
Assign[priority=0; streamid=(0..7)]= all
接下来使用ntpl工具执行这些命令:
/opt/napatech3/bin/ntpl -f <my_ntpl_file>
现在您已准备好开始Suricata:
suricata -c /usr/local/etc/suricata/suricata.yaml --napatech --runmode workers
2.7 计数器
对于正在处理的每个流,将在stats.log中输出以下计数器:
(1)nt<streamid>.pkts:流接收的数据包数
(2)nt<streamid>.bytes:流接收的总字节数
(3)nt<streamid>.drop: 由于缓冲区溢出情况而从此流中丢弃的数据包数
如果启用了hba,还将提供以下计数器:
(4)nt <streamid> .hba_drop:由于达到主机缓冲区容限高水位线而丢弃的数据包数.
除计数器外,还会跟踪和记录主机缓冲区利用率。这对调试也很有用。当达到25%,50%,75%的利用率时,主机和板载缓冲区都会输出日志消息。当利用率降低时输出相应的消息。
2.8 支持
3. Myricom
在本章节将描述使用Myricom libpcap支持。假设您正确安装了卡,安装了Sniffer驱动程序并确保一切正常。确保在您的dmesg中您看到该卡处于嗅探模式:
[2102.860241] myri_snf INFO:eth4:Link0 is UP
[2101.341965 ]myri_snf INFO:eth5:Link0 is UP
在/opt/snf中安装Myricom运行时和库
针对Myricom的libpcap编译Suricata:
./configure --with-libpcap-includes=/opt/snf/include/ --with-libpcap-libraries=/opt/snf/lib/
接下来,配置ringbuffers的数量。我将在这里使用8,因为我的四核+超线程有8个逻辑CPU。有关buffer-size参数的其他信息,请参见下文。
pcap:
- interface: eth5
threads: 8
buffer-size: 512kb
checksum-checks: no
8个线程设置使Suricata为eth5创建了8个读取器线程。Myricom驱动程序确保每个驱动程序都连接到它自己的环形缓冲区。
然后按如下方式启动Suricata:
SNF_NUM_RINGS=8 SNF_FLAGS=0x1 suricata -c suricata.yaml -i eth5 --runmode=workers
如果你想要16个响铃,请将你的yaml中的“threads”变量更新为16并启动Suricata
SNF_NUM_RINGS=16 SNF_FLAGS=0x1 suricata -c suricata.yaml -i eth5 --runmode=workers
请注意,使用Myricom卡时,当前忽略上面显示的pcap.buffer-size yaml设置。该值将传递到Suricata源代码中的pcap_set_buffer_size libpcap API。来自Myricom的支持:
“The libpcap interface to Sniffer10G ignores the pcap_set_buffer_size() value. The call to snf_open() uses zero as the dataring_size which informs the Sniffer library to use a default value or the value from the SNF_DATARING_SIZE environment variable."
Myricom在libpcap项目中打开的以下拉取请求表明,未来的SNF软件版本可以通过pcap.buffer-size yaml设置提供对设置SNF_DATARING_SIZE的支持:
https://github.com/the-tcpdump-group/libpcap/pull/435
在此之前,可以分别使用SNF_DATARING_SIZE和SNF_DESCRING_SIZE环境变量显式设置数据环和描述符环值。
SNF_DATARING_SIZE是用于存储传入分组数据的总内存量。所有戒指共享此尺寸。SNF_DESCRING_SIZE是用于存储有关数据包的元信息(数据包长度,偏移量,时间戳)的内存总量。所有戒指也共享此大小。
Myricom建议描述符环的大小是数据环的1/4,但可以根据您的流量配置文件修改比率。如果未明确设置,Myricom将使用以下默认值:SNF_DATARING_SIZE = 256MB,SNF_DESCRING_SIZE = 64MB
扩展上面的16线程示例,您可以使用以下命令启动带有16GB数据环和4GB描述符环的Suricata:
SNF_NUM_RINGS=16 SNF_DATARING_SIZE=17179869184 SNF_DESCRING_SIZE=4294967296 SNF_FLAGS=0x1 suricata -c suricata.yaml -i eth5 --runmode=workers
3.1 调试信息
Myricom还提供了获取调试信息的方法。这对于验证配置和收集其他信息非常有用。设置SNF_DEBUG_MASK = 3启用调试信息,并且可选地设置SNF_DEBUG_FILENAME允许您指定输出文件的位置。
完成以下示例:
SNF_NUM_RINGS=16SNF_DATARING_SIZE=17179869184SNF_DESCRING_SIZE=4294967296SNF_FLAGS=0x1SNF_DEBUG_MASK=3SNF_DEBUG_FILENAME="/tmp/snf.out"suricata-csuricata.yaml-ieth5--runmode=workers
3.2 附加信息
http://www.40gbe.net/index_files/be59da7f2ab5bf0a299ab99ef441bb2e-28.html
4. eBPF 和 XDP
4.1 介绍
eBPF代表扩展的BPF。这是最新Linux内核版本中提供的Berkeley Packet Filter的扩展版本。
它为使用C开发的eBPF程序提供了更多高级功能,并且能够使用在内核和用户空间之间共享的结构化数据。
eBPF在Suricata中用于三件事:
(1)eBPF过滤器:可以开发任何类似过滤器的BPF。提供了仅接受某些VLAN的数据包的过滤器示例。还提供了旁路实现。
(2)eBPF负载均衡:提供可编程负载均衡。提供简单的ippair负载平衡。
(3)XDP程序:suricata可以加载XDP程序。提供旁路程序。
旁路可以在eBPF和XDP中实现。XDP的优点是可以在尽可能早的阶段丢弃数据包。因此性能更好。但被绕过的数据包无法到达网络,因此您无法在常规流量上使用此数据包,而只能在重复/嗅探流量上使用此数据包。
4.1.1 XDP
XDP提供了另一种Linux原生方式,可以优化Suricata在嗅探高速网络时的性能。
XDP or eXpress Data Path provides a high performance, programmable network data path in the Linux kernel as part of the IO Visor Project. XDP provides bare metal packet processing at the lowest point in the software stack which makes it ideal for speed without compromising programmability. Furthermore, new functions can be implemented dynamically with the integrated fast path without kernel modification.
有关xdp更多信息:https://www.iovisor.org/technology/xdp
4.2 要求
您需要一个支持XDP的内核,并且为了实现真正的性能提升,需要一个支持驱动程序中XDP的网卡。
Suricata XDP代码已经过4.13.10测试,但是需要4.15或更高版本才能使用CPU重定向映射等所有功能。
如果您使用的是英特尔网卡,则需要使用树形内核网卡驱动程序。树外驱动程序不包含XDP支持。
拥有支持RSS对称散列的网卡是一个好点,或者您必须使用XDP CPU重定向映射功能。
4.3 先决条件
4.3.1 禁用irqbalance
systemctl stop irqbalance
systemctl disable irqbalance
4.3.2 内核
您需要运行4.13或更新的内核
4.3.3 Clang
确保系统上安装了clang(> = 3.9)
sudo apt-get install clang
4.3.4 libbpf
Suricata使用libbpf与eBPF和XDP进行交互。该库在Linux树中可用。在Linux 4.16之前,还需要一个修补过的libbpf库:
git clone -b libbpf-release https://github.com/regit/linux.git
如果你有一个最新的内核,你可以跳过这一部分。
现在,您可以构建和安装库
cd linux/tools/lib/bpf/
make && sudo make install
sudo make install_headers
sudo ldconfig
4.4 编译安装suricata
要获得Suricata源,您可以使用通常的:
git clone https://github.com/OISF/suricata.git
cd suricata
git clone https://github.com/OISF/libhtp.git-b0.5.x
./autogen.sh
然后你需要添加ebpf标志来配置
CC=clang ./configure -enable-ebpf --enable-ebpf-build
make clean && make
sudo make install-full
sudo ldconfig
sudo mkdir /etc/suricata/ebpf/
4.5 设置旁路
如果您计划将eBPF或XDP用于内核/硬件级别旁路,则需要执行以下操作:
首先,在流部分启用旁路
stream:
bypass:true
如果需要,还可以通过 在应用层tls部分中设置加密处理来绕过加密流
app-layer:
protocols:
tls:
enabled: yes
detection-ports:
dp: 443
encrypt-handling: bypass
4.6 设置eBPF过滤器
文件ebpf/vlan_filter.c包含交换机中的vlan id列表,您需要编辑该列表以获取适合您网络的内容。另一个真正基本的过滤器丢弃IPv6数据包也可以在ebpf/vlan_filter.c中找到。
Suricata可以作为eBPF过滤任何暴露filter部分的eBPF代码。
通过make完成修改和构建后,您可以根据需要复制生成的eBPF过滤器.
cp ebpf/vlan_filter.bpf /etc/suricata/ebpf/
然后在af-packet部分设置ebpf-filter-file变量
- interface: eth3
threads: 16
cluster-id: 97
cluster-type: cluster_flow # choose any type suitable
defrag: yes
# eBPF file containing a 'loadbalancer' function that will be inserted into the
# kernel and used as load balancing function
ebpf-filter-file: /etc/suricata/ebpf/vlan_filter.bpf
use-mmap: yes
ring-size: 200000
然后你可以正常运行suricata
/usr/bin/suricata --pidfile /var/run/suricata.pid --af-packet=eth3 -vvv
4.7 设置eBPF旁路
您也可以使用eBPF旁路。为此,请加载bypass_filter.bpf文件并更新af-packet配置以将bypass设置为yes.
- interface: eth3
threads: 16
cluster-id: 97
cluster-type: cluster_qm # symmetric RSS hashing is mandatory to use this mode
# eBPF file containing a 'filter' function that will be inserted into the
# kernel and used as packet filter function
ebpf-filter-file: /etc/suricata/ebpf/bypass_filter.bpf
bypass: yes
use-mmap: yes
ring-size: 200000
对于具有旁路兼容代码的eBPF代码的约束比常规过滤器更强。过滤器必须暴露flow_table_v4和flow_table_v6每个CPU阵列的地图类似的定义中提供的一个bypass_filter.c。Suricata将访问和维护这两个地图,以处理旁路流量列表。
4.8 设置eBPF负载均衡
eBPF负载平衡允许对侦听套接字上的流量进行负载均衡使用eBPF过滤器中实现的任何逻辑。标记有该loadbalancer部分的函数返回的值与CPU计数的模数一起使用,以了解数据包必须在哪个套接字中发送。
lb.bpf 文件中提供了简单IP对散列函数的实现。
根据需要复制生成的eBPF过滤器
cp ebpf/lb.bpf /etc/suricata/ebpf/
然后cluster_ebpf在af-packet的接口部分使用负载均衡方法,并将ebpf-lb-file变量指向lb.bpf文件
- interface: eth3
threads: 16
cluster-id: 97
cluster-type: cluster_ebpf
defrag: yes
# eBPF file containing a 'loadbalancer' function that will be inserted into the
# kernel and used as load balancing function
ebpf-lb-file: /etc/suricata/ebpf/lb.bpf
use-mmap: yes
ring-size: 200000
4.9 设置XDP旁路
XDP旁路将允许Suricata告诉内核必须通过XDP机制丢弃某些流的数据包。这是在数据报到达Linux内核网络堆栈之前发生的早期丢弃。
建议使用Linux 4.15或更高版本来使用该功能。如果设置BUILD_CPUMAP为0,则可以在旧内核上使用它ebpf/xdp_filter.c。
根据需要复制生成的xdp过滤器:
cp ebpf/xdp_filter.bpf /etc/suricata/ebpf/
设置af-packet部分/接口suricata.yaml。
我们将使用cluster_qmNIC上的对称散列,我们也将使用xdp-mode: driver和/etc/suricata/ebpf/xdp_filter.bpf(在我们的示例中TCP卸载/旁路)
- interface: eth3
threads: 16
cluster-id: 97
cluster-type: cluster_qm # symmetric hashing is a must!
defrag: yes
# Xdp mode, "soft" for skb based version, "driver" for network card based
# and "hw" for card supporting eBPF.
xdp-mode: driver
xdp-filter-file: /etc/suricata/ebpf/xdp_filter.bpf
# if the ebpf filter implements a bypass function, you can set 'bypass' to
# yes and benefit from these feature
bypass: yes
use-mmap: yes
ring-size: 200000
XDP旁路与AF_PACKET IPS模式兼容。来自旁路流的数据包将直接从一张卡发送到第二张卡,而无需通过内核网络堆栈。
4.9.1 在NIC上设置对称散列
英特尔网卡不支持对称散列,但可以使用特定的散列函数来模拟它。
请仔细按照这些说明获得所需结果:
ifconfig eth3 down
在树形内核驱动程序中使用:英特尔网站上提供的英特尔驱动程序中不提供XDP支持。
启用对称散列
ifconfig eth3 down
ethtool -L eth3 combined 16 # if you have at least 16 cores
ethtool -K eth3 rxhash on
ethtool -K eth3 ntuple on
ifconfig eth3 up
./set_irq_affinity 0-15 eth3
ethtool -X eth3 hkey 6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A:6D:5A equal 16
ethtool -x eth3
ethtool -n eth3
在上面的设置中,您可以自由使用任何最近的set_irq_affinity脚本。它可用于任何Intel x520 / 710 NIC源驱动程序下载。
4.9.2 禁用任何NIC卸载
运行以下命令以禁用卸载
for i in rx tx tso ufo gso gro lro tx nocache copy sg txvlan rxvlan; do
/sbin/ethtool -K eth3 $i off 2>&1 > /dev/null;
done
4.9.3 尽可能平衡
尝试尽可能使用网络卡的平衡
for proto in tcp4 udp4 ah4 esp4 sctp4 tcp6 udp6 ah6 esp6 sctp6; do
/sbin/ethtool -N eth3 rx-flow-hash $proto sdfn
done
4.9.4 XDP CPU重定向情况
如果您的硬件无法进行对称负载平衡但在驱动程序模式下支持XDP,则可以使用xdp_filter.bpf文件中提供的CPU重定向映射支持。在此模式下,负载平衡将由XDP过滤器完成,每个CPU将处理整个数据包处理,包括在内核中创建skb结构。
您需要Linux 4.15或更高版本才能使用该功能。
为此,请将af-packet接口配置中的xdp-cpu-redirect变量设置为一组CPU。然后使用cluster_cpu作为负载均衡功能。您还需要相应地设置关联。
可以使用xdp_monitor获取有关CPU重定向行为的信息。该程序在samples / bpf目录下的Linux树中可用,并将由make命令构建。样本输出如下:
sudo ./xdp_monitor --stats
XDP-event CPU:to pps drop-pps extra-info
XDP_REDIRECT 11 2,880,212 0 Success
XDP_REDIRECT total 2,880,212 0 Success
XDP_REDIRECT total 0 0 Error
cpumap-enqueue 11:0 575,954 0 5.27 bulk-average
cpumap-enqueue sum:0 575,954 0 5.27 bulk-average
cpumap-kthread 0 575,990 0 56,409 sched
cpumap-kthread 1 576,090 0 54,897 sched
4.9.5 开始Suricata使用XDP
您现在可以启动Suricata并激活XDP旁路
/usr/bin/suricata -c /etc/suricata/xdp-suricata.yaml --pidfile /var/run/suricata.pid --af-packet=eth3 -vvv
确认您已在输出中使用XDP过滤器(示例):
...
...
(runmode-af-packet.c:220) <Config> (ParseAFPConfig) -- Enabling locked memory for mmap on iface eth3
(runmode-af-packet.c:231) <Config> (ParseAFPConfig) -- Enabling tpacket v3 capture on iface eth3
(runmode-af-packet.c:326) <Config> (ParseAFPConfig) -- Using queue based cluster mode for AF_PACKET (iface eth3)
(runmode-af-packet.c:424) <Info> (ParseAFPConfig) -- af-packet will use '/etc/suricata/ebpf/xdp_filter.bpf' as XDP filter file
(runmode-af-packet.c:429) <Config> (ParseAFPConfig) -- Using bypass kernel functionality for AF_PACKET (iface eth3)
(runmode-af-packet.c:609) <Config> (ParseAFPConfig) -- eth3: enabling zero copy mode by using data release call
(util-runmodes.c:296) <Info> (RunModeSetLiveCaptureWorkersForDevice) -- Going to use 8 thread(s)
...
...
4.10 获取有关旁路的实时信息
您可以通过stats事件和unix套接字获取有关绕过的信息。
“face-stat将返回被绕过的数据包的数量(在超时时为流添加数据包)。
ebpf-bypassed-stats命令将返回每个接口的IPv4和IPv6流表中的元素数。