Ubuntu上源码编译安装snort,使用snort进行数据检测和防御(简单示例)

前言

Snort是一个开源的网络入侵检测和防范系统(IDS/IPS),Snort是一个基于libpcap的轻量级网络入侵检测系统,它运行在一个“传感器(sensor)”主机上,监听网络数据。通过将网络数据与规则集进行模式匹配,Snort能够检测可能的入侵企图,或者使用SPADE插件,使用统计学方法对网络数据进行异常检测。

本次实验在Ubuntu上演示,如果需要在其他版本的Linux下进行,可以以本篇文章做参考,借助大模型将命令适配到不同的操作系统。

安装snort

1、更新apt源

sudo apt update

2、安装相关依赖
在Linux系统中,特别是使用基于Debian的发行版(如Ubuntu)时,可以通过apt install命令一次性安装多个软件包。这些软件包之间用空格分隔。
使用这种方式安装多个包可以节省时间,因为不需要为每个包单独执行一条命令。此外,它还可以确保所有相关的依赖项都同时更新到兼容的版本,从而避免潜在的版本冲突。

sudo apt install build-essential libpcap-dev libpcre3-dev libnet1-dev zlib1g-dev luajit hwloc libdnet-dev libdumbnet-dev bison flex liblzma-dev openssl libssl-dev pkg-config libhwloc-dev cmake cpputest libsqlite3-dev uuid-dev libcmocka-dev libnetfilter-queue-dev libmnl-dev autotools-dev libluajit-5.1-dev libunwind-dev

这条命令包含的依赖包比较对,以下对相关依赖包的简单说明

build-essential:这是一个编译环境的基础包,包含了编译器(如gcc)、构建工具(如make)和必要的库文件。它是编译大多数源代码包所必需的。
libpcap-dev:libpcap(Packet CAPture)是一个用于网络流量捕获的库。Snort需要它来分析网络数据包。
libpcre3-dev:PCRE(Perl Compatible Regular Expressions)是一个用于处理正则表达式的库。Snort使用PCRE来匹配规则中的模式。
libnet1-dev:libnet是一个用于构建和发送网络数据包的库。虽然Snort本身不直接发送数据包,但它可能依赖于这个库来处理或解析网络数据。
zlib1g-dev:zlib是一个用于数据压缩的库。Snort可能使用zlib来压缩或解压缩日志数据。
luajit:LuaJIT是一个高性能的Lua语言解释器。Snort可能使用Lua脚本来扩展其功能或处理规则。
hwloc、libhwloc-dev:hwloc(Hardware Locality)是一个用于检测和利用硬件拓扑信息的库。Snort可能使用hwloc来优化其性能或资源分配。
libdnet-dev、libdumbnet-dev:这些库提供了用于网络编程的函数和接口。Snort可能使用它们来处理网络数据包或进行网络操作。
bison、flex:Bison是一个语法分析器生成器,Flex是一个词法分析器生成器。它们通常用于编译器的开发,但也可能被Snort用于解析配置文件或规则。
liblzma-dev:LZMA是一个压缩算法,liblzma提供了该算法的库接口。Snort可能使用它来压缩数据。
openssl、libssl-dev:OpenSSL是一个强大的加密库,提供了SSL和TLS协议的实现。Snort可能使用OpenSSL来加密或解密网络数据。
pkg-config:pkg-config是一个帮助编译器和链接器找到库文件的工具。它简化了依赖库的管理。
cmake:CMake是一个跨平台的自动化构建系统。虽然Snort本身可能不使用CMake进行构建,但某些依赖项可能使用它。
cpputest:CppUTest是一个C/C++单元测试框架。虽然Snort的安装命令中包含了它,但Snort本身可能不直接使用它进行单元测试。这可能是为了开发或测试与Snort相关的其他组件。
libsqlite3-dev:SQLite是一个轻量级的嵌入式关系数据库管理系统。Snort可能使用SQLite来存储日志数据或配置信息。
uuid-dev:UUID(Universally Unique Identifier)库提供了生成全局唯一标识符的功能。Snort可能使用UUID来标识日志条目或会话。
libcmocka-dev:cmocka是一个用于C语言的轻量级单元测试框架。与CppUTest类似,它可能用于测试与Snort相关的组件。
libnetfilter-queue-dev、libmnl-dev:这些库提供了与Linux内核netfilter框架交互的接口。Snort可能使用它们来实现某些高级的网络过滤或处理功能。
autotools-dev:这是一组用于自动化构建和测试的工具和库的集合。它们可能用于构建Snort的某些依赖项。
libluajit-5.1-dev:这是LuaJIT 5.1的开发库。与luajit类似,它用于支持Lua脚本的执行。
libunwind-dev:libunwind是一个用于栈回溯和调试的库。Snort可能使用它来处理错误报告或调试信息。

