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
```

## 第 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 ..
```





## 第 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 ..
```




## 第 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
```





## 第 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
```




## 第 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
}
}
}
```







## 第 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;)
```


## 第 9 步 — 验证配置
```
snort -c /usr/local/etc/snort/snort.lua -T
```
预期结果:
```
Snort successfully validated the configuration (with 0 warnings).
o")~ Snort exiting
```


## 第 10 步 — 以警报模式启动 Snort
```
sudo snort -c /usr/local/etc/snort/snort.lua -i enp0s3 -A alert_fast
```


## 第 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
```







## 实时警报输出
当所有扫描运行时,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` 测试 |
## 🌐 与我联系
[](https://www.linkedin.com/in/almahmudkhalif/)
[](https://dev.to/almahmudkhalif/)
标签:Bash脚本, rizin, 安全实验环境, 应用安全, 插件系统, 网络安全, 网络流量分析, 隐私保护