Vaughan8842/suricata-home-lab
GitHub: Vaughan8842/suricata-home-lab
在树莓派上运行 Suricata 引擎的家庭网络安全监控项目,提供实时告警、每日报告与规则调优的完整实践。
Stars: 0 | Forks: 0
# Suricata 家庭实验室 — 树莓派上的实时网络 IDS
一个由 Christopher Vaughan 构建和运营的实时、生产级家庭网络安全监控系统。这不是实验室模拟 —— 它 7x24 小时运行,监控真实流量,并发送真实警报。
## 概述
| 项目 | 详情 |
|------|--------|
| **硬件** | 树莓派 (在 `eth0` 上进行被动监控) |
| **IDS 引擎** | Suricata — 仅被动检测,不阻断 |
| **网络** | 家庭子网 `172.16.0.0/24` |
| **远程访问** | Twingate Zero Trust VPN |
| **警报发送** | 实时邮件 + 每日摘要报告 |
| **规则管理** | 自定义白名单,并附带记录在案的抑制原因 |
## 架构
```
Home Network (172.16.0.0/24)
│
├── 172.16.0.1 — Router
├── 172.16.0.191 — Raspberry Pi (Suricata + Twingate)
└── other devices (phones, TVs, IoT)
│
▼
[ Suricata IDS ]
Monitors all traffic on eth0
Logs to /var/log/suricata/fast.log
│
┌───────┴────────┐
▼ ▼
suricata-watcher Daily Report
(real-time) (7:00 AM cron)
│ │
└────────┬────────┘
▼
Email alert to Gmail
```
## 构建的组件
### Suricata IDS
- 在树莓派上安装和配置 Suricata,以被动监控 `eth0` 上的所有流量
- `HOME_NET` 设置为 `172.16.0.0/24`
- 通过 `suricata-update` 管理规则更新
- 修复了 `suricata.yaml` 中默认规则路径配置错误的问题(默认指向了错误路径 —— 否则会静默加载 0 条规则)
### 2. 实时警报监控脚本 (`suricata-alert-watcher.sh`)
一个作为 `systemd` 服务运行的自定义 Bash 脚本,它具有以下功能:
- 使用 `tail -F` 持续追踪 `fast.log`
- 通过 `grep -qE` 模式匹配过滤掉已知的正常流量
- 根据规则 ID 对警报进行去重 —— 每条规则在 1 小时内抑制重复的邮件发送
- 检测到任何未识别的警报时立即发送邮件
- 重启时重置去重状态(使用 `/tmp/` 存储已发送警报的日志)
- 崩溃时自动重启(unit 文件中配置了 `Restart=always`)
```
# 服务管理
sudo systemctl status suricata-watcher
sudo systemctl restart suricata-watcher
```
### 3. 每日摘要报告 (`suricata-daily-report.sh`)
一个 cron 作业(每天早上 7:00)会发送包含以下内容的邮件:
- 过去 24 小时内的所有 Suricata 警报
- 网络上捕获的高频 DNS 查询
- 观察到的独立源 IP
### 4. Twingate Zero Trust VPN
- 在树莓派上部署 Twingate Connector 用于远程管理
- 配置了资源访问策略和基于组的访问控制
- 无需开放防火墙端口即可从任何地方进行 SSH 和管理访问
- **注意:** NordVPN 和 Twingate 存在冲突 —— 每次只能运行其中一个
## 规则调优 — 白名单日志
评估了每一条触发的警报,研究了对应规则,并记录了抑制决定。这模拟了 Tier 1 SOC 的规则管理工作流程。
| 规则 ID | 警报名称 | 来源 | 抑制原因 |
|---------|-----------|--------|-------------------|
| 2016149 | ET INFO STUN Binding Request | 树莓派 (Twingate) | 正常的 Twingate NAT 穿透 |
| 2016150 | ET INFO STUN Binding Response | Twingate 服务器 | 正常的 Twingate NAT 穿透 |
| 2260002 | Twingate 流量 | 树莓派 | 正常的 Twingate 操作 |
| 2227001 | SURICATA DHCP 截断选项 | 路由器 (172.16.0.1) | 消费级路由器 DHCP 实现的怪癖 —— 非恶意 |
| 2065070 | ET INFO RMM Domain DNS (pubnub.com) | 树莓派 | Twingate 使用 PubNub 进行控制面信令传输 —— 正常 |
| 2013504 | ET INFO GNU/Linux APT User-Agent | 树莓派 → Ubuntu 服务器 | Ubuntu 包管理器更新流量,归类为“不可疑” |
| 2200078 | SURICATA UDPv6 invalid checksum | mDNS (端口 5353) | NIC checksum offloading 导致的误报 —— Suricata 在 NIC 填充 checksum 之前进行了抓包 |
| 2210044 | SURICATA STREAM invalid timestamp | AWS (Twingate 中继) → 树莓派 | 长连接 HTTPS 上的 TCP timestamp 偏移 —— P3 信息级别,非攻击 |
**评估并抑制的规则总数:8**
**方法论:** 针对每一条警报 —— 识别规则 ID,研究签名,根据已知的网络基准关联源 IP 和目标地址,并在抑制前记录详细原因。
## 已知的网络基准
在此网络上属于正常的预期流量:
| 源/目标 | 流量 | 原因 |
|-------------------|---------|--------|
| `172.16.0.191` → `stun.sfo2.twingate.com` | STUN 请求 | Twingate NAT 穿透 |
| `172.16.0.191` → `91.189.92.x` | APT 流量 | Ubuntu 更新服务器 |
| `172.16.0.191` → `smtp.gmail.com` | SMTP | 警报邮件发送 |
| `172.16.0.191` → `rules.emergingthreat.net` | HTTP | Suricata 规则更新 |
| `172.16.0.1` → 广播 | DHCP | 路由器 DHCP 服务器 |
| `fe80::` → `ff02::` 端口 5353 | mDNS | 本地设备发现 (Avahi/Bonjour) |
## 技术栈
- **OS:** Raspberry Pi OS (Linux)
- **IDS:** Suricata
- **脚本:** Bash
- **进程管理:** systemd
- **远程访问:** Twingate Zero Trust VPN
- **邮件:** msmtp + Gmail App Password (SMTP 端口 587)
- **调度:** cron
## 展现的技能
- 在真实硬件上部署和配置了实时 IDS
- 编写了具备错误处理和去重逻辑的生产级 Bash 自动化脚本
- 管理了 systemd 服务(安装、启用、重启、故障排查)
- 采用与 Tier 1 SOC 工作相同的方法论,执行了警报分类和规则调优
- 维护了结构化、记录在案的白名单 —— 而不仅仅是“抑制后抛之脑后”
- 构建并配置了 Zero Trust VPN 以实现安全的远程访问
- 建立并记录了网络流量基准
标签:Metaprompt, Suricata, 入侵检测系统, 安全数据湖, 家庭实验室, 应用安全, 现代安全运营, 自动化告警, 零信任网络