3、安装Snort DAQ(数据采集库)

在Ubuntu上安装Snort时,安装DAQ(Data Acquisition Library,数据采集库)是一个重要的步骤。DAQ是Snort的一个组件,它提供了一个抽象层,用于调用不同的包捕获库。这个抽象层使得Snort能够灵活地处理来自不同网络接口的数据包。

 #建一个存放源码的目录
mkdir snortSourceFiles
cd snortSourceFiles#从github上下载daq源码
git clone https://github.com/snort3/libdaq.git

在这里插入图片描述

在当前文件夹下(snortSourceFiles)可以看到daq文件夹
在这里插入图片描述

#转到libdaq目录下
cd libdaq/#编译安装
./bootstrap
./configure
make
make install

进入libdaq文件夹,进行编译安装
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

接着是sudo make install
在这里插入图片描述
由于很多实验都会用到make和make install,这里简单说明下两者

make命令主要负责编译源代码,而make install命令则负责将编译后的软件安装到指定的位置。这两个命令在软件开发和部署过程中通常是连续使用的,先使用make命令进行编译,然后使用make install命令进行安装。
需要注意的是,在执行make和make install命令之前,通常需要先运行配置脚本(如./configure)来生成Makefile文件,并为编译和安装过程设置必要的参数和选项。此外,执行make install命令通常需要具有root权限,因为安装过程会向系统写入文件。这也说明了如果使用make install而不加sudo有时会报错。

4、安装Google开发的线程缓存的mallocTCMalloc,其提供高效的多线程内存管理实现,用于替代操作系统的内存分配相关的函数,具有减少内存碎片、适用于多核、更好的并行性支持等特性。此外,TCMalloc通过利用线程本地存储(TLS)来缓存小块内存分配,减少了锁竞争,从而提高了多线程环境下的内存分配性能。

cd snortSourceFiles
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.8/gperftools-2.8.tar.gz
tar xzf gperftools-2.8.tar.gz
cd gperftools-2.8/
./configure
make
make install

如果在Ubuntu上使用wegt命令下载不了相关安装包(比如显示请求超时等现象),这里可以在浏览器中输入访问以下网址,直接将下载好的gperftools压缩包传到Ubuntu的snortSourceFiles 文件夹下,在进行相关解压。
GPerftools下载网站

在这里插入图片描述

在这里插入图片描述

可以查看下geperftoos下的文件
在这里插入图片描述
在gperftools目录下进行编译安装
在这里插入图片描述

然后是make编译,这个时间会比较长,等待即可。编译成功后使用sudo make install进行安装
在这里插入图片描述

5、源码编译snort

cd snortSourceFiles
git clone https://github.com/snort3/snort3.git
cd snort3/
sudo ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
cd build/
#编译安装的时间比较长
make
make install

6、更新共享库
共享库通常包含了许多常用的功能和代码,这些功能和代码可以被多个程序共享,以减少内存占用和提高系统性能。

sudo ldconfig

7、检查snort版本

snort -V

如果显示没有安装snort命令,需要根据系统提示安装snort,在安装时会出现配置项,回车确认即可。(这里我均回车默认的,其中有一项需要输入网络接口检测名称,默认是eth0,我当时是按照默认来的,我的网卡名称为ens33,后来发现没有影响。如果不对的话,建议换成自己的网卡名,使用ifconfig即可查看)
在这里插入图片描述

在这里插入图片描述

