
简介这是一份围绕Snort入侵检测系统编写的实验型PDF资料面向高校网络空间安全课程、等级保护测评人员和网络管理员用于理解IDS原理并验证防护效果。文档内容覆盖实验目的、软硬件要求、等级保护2.0在关键网络节点的监控与防外部攻击要求、入侵检测概念、IDS发展历程以及Nmap网络映射器的典型用法可指导读者在模拟主机攻击场景中完成从启动Snort、运行nmap -sS扫描到通过Web界面查看TCP协议分析信息的完整闭环。资料全文以单份PDF呈现共1个文件压缩包大小仅367KB轻量易下载支持打印或移动端快速查阅。目前已有1238人学习使用内容贴合等保合规与日常安全运维需求。通过这份实验资料读者既能系统掌握入侵检测系统的分类N-IDS、H-IDS、D-IDS与基本原理也能按步骤搭建Snort检测环境理解Nmap在信息收集中的作用为后续开展漏洞评估或网络安全竞赛实训打下操作基础。1. Snort 入侵检测系统使用一份能跑通的实验这个实验场景在网络通信安全的日常运维里太常见了关键网络节点要求你监视网络攻击行为你把 snort 入侵检测系统装好了却不知道如何用一次真实的扫描来证明它确实在报警。我拆过的这份《snort 入侵检测系统使用》PDF 恰好就是干这个的——它让一台装好 Snort 的虚拟机实时监听网卡再从 Kali Linux 上执行nmap -sS端口扫描充当模拟攻击最后回到http://127.0.0.1/base/打开 BASE 分析界面看 TCP 协议告警占比用数据闭环验证 IDS 工作正常。这份资料的完整链路覆盖了 IDS 原理、Nmap 信息收集、Snort 告警入库和 BASE 前端展示四个环节每一步都有截图对应的操作位置。适合两类人一是安全相关课程需要交实验报告的学生照着步骤几分钟就能跑出结果二是刚接手公司内网安全设备、想亲手验证 IDS 是否在“有效监听”的运维新人。下文按“原理 → 操作 → 验证 → 踩坑 → 进阶”的顺序拆开讲。2. IDS 原理与实验环境从误用检测到等级保护 2.0 要求实际操作里Snort 不像防火墙那样直接挡流量它更像一个旁路监听者网卡把经过的数据包复制给 SnortSnort 分析后把结果写到日志或数据库。实验里 snort.bat 启动后没有任何直观的界面反馈这容易让人觉得它是个黑匣子所以在跑通之前先把 Snort 的设计逻辑和实验对应的合规背景讲清楚。2.1 误用检测与 Snort 的告警机制入侵检测系统IDS最早可以追溯到 1980 年 4 月James P. Anderson 在给美国空军的技术报告《Computer Security Threat Monitoring and Surveillance》里第一次系统性地提出了 IDS 概念。1980 年代中期它发展成入侵检测专家系统IDES1990 年分化出基于网络的 N-IDS 和基于主机的 H-IDS之后又出现了分布式 D-IDS。Snort 就是 N-IDS 的典型实现它把网卡设成混杂模式把经过的每个数据包和规则库里的特征做比对命中就生成告警这种模式在安全领域叫“误用检测”。误用检测和基于基线的“异常检测”走的是两条路。异常检测先学习正常流量偏离基线就报警优点是对未知攻击敏感缺点是误报率高环境一变就要重新训练基线。Snort 走的是规则匹配路线特征写得准误报就低但只能识别规则库里已定义的行为。实验里我们能看到的效果——扫描产生告警、BASE 界面出现 TCP 分析数据——本质上都是 Snort 规则匹配的结果。Snort 规则由规则头和选项两部分组成规则头写协议、源/目的地址和端口括号里写 msg、sid 等选项。想验证告警链路是否打通常见做法是先写一条临时规则测试alert tcp any any - 192.168.2.102 any (msg:Possible port scan; sid:1000001;)规则含义alert 表示这是告警规则tcp 只匹配 TCP 流量any any 表示不限制来源 IP 和源端口-代表单向方向目的地址指向被扫描的 Snort 主机。msg 是告警显示文本sid 是规则全局唯一编号自建规则建议从 1000000 以上开始避免和内置规则冲突。这条规则的粒度比较粗只能证明“有 TCP 流量到达”实际验证扫描更多依赖规则库里现成的 SCAN 类规则。2.2 等级保护 2.0 对关键网络节点的要求PDF 里明确列出了等级保护 2.0 的对应条款二级要求“应在关键网络节点处监视网络攻击行为”三级、四级要求“应在关键网络节点处检测、防止或限制从外部发起的网络攻击行为”。翻译成技术语言的差别很直白二级强调的是看得见流量里有攻击行为要能发现三级以上不仅要发现还要能处置要么拦截要么限制。Snort 在这个实验里承担的是“监视”和“检测”两层能力。监视靠网卡混杂模式旁路抓包检测靠规则库匹配后产生告警。至于“防止或限制”Snort 本身不具备阻断能力真实生产环境通常是 Snort 旁路监听、防火墙联动处置的架构。实验里用 Nmap 扫描来模拟外部攻击验证的正是“监视 检测”这两级要求是否能落地。2.3 实验环境Snort 虚拟机与 Kali 的搭配实验软硬件要求写的是“snort 入侵检测系统、模拟攻击的物理主机”实际操作里最优解是一台装好 Snort 的虚拟机加一台 Kali Linux。虚拟机的好处是快照随便打扫描实验搞得再乱也能一键还原不用心疼物理机的网卡和系统。Kali 自带 Nmap开箱即用不需要额外装扫描器。Snort 主机配置完成后启动检测模块的操作是执行桌面上的 snort.bat。批处理的实质是把 Snort 以守护方式拉起来典型内容类似下面的形式cd C:\Snort\bin snort.exe -c C:\Snort\etc\snort.conf -l C:\Snort\log -i 1三个参数是关键-c指定配置文件所有规则、输出方式都在 snort.conf 里-l指定日志目录告警文件写在这里-i指定监听网卡序号1 表示第一块网卡。多网卡环境下-i很容易被忽略一旦 Snort 监听的是虚拟机 NAT 网卡而非实验网段的那块后面 Nmap 怎么扫都不会出新告警。启动后 Snort 会把网络数据包逐一分析匹配规则的流量被写成告警并写入数据库。PDF 里没说数据库细节这里补一下背景Snort 2.x 经典架构里告警入库有两种常见做法一是 snort.conf 里配置output database指令直连 MySQL二是用 Barnyard2 读取 unified2 格式日志后异步写库。BASE 前端本身不读 pcap只读 MySQL所以“告警入库”这一步是实验链路里最关键的一环。2.4 确认 Snort 在监听进程、日志与数据库Snort 启动后没有可视化界面怎么确认它真的在干活我一般按三步排查。第一步看进程Snort 主进程必须在第二步看日志目录只要网卡有流量经过日志目录就会持续出现新文件第三步查数据库告警表里能查到记录才说明整条链路是通的。# 查看 snort 进程是否存活 ps aux | grep snort # 查看日志目录中最近生成的文件 ls -lt /var/log/snort/ | head -10第一步确认程序没崩第二步确认网卡确实在抓包。如果日志目录里长时间没有新文件先怀疑网卡监听位置不对再看过滤规则是不是把实验流量全部丢弃了。数据库确认放到第三章配合扫描操作一起做避免空库判断干扰排查。3. 用 Nmap 验证检测效果-sS 半开扫描如何留下告警实验的“攻击者”角色由 Kali Linux 承担工具选的是 Nmap。Nmap 是 Network Mapper 的简称一款自由软件设计目标是网络发现和安全审计。它通常被用来列举网络主机清单、管理服务升级调度、监控主机和服务运行状况在管理员手里是资产盘点工具在攻击者手里就是信息收集的起点。实验用它来模拟外部扫描正好踩在“监视网络攻击行为”这条合规要求上。3.1 Nmap 在信息收集阶段的位置Nmap 能检测的信息很全目标主机是否在线、端口开放情况、运行的服务类型和版本、操作系统与设备类型。这些信息恰好是攻击链的最前端——先摸清目标开了哪些端口、跑着什么服务才能决定后续用什么漏洞。业界工具生态也验证了这一点漏洞扫描器 Nessus 支持导入 Nmap 的 XML 结果Metasploit 框架直接集成了 Nmap扫描结果可以作为漏洞扫描、漏洞利用和权限提升阶段的输入。实验里不用把 Nmap 的能力全部铺开只取“端口扫描”这一个动作就够了。扫描行为会在 Snort 侧产生大量规则命中的可能性因为它对目标主机的多个端口连续发送探测包这种批量试探特征和正常业务流量有显著差异正是 IDS 规则喜欢捕捉的模式。3.2 为什么示例命令选 -sS 而不是 -sTPDF 里的示例命令是nmap -sS 192.168.2.102这个-sS值得单独讲。它是 SYN 半开扫描只发送 SYN 包收到 SYN/ACK 就判定端口开放随即回 RST 断开连接不完成三次握手-sT则是全连接扫描会把 TCP 握手完整跑完。两者结果差异不大但半开扫描速度快、日志里留下的痕迹少是渗透测试信息收集阶段最常见的用法。从 IDS 验证的角度看半开扫描恰恰是更好的测试样本。它制造了大量“只有 SYN、没有后续握手包”的异常流量Snort 对这类不完整 TCP 会话的敏感度直接反映了规则库的检测能力。另外注意-sS需要 root 权限构造原始套接字普通用户执行会报权限错误Kali 下用 sudo 跑# 半开扫描方式探测 Snort 主机-sS 需要 sudo sudo nmap -sS 192.168.2.102 # 如果只想确认端口开放情况、跳过主机发现阶段的 ICMP 探测 sudo nmap -sS -Pn 192.168.2.102-sS指 SYN 半开扫描-Pn表示跳过主机在线探测直接进入端口扫描阶段。第二个命令在目标开启防火墙、禁 ICMP 的场景下更稳。实验里如果 Snort 主机有防火墙拦 ICMP不带-Pn会导致结果全是“host seems down”。3.3 扫描行为如何在 Snort 侧留下告警当 Nmap 的 SYN 包到达 Snort 主机网卡把流量复制给 Snort 分析引擎规则库里的扫描检测规则开始工作。以 Bad Traffic 和 ET SCAN 这类规则集为例连续 SYN 探测会命中“端口扫描”特征Snort 随即生成告警并写入数据库。这里有个常见误区总有人以为 BASE 界面看到告警就是规则起作用了其实告警必须先落到数据库BASE 才有东西可显示。想确认告警确实入库最直接的办法是在扫描前后各查一次数据库。PDF 的操作路径是通过 BASE 页面间接看实际排查问题时直接查库更省事-- 扫描前查一次告警总数 SELECT COUNT(*) FROM event; -- 扫描后再查最近 5 分钟的告警数 SELECT COUNT(*) FROM event WHERE timestamp NOW() - INTERVAL 5 MINUTE;扫描前记录基线值扫描后重新执行第二条语句如果数量明显增加说明 Snort 抓到了扫描动作并且写库成功。这个操作把验证从“界面玄学”变成了可量化的数据对比排查问题时会省很多时间。3.4 扫描结果怎么读Nmap 扫描结束后会在终端打印一份端口列表每一行是端口状态和服务名常见的状态有 open、closed、filtered。open 表示目标端口有服务在监听filtered 通常意味着有防火墙规则在丢包可能 SNORT 主机开了个人防火墙。对本次实验而言具体开放哪些端口不是重点重要的是回到 Snort 主机上确认告警是否产生。如果一次扫描下来端口列表全是 filtered也不用急着怀疑 Snort 没工作先关掉 Windows 防火墙或加放行规则再试。扫描行为本身就是“攻击模拟”Snort 只负责看见它不负责判断这次扫描是否成功。4. 在 BASE 界面读告警TCP 分析百分比与三步验证实验验证的最后一站是浏览器里的 BASE 界面。BASE 的全称是 Basic Analysis and Security Engine一个 PHP 写的 Web 前端专门用来读 Snort 写入 MySQL 的告警数据。它不直接处理 pcap也不参与规则匹配只做一件事把数据库里的告警记录变成人类能看懂的页面。理解了这层关系后面所有操作就都顺了——Snort 负责抓和判MySQL 负责存BASE 负责展示。4.1 BASE 界面与 Snort 数据库的关系BASE 页面能显示哪些内容完全取决于数据库里有什么。它从 event 表读取告警事件从 signature 表读取规则描述从 iphdr、tcphdr 等表读取 IP 和 TCP 层信息再按协议类型、源地址、目的地址、时间等维度聚合成统计视图。PDF 要求访问http://127.0.0.1/base/这个 URL 是 BASE 在 Web 服务器上的部署路径IP 是本机回环地址直接在 Snort 主机上用浏览器打开即可。如果访问页面时出现数据库连接错误多半是 BASE 的配置文件里写的数据库账号密码和 MySQL 里实际的不一致。BASE 的配置文件常见路径是/var/www/base/base_conf.php里面定义了$BASE_dbuser、$BASE_dbpass等变量改的时候把密码换成 Snort 建库时设置的那个就行。4.2 找到 TCP 告警分析百分比入口的关键操作进入 BASE 首页后页面中部是各类统计摘要PDF 的操作指引是“把滚轮拉到最下面点击【TCP】旁边的百分比”。这里看到的百分比其实是告警按协议分布的占比Snort 抓到的告警里 TCP 协议占了多少。Nmap 的-sS扫描本质是构造 TCP SYN 包如果这次扫描被规则命中TCP 占比会出现明显抬升所以这个入口直接通向和扫描行为相关的告警列表。点击百分比后进入协议筛选视图表格里的关键字段如下字段含义排查价值Timestamp告警发生时间和 Nmap 扫描时刻对照判断是否为本次扫描产生Source IP发起方地址应为 Kali 主机 IPDestination IP目标地址应为 Snort 主机 IPProtocol协议类型实验里应为 TCPSignature规则描述决定命中的是哪条攻击特征表里的 Signature 字段最有排查价值。如果看到的是“ET SCAN Potential TCP Scan”之类描述说明命中了扫描规则实验链路完全正常如果命中的是其他种类规则说明 Snort 虽然在工作但特征匹配和其他流量发生了交叉需要回到规则层面再确认。4.3 三步验证检测效果别被百分比带偏拿到 TCP 百分比后很多人直接凭“百分比很高”就判断检测成功这是最常见的误读。百分比只反映告警分布不反映总数总数一条告警、TCP 占 100%百分比再高也说明不了问题。正确的验证姿势分三步。第一步扫描前在 BASE 首页记录告警总数或者直接用 SQL 查 event 表的总行数。第二步在 Kali 上执行nmap -sS扫描。第三步扫描结束后刷新 BASE 页面确认告警总数增幅明显、TCP 协议占比抬高、新增告警的源地址是 Kali 的 IP。三步全部满足才能下结论说 Snort 对端口扫描产生了有效告警。只看百分比不看绝对数量等于只看仪表盘不踩油门车动没动都不清楚。4.4 告警列表里如何快速定位本次扫描告警列表按时间排序后新告警可能夹在历史数据里找起来费劲。BASE 提供了按字段过滤的功能在搜索条件里把 Source IP 填成 Kali 的 IP时间范围选为“从扫描前两分钟到现在”列表就会被压缩到只剩本次扫描相关的记录。如果列表为空但总数在涨说明命中的规则和扫描源 IP 的记录方式有出入检查一下是不是有 NAT 或代理改写了源地址。这一步操作熟练之后整个验证从“看趋势”变成了“对账本”每次实验做完能直接写出一句话结论哪个源、在什么时间、对哪个目标、触发了什么规则。后面写实验报告时这句话就是最有说服力的证据。5. 避坑与排查Snort 实验里最常见的五个翻车点这个实验链路不长但翻车的点相当集中。下面五条是我在实际操作里见过、踩过、也帮别人排过的问题现象、原因和解决方式都列清楚照着排查能省下大量试错时间。5.1 扫描完 BASE 里一条告警都没有现象Kali 上nmap -sS跑完Snort 主机一切正常但 BASE 页面仍然显示旧数据告警总数没有变化。原因有两个层次。最常见的是 Snort 的 output 配置没有把告警写入 MySQL日志文件里可能已经有记录了但数据库表是空的其次是 Barnyard2 这类异步写库组件没有启动日志在排队库里自然没有新数据。解决先查日志目录确认 Snort 是否真的产生了告警文件有文件没入库就是 output 配置或 Barnyard2 的问题连文件都没有就要回头检查监听的网卡是否覆盖了扫描流量所在的网络。逐步缩小排查范围比反复重启 BASE 有效得多。5.2 BASE 页面报数据库连接失败现象浏览器打开http://127.0.0.1/base/页面直接弹数据库连接错误BASE 带着数据库的名字一起出现在报错信息里。原因BASE 配置文件里的数据库账号、密码或库名和 MySQL 里实际建立的账号、库名不匹配。这是装 BASE 时最容易出错的环节因为 Snort 建库、BASE 连库是两个独立步骤常常由不同时间或不同人完成凭据一旦没对齐就全线崩溃。解决编辑 base_conf.php把$BASE_dbname、$BASE_dbuser、$BASE_dbpass改成 MySQL 里的实际值改完刷新页面即可。注意 MySQL 用户权限要覆盖 base 库的全部表否则查询接口会报权限不足。5.3 sudo 不写直接跑 -sS 报权限错误现象在 Kali 上输入nmap -sS 192.168.2.102终端输出类似“Operation not permitted”的错误扫描无法启动。原因-sS需要构造原始套接字只有 root 才有权限Kali 的默认用户不是 root直接执行会失败。解决所有半开扫描命令前加 sudosudo nmap -sS。这个坑对新手极其常见记不住就养成本能反应——凡是用 SYN 半开扫描第一键永远是 sudo。5.4 告警时间比本地时间慢八小时现象BASE 页面上的告警时间戳和本地实际时间对不上扫描发生在下午三点界面上显示的是早上七点。原因Snort 写入数据库的时间戳默认按 UTC 存储MySQL 的会话时区如果没设置成东八区BASE 读出来后就直接偏移八小时。这不是数据丢失只是时区没有对齐。解决在 MySQL 配置文件的[mysqld]段加default-time-zone08:00重启 MySQL 服务或者把 PHP 的默认时区在配置文件里改成Asia/Shanghai。改完再去 BASE 里看时间应该就正常了。5.5 多网卡环境下监听错了接口现象Nmap 扫描正常完成日志目录偶尔有文件增长但告警内容五花八门就是没有针对扫描流量的记录。原因Snort 主机有多块网卡启动时没指定监听哪块默认选中的不是实验网卡。扫描流量从另一块网卡进来Snort 根本没看到。解决启动 Snort 时用-i参数指定正确的网卡序号。不确定哪块网卡对应哪个网段先执行ipconfig或ip addr看 IP 关联再对照 snort.bat 里的-i值确保一一对应。这个参数在 PDF 里没有强调恰恰是实验环境里最容易翻车的位置。6. 进阶把告警数据导出成可二次分析的情报实验跑通之后告警数据存在 MySQL 里BASE 页面上翻翻就完事了但这批数据的价值远不止“证明实验成功”。真实运维里常要回答“这段时间什么攻击最多、从哪来、打哪去”这类问题直接在 BASE 里逐个点效率太低常见做法是把告警导出成结构化文件再交给脚本做统计和归档。这一步从“会用界面”升级到“能处理数据”也是生产环境里更接近实战的工作方式。先构造一条导出 SQL取最近两小时的告警把 IP 转成点分十进制带上规则描述落到 CSV 文件SELECT INET_NTOA(ip_src) AS src, INET_NTOA(ip_dst) AS dst, signature.sig_name, event.timestamp FROM event LEFT JOIN signature ON event.signature signature.sig_id WHERE event.timestamp NOW() - INTERVAL 2 HOUR INTO OUTFILE /tmp/snort_alert_export.csv FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY LINES TERMINATED BY \n;这条 SQL 的关键点有三个。第一event 表里的 ip_src、ip_dst 是整数类型INET_NTOA 负责转换成 192.168.2.102 这种可读格式否则导出来是一串无法阅读的数字。第二signature 表和 event 表是多对一关系通过 LEFT JOIN 把规则描述拼进来导出的结果才谈得上“可分析”。第三INTO OUTFILE 要求 MySQL 有 FILE 权限如果执行报权限不足可以把查询结果在客户端导出效果一样。拿到 CSV 后用 Python 做一次规则名统计看哪类攻击特征被命中得最多import csv from collections import Counter rows [] with open(/tmp/snort_alert_export.csv, newline) as f: for r in csv.reader(f): # 跳过空行第三列是规则描述 if r and len(r) 4: rows.append(r[2]) for sig, cnt in Counter(rows).most_common(10): print(f{sig}: {cnt})这个脚本只做一件事对 CSV 里第三列的规则描述做计数按出现次数从高到低输出前十。输出的结果就是“最近两小时这台机器上的告警主要来自哪些攻击特征”可以作为周报的素材也可以作为调整防火墙策略的输入。字段顺序记得和导出 SQL 的列保持一致如果调整了 SELECT 的列顺序脚本里的索引也要跟着改。这个进阶动作的价值在于把验证标准从“BASE 界面看到了东西”提升到“数据库里有可导出、可统计的真实数据”。从那以后我每次搭 IDS 实验都强制把数据库直查当成验收口径——BASE 界面只是门面event 表和 signature 表里有没有新增行才是真凭据。希望帮到你也让你以后不至于被一个空库的漂亮页面忽悠过去。本文还有配套的精品资源点击获取