NetworkSecurityLabs/snort3-ids-ubuntu-nmap-detection

GitHub: NetworkSecurityLabs/snort3-ids-ubuntu-nmap-detection

该项目是一份在 Ubuntu 上从零部署 Snort 3 IDS 并自定义规则实时检测七种 nmap 扫描的完整实战指南。

Stars: 0 | Forks: 0

# 🛡️ 在 Ubuntu 上部署 Snort 3 IDS — 实时检测 nmap 攻击 一份完整、实战导向的 **Snort 3 (IDS 模式)** Ubuntu 配置指南,包含自定义检测规则,可捕获从 Kali Linux 攻击者 VM 发起的七种不同类型的 nmap 扫描。本文展示的每一个警报都是真实的——均在测试期间实时捕获。 📖 **Dev.to 上的完整文章:** [我如何在 Ubuntu 上使用 Snort 3 构建网络入侵检测系统——并捕获每一次扫描](https://dev.to/almahmudkhalif/lab-task-13-how-i-built-a-network-intrusion-detection-system-with-snort-3-on-ubuntu-and-caught-3mep) ## 📋 目录 - [环境配置](#environment) - [检测到的攻击类型](#attack-types-detected) - [第 1 步 — 安装依赖](#step-1--update-ubuntu-and-install-dependencies) - [第 2 步 — 安装 LibDAQ](#step-3--install-libdaq-snorts-data-acquisition-library) - [第 3 步 — 安装 Tcmalloc](#step-4--install-tcmalloc-memory-optimization) - [第 4 步 — 安装 Snort 3](#step-5--install-snort-3) - [第 5 步 — 配置网络接口](#step-6--configure-the-network-interface) - [第 6 步 — 配置 snort.lua](#step-7--create-the-rules-directory-and-configure-snortlua) - [第 7 步 — 编写检测规则](#step-8--write-the-detection-rules) - [第 8 步 — 验证并运行](#step-9--validate-the-configuration) - [第 9 步 — 从 Kali 模拟攻击](#step-11--simulate-attacks-from-kali-linux) - [实时警报输出](#live-alert-output) - [常见错误](#common-mistakes) - [与我联系](#-connect-with-me) ## 环境 | 机器 | 操作系统 | 角色 | IP | |---|---|---|---| | 防御者 | Ubuntu 22.04 | Snort 3 IDS | 192.168.1.104 | | 攻击者 | Kali Linux 2026.1 | nmap 扫描源 | 192.168.1.106 | 两台 VM 在 VirtualBox 中均使用**桥接网卡(Bridged Adapter)**,因此它们共享同一子网。 ## 检测到的攻击类型 | # | 扫描类型 | nmap 标志 | Snort 规则标志 | |---|---|---|---| | 1 | Ping Sweep | `-sn` | ICMP + dsize:0 | | 2 | XMAS Scan | `-sX` | flags:FPU | | 3 | FIN Scan | `-sF` | flags:F | | 4 | NULL Scan | `-sN` | flags:0 | | 5 | SYN Scan | `-sS` | flags:S | | 6 | TCP Connect Scan | `-sT` | tcp(无标志过滤器) | | 7 | UDP Scan | `-sU` | udp 协议 | ## 第 1 步 — 更新 Ubuntu 并安装依赖 ``` sudo apt update sudo apt install -y build-essential \ libpcap-dev libpcre2-dev libnet1-dev zlib1g-dev luajit hwloc \ 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 git wget ethtool ``` ![依赖安装](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p84es0aeaefdsbpre23y.png) ## 第 2 步 — 创建工作目录 ``` mkdir snort-source-files cd snort-source-files ``` ## 第 3 步 — 安装 LibDAQ (Snort 的数据采集库) LibDAQ 是 Snort 的数据包捕获抽象层。 ``` git clone https://github.com/snort3/libdaq.git cd libdaq sudo ./bootstrap sudo ./configure sudo make sudo make install cd .. ``` ![git clone libdaq](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h69abnxvvus4ykr64ryl.png) ![bootstrap libdaq](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/52i39vd1dy58hyvrehv1.png) ![configure libdaq](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fpjkug8y9s095kbvjktt.png) ![make libdaq](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ipqrxvw78giudbuinty.png) ![make install libdaq](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5u9af4hfcv0zfmnxt80s.png) ## 第 4 步 — 安装 Tcmalloc(内存优化) Google 的内存分配器——可减少内存碎片,并在高负载下提升 Snort 的运行速度。 ``` wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.10/gperftools-2.10.tar.gz tar xzf gperftools-2.10.tar.gz cd gperftools-2.10 sudo ./configure sudo make sudo make install cd .. ``` ![wget gperftools](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mjq2cjmp3w788jkpgix4.png) ![configure gperftools](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8tf0dtvak7e452tjn5p2.png) ![make gperftools](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/orfjqqx2icbhlz6go11f.png) ![make install gperftools](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/15qw2c9kuj3xgzerai8e.png) ## 第 5 步 — 安装 Snort 3 ``` git clone https://github.com/snort3/snort3.git cd snort3 sudo ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc cd build sudo make sudo make install sudo ldconfig sudo ln -s /usr/local/bin/snort /usr/sbin/snort snort -V ``` 预期的版本输出: ``` -*> Snort++ <*- Version 3.12.2.0 By Martin Roesch & The Snort Team ``` ![git clone snort3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tvq16ohu2phegjg7wap8.png) ![configure_cmake snort3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ztv45084rpwcu99w7j4.png) ![make snort3 progress](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ys2pbv770waseozvu62g.png) ![make install snort3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pgl8qi7zx0i8uun0ctu3.png) ![snort -V version confirmed](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59sryuyxngqfvwa55nfq.png) ## 第 6 步 — 配置网络接口 ``` # 查找你的 interface name ip a # 设置 promiscuous mode sudo ip link set dev enp0s3 promisc on sudo ethtool -K enp0s3 gro off lro off ``` 创建一个 systemd 服务,以便在重启后保持配置: ``` sudo nano /etc/systemd/system/snort3-nic.service ``` ``` [Unit] Description=Set Snort3 NIC in promiscuous mode [Service] Type=oneshot ExecStart=/sbin/ip link set dev enp0s3 promisc on ExecStart=/sbin/ethtool -K enp0s3 gro off lro off [Install] WantedBy=multi-user.target ``` ``` sudo systemctl daemon-reload sudo systemctl enable --now snort3-nic.service sudo systemctl status snort3-nic.service ``` ![ip a showing enp0s3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jyu3m5t9wpyympvgaogi.png) ![install ethtool](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t9jv1c0qbwof5exgnzfh.png) ![snort3-nic.service file content](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ovvnp1xld352nulm8paa.png) ![systemctl status snort3-nic.service active](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kd76deyrfdp2wgnmw1jm.png) ## 第 7 步 — 创建规则目录并配置 snort.lua ``` sudo mkdir -p /usr/local/etc/rules/local-rules cd /usr/local/etc/snort sudo nano snort.lua ``` 在 snort.lua 中设置您的网络: ``` HOME_NET = '192.168.0.0/24' EXTERNAL_NET = '!$HOME_NET' include 'snort_defaults.lua' ``` 添加 IPS block(滚动到检测部分): ``` ips = { include = '/usr/local/etc/rules/local-rules/local.rules', variables = { nets = { HOME_NET = HOME_NET, EXTERNAL_NET = EXTERNAL_NET } } } ``` ![mkdir rules directory](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iwgw5xt8pyqoipzj2svh.png) ![snort.lua HOME_NET config](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8e8zpb72348kusnnrkw5.png) ![snort.lua ips block](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hhciank53801dg1wj7j6.png) ![Kali and Ubuntu network settings bridged](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4e8qxeazvfoui2xsz41z.png) ![ip a on Ubuntu showing 192.168.1.104](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7txj1wilob0op373p2hu.png) ![ip a on Kali showing 192.168.1.106](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vnsncj6lmeg3ufn5sece.png) ![snort.lua updated HOME_NET 192.168.0.0/24](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t8lxbs2wmz9nrceuney7.png) ## 第 8 步 — 编写检测规则 ``` sudo nano /usr/local/etc/rules/local-rules/local.rules ``` ``` alert icmp any any -> $HOME_NET any (msg:"NMAP Ping Sweep Scan"; dsize:0; sid:1000001; rev:1;) alert tcp any any -> $HOME_NET 22 (msg:"NMAP XMAS Scan"; flags:FPU; sid:1000002; rev:1;) alert tcp any any -> $HOME_NET 22 (msg:"NMAP FIN Scan"; flags:F; sid:1000003; rev:1;) alert tcp any any -> $HOME_NET 22 (msg:"NMAP NULL Scan"; flags:0; sid:1000004; rev:1;) alert tcp any any -> $HOME_NET 22 (msg:"NMAP SYN Scan"; flags:S; sid:1000005; rev:1;) alert tcp any any -> $HOME_NET 22 (msg:"NMAP TCP Connect Scan"; sid:1000006; rev:1;) alert udp any any -> $HOME_NET any (msg:"NMAP UDP Scan"; sid:1000007; rev:1;) ``` ![local.rules in nano editor](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aggso5pkoi4wroefoifd.png) ![snort config test validation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1gcwxjocbzc1c948mhpb.png) ## 第 9 步 — 验证配置 ``` snort -c /usr/local/etc/snort/snort.lua -T ``` 预期结果: ``` Snort successfully validated the configuration (with 0 warnings). o")~ Snort exiting ``` ![validation output part 1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yfegvrjocuaza8j7b7q8.png) ![validation output part 2 - 0 warnings](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9os2ytaixxx0grhynox2.png) ## 第 10 步 — 以警报模式启动 Snort ``` sudo snort -c /usr/local/etc/snort/snort.lua -i enp0s3 -A alert_fast ``` ![snort starting - commencing packet processing](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6jrb91gqgo6fo2mp07vc.png) ![snort running on enp0s3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u07ik8str9kkynvxp9m0.png) ## 第 11 步 — 从 Kali Linux 模拟攻击 ``` # 1. Ping Sweep nmap -sn 192.168.1.104 # 2. XMAS Scan sudo nmap -sX 192.168.1.104 # 3. FIN Scan sudo nmap -sF 192.168.1.104 # 4. NULL Scan sudo nmap -sN 192.168.1.104 # 5. SYN Scan sudo nmap -sS 192.168.1.104 # 6. TCP Connect Scan nmap -sT 192.168.1.104 # 7. UDP Scan sudo nmap -sU 192.168.1.104 ``` ![Ping sweep + Snort alerting](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/prrov7gnk9blvkty9l2z.png) ![XMAS scan triggered](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gxogrposmxqg7v2xee21.png) ![FIN scan triggered](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h4jizyjp0oq2qubo6izi.png) ![NULL scan triggered](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p0xmrazt8erp55qxtcml.png) ![SYN scan triggered](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9zxerwj0o8j4ydg9ewh.png) ![TCP Connect scan triggered](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hk5lk6ne3p2bzmibwito.png) ![UDP scan triggered](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m0vsz21hhlihsk7efp18.png) ## 实时警报输出 当所有扫描运行时,Snort 会像这样实时生成警报行: ``` 05/14-18:13:07.004392 [**] [1:1000001:1] "NMAP Ping Sweep" [**] [Priority: 0] {ICMP} 192.168.1.106 -> 192.168.1.104 05/14-18:15:21.301976 [**] [1:1000002:1] "NMAP XMAS Scan" [**] [Priority: 0] {TCP} 192.168.1.106:34107 -> 192.168.1.104:22 05/14-18:16:03.900911 [**] [1:1000003:1] "NMAP FIN Scan" [**] [Priority: 0] {TCP} 192.168.1.106:41928 -> 192.168.1.104:22 05/14-18:16:53.770290 [**] [1:1000004:1] "NMAP NULL Scan" [**] [Priority: 0] {TCP} 192.168.1.106:52411 -> 192.168.1.104:22 05/14-18:17:26.976133 [**] [1:1000005:1] "NMAP SYN Scan" [**] [Priority: 0] {TCP} 192.168.1.106:40209 -> 192.168.1.104:22 05/14-18:15:21.301976 [**] [1:1000006:1] "NMAP TCP Connect Scan" [**] [Priority: 0] {TCP} 192.168.1.106:34107 -> 192.168.1.104:22 05/14-18:12:48.402112 [**] [1:1000007:1] "NMAP UDP Scan" [**] [Priority: 0] {UDP} 192.168.1.1:1900 -> 239.255.255.250:1900 ``` 全部 7 条规则均已触发——IDS 正在运行。 ## 常见错误 | 错误 | 导致的问题 | 修复方法 | |---|---|---| | 使用 Snort 2 而不是 Snort 3 | 配置文件格式完全不同 | 从 `github.com/snort3/snort3` 克隆 | | `HOME_NET` 子网错误 | 规则永远不会触发 | 使用 `ip a` 检查并精确匹配 | | 未设置混杂模式 | Snort 错过大部分流量 | `sudo ip link set dev enp0s3 promisc on` | | 接口名称不匹配 | Snort 启动但未捕获到任何内容 | 使用 `ip a` 确认名称 | | snort.lua 中的规则路径拼写错误 | Snort 验证通过但未触发任何警报 | 仔细检查完整路径 | | 跳过 `sudo ldconfig` | 二进制文件找不到共享库 | 务必在 `make install` 之后运行 | | 用于 NULL 扫描版本不匹配的 `flags:0` | 规则加载但永远不匹配 | 使用 `snort -c snort.lua -T` 测试 | ## 🌐 与我联系 [![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-blue?logo=linkedin)](https://www.linkedin.com/in/almahmudkhalif/) [![Dev.to](https://img.shields.io/badge/Dev.to-Articles-black?logo=devdotto)](https://dev.to/almahmudkhalif/)
标签:Bash脚本, rizin, 安全实验环境, 应用安全, 插件系统, 网络安全, 网络流量分析, 隐私保护