此时再使用snort -v查看是否安装成功
出现版本号说明安装成功
在这里插入图片描述
至此,snort安装成功,接下来介绍一个简单的实验,实验目的是 在Ubuntu上使用snort软件进行数据检测和防御,以防止外部网络对服务器使用大于800字节的数据包做ping攻击。

简单实验

1、进行规则配置
snort的规则配置文件一般存放在 /etc/snort/rules文件中,可以转到相关目录下进行rules文件的查看
在这里插入图片描述
输入命令

vi  /etc/snort/rules

在这里插入图片描述

由于我们要进行的是icmp设置,因此在rules文件中需要找到icmp的配置文件,然后回车进入,添加以下配置规则:

alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP Large ICMP Packet"; dsize:>800; reference:arachnids,246; classtype:bad-unknown; sid:499; )

简单介绍下这段规则的含义:

alert:这个字段指定了规则的动作类型。在这里,alert表示当规则匹配到流量时,Snort将生成一个警报。
icmp:这个字段指定了要检查的协议类型。在这里,icmp表示Internet控制消息协议(ICMP),它是一种用于在IP网络中发送控制消息的协议,常用于ping操作、错误报告等。

$EXTERNAL_NET any -> $HOME_NET any:
这部分定义了规则的作用范围和方向。
$EXTERNAL_NET是一个变量,通常表示外部网络的IP地址范围。
any表示任何端口。
->表示流量的方向,从左边到右边。
$HOME_NET是另一个变量,通常表示受保护网络的IP地址范围。
第二个any同样表示任何端口。
总的来说,这部分指定了从外部网络到受保护网络的任何ICMP流量。

(msg:"ICMP Large ICMP Packet"; dsize:>800; reference:arachnids,246; classtype:bad-unknown; sid:499; ):
这部分是规则的检测条件和附加信息。
msg:“ICMP Large ICMP Packet”:这是一个描述性消息,当规则触发时,Snort会在警报中包含这条消息。
dsize:>800:这指定了要检测的数据包大小条件。在这里,它表示数据包大小(data size)大于800字节。ICMP数据包通常很小,因此大于800字节的ICMP数据包可能是异常的,值得进一步调查。
reference:arachnids,246:这是一个参考字段,提供了有关该规则或检测到的活动的额外信息来源。在这里,它可能指向一个安全数据库或文章,解释了为什么这种类型的ICMP数据包被视为可疑。
classtype:bad-unknown:这指定了规则所属的分类类型。在这里,bad-unknown表示检测到的活动是不良的且未知的,这通常意味着它不符合已知的良好行为模式,但也没有足够的信息来确定它是具体的哪种攻击。
sid:499:这是规则的唯一标识符(signature ID)。每个Snort规则都有一个唯一的SID,用于在警报中标识该规则。

在这里插入图片描述

保存退出即可

这里要注意,当你刚进入icmp.rules文件中会发现里面其实已经有很多规则了,下面简单说下添加的规则与原有规则的不同点

在Snort中,sid(安全标识符)是用于唯一标识每条规则的数字。当Snort处理规则时,它会根据sid来区分不同的规则。rev(修订版本)是用于指示规则版本的字段,它允许您在保持sid不变的情况下更新规则。
如果在添加一条新规则时没有指定rev字段,Snort会默认将其视为修订版本0(或者根据Snort的版本和配置,可能会使用其他默认值,但通常是0)。这不会与已经存在且指定了rev:1的相同sid的规则产生冲突,因为sid和rev的组合才是唯一的标识符。

2、创建snort日志检测存放文件

mkdir /var/log/snort

在这里插入图片描述

一般在安装snort时,会默认将日志检测文件创建好,如果显示已有相关文件,可以无需创建。

3、将snort规则中的路径设置为snort下的rules规则
在这里插入图片描述

如果在打开snort.conf文件后发现RULES_PATH已经被正确设置为期望的Snort规则路径(RULES_PATH=指向snort目录下的rules文件夹),这表示Snort已经配置为从该路径加载规则文件,无需更改,退出即可。
在这里插入图片描述

4、使用snort规则对流量进行检测,并将结果输入到对应的日志文件中(这里ens33替换为你的网络接口,可以使用ifconfig进行查看)
在这里插入图片描述输入命令

sudo snort -i ens33 -c /etc/snort/snort.conf -A fast -l /var/log/snort/

在这里插入图片描述

到此,在Ubuntu上可以使用snort进行检测,你可以直接进行步骤5。如果是想要进行规则测试,可以按照下面几条命令进行测试

(可选)可以先使用如下命令检查下snort上的相关配置是否正确
sudo snort -T -c /etc/snort/snort.conf(可选)规则测试(输出下图的信息说明成功开启检测)
sudo snort -T -c /etc/snort/snort.conf -i ens33
这里发现使用ens0也可以成功
sudo snort -T -c /etc/snort/snort.conf -i ens0

在这里插入图片描述

5、开启检测
依旧是步骤4的命令

sudo snort -i ens33 -c /etc/snort/snort.conf -A fast -l /var/log/snort/

此时Ubuntu上不要做任何操作,使用局域网内的主机对Ubuntu进行进行>800的攻击
在这里插入图片描述

然后Ubuntu可ctrl+z退出检测页面,接下来查看检测结果

6、查看检测日志
此时打开我们之前创建的(或者是默认创建完成的日志存放文件),可以在日志文件夹下看到有个alert文件,打开该文件可以查看日志信息

cd /var/log/snort
vi alert文件

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

参考文章

感谢大佬提供的精彩好文!
没人讲清楚!我来讲!---- Ubuntu 20.04中下载配置Snort3,参数讲解及实现协议警报

Ubuntu16.04搭建入侵检测系统Snort

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/490484.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(补)算法刷题Day19:BM55 没有重复项数字的全排列

题目链接 给出一组数字,返回该组数字的所有排列 例如: [1,2,3]的所有排列如下 [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1]. (以数字在数组中的位置靠前为优先级,按字典序排列输出。) 思路: 使用回…

Repo管理

文章目录 前言Repo介绍清单仓库清单仓库的组成 初始化Repo同步远程仓库Repo实际应用 前言 我们知道,Git是用来管理某一个仓库,那当一个项目用到了多个仓库时,怎么来同步管理这些仓库呢?这个时候就可以引入Repo管理。 Repo介绍 …

QT 国际化(翻译)

QT国际化(Internationalization,简称I18N)是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。这使得软件能够在不同的国家和地区使用,并且可以根据用户的语言和地区提供本地化的使用体验。…

【卷积神经网络】AlexNet实践

构建模型 模版搭建 # 定义一个AlexNet模型类def __init__(self):# 调用父类的构造函数(如果继承自nn.Module的话)super(AlexNet, self).__init__()# ReLU激活函数self.ReLU nn.ReLU()# 卷积层1:输入1个通道(灰度图)&a…

socket编程UDP-实现停等机制(接收确认、超时重传)

在下面博客中,我介绍了利用UDP模拟TCP连接、按数据包发送文件的过程,并附上完整源码。 socket编程UDP-文件传输&模拟TCP建立连接脱离连接(进阶篇)_udp socket发送-CSDN博客 下面博客实现的是滑动窗口机制: sock…

Leetcode 面试150题 399.除法求值

系列博客目录 文章目录 系列博客目录题目思路代码 题目 链接 思路 广度优先搜索 我们可以将整个问题建模成一张图:给定图中的一些点(点即变量),以及某些边的权值(权值即两个变量的比值),试…

Python机器视觉的学习

一、二值化 1.1 二值化图 二值化图:就是将图像中的像素改成只有两种值,其操作的图像必须是灰度图。 1.2 阈值法 阈值法(Thresholding)是一种图像分割技术,旨在根据像素的灰度值或颜色值将图像分成不同的区域。该方法…

Linux 支持多个spi-nor flash

1. 需求 通常在嵌入式开发过程中可能会遇到需要再同一个SPI总线上挂载多个spi nor flash才能满足存储需求。 2. 技术简介 对于spi-nor flash驱动通常不需要驱动开发人员手搓,一般内核会有一套固定的驱动,而且走的是内核的MTD子系统那一套,市…

超标量处理器设计笔记(11)发射内容:分配、仲裁、唤醒

发射 概述集中式和分布式数据捕捉和非数据捕捉数据捕捉非数据捕捉总结对比 压缩式和非压缩式压缩式发射队列非压缩式发射队列总结 发射过程的流水线非数据捕捉结构的流水线数据捕捉结构的流水线 分配仲裁1-of-M 的仲裁电路N of M 的仲裁电路 唤醒单周期指令的唤醒多周期指令的…

ArrayList源码分析、扩容机制面试题,数组和List的相互转换,ArrayList与LinkedList的区别

目录 1.java集合框架体系 2. 前置知识-数组 2.1 数组 2.1.1 定义: 2.1.2 数组如何获取其他元素的地址值?(寻址公式) 2.1.3 为什么数组索引从0开始呢?从1开始不行吗? 3. ArrayList 3.1 ArrayList和和…

地下管线三维建模,市面上有哪些软件

1. 地下管线:城市“生命线” 地下管线是城市的重要基础设施,包括供水、排水、燃气、热力、电力、通信等管线,它们如同城市的“生命线”,支撑着城市的正常运转。如果缺乏完整和准确的地下管线信息,施工破坏地下管线的事…

蓝桥杯刷题——day5

蓝桥杯刷题——day5 题目一题干解题思路一代码解题思路二代码 题目二题干解题思路代码 题目一 题干 给定n个整数 a1,a2,⋯ ,an,求它们两两相乘再相加的和,即: 示例一: 输入: 4 1 3 6 9 输出: 117 题目链…

L1-3流量分析

1. 初步分析 数据包下载 流量分析基础篇 使用科来网络分析系统,打开L1-3.pcapng数据包,查看数据包中ssh的协议占的比例较大。 2. 通过分析数据包L1-3,找出黑客的IP地址,并将黑客的IP地址作为FLAG(形式:[IP地址)提交; 获取的fl…

docker启动一个helloworld(公司内网服务器)

这里写目录标题 容易遇到的问题:1、docker连接问题 我来介绍几种启动 Docker Hello World 的方法: 最简单的方式: docker run hello-world这会自动下载并运行官方的 hello-world 镜像。 使用 Nginx 作为 Hello World: docker…

【网络取证篇】取证实战之PHP服务器镜像网站重构及绕密分析

【网络取证篇】取证实战之PHP服务器镜像网站重构及绕密分析 在裸聊敲诈、虚假理财诈骗案件类型中,犯罪分子为了能实现更低成本、更快部署应用的目的,其服务器架构多为常见的初始化网站架构,也称为站库同体服务器!也就是说网站应用…

图像处理 - 车道线检测:智能驾驶的“眼睛”

引言 在智能驾驶技术飞速发展的今天,车道线检测作为一项基础而关键的技术,扮演着车辆“眼睛”的角色。它不仅关系到车辆的导航和定位,还直接影响到自动驾驶系统的安全性和可靠性。本文将带你深入了解车道线检测技术的原理、方法以及在实际应用…

【Linux学习】十五、Linux/CentOS 7 用户和组管理

Linux下组和用户的管理都必须是root用户下进行: 一、组的管理 1.组的创建 格式: groupadd 组名参数: -g:指定用户组的组ID(GID),如果不提供则由系统自动分配。 【案例】创建一个名为 oldg…

Unity类银河战士恶魔城学习总结(P179 Enemy Archer 弓箭手)

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了敌人弓箭手的制作 Enemy_Archer.cs 核心功能 状态机管理敌人的行为 定义了多个状态对象(如 idleState、moveState、attackState 等),通过状态机管理敌人的…

Pikachu靶场——XXE漏洞

XXE(XML External Entity)漏洞 XXE(XML External Entity)漏洞是一种常见的安全漏洞,发生在处理 XML 数据的应用程序中。当应用程序解析 XML 输入时,如果没有正确配置或过滤外部实体的加载,就可能…

使用 ESP-IDF 进行esp32-c3开发第四步:VSCode里安装ESP-IDF插件

很多小伙伴还是习惯在VSCode里写代码,所以今天进行了--使用 ESP-IDF 进行esp32-c3开发第四步:VSCode里安装ESP-IDF插件 安装和配置 首先到VSCode的插件页面,搜索esp,排名第一的就是ESP-IDF插件,点击安装即可。 在命令…