Innobytix-IT/Net_fire_monitor

GitHub: Innobytix-IT/Net_fire_monitor

跨平台轻量级网络入侵防御系统,融合实时流量监控、威胁情报与自动防火墙联动

Stars: 0 | Forks: 0

# Net-Fire-Monitor v3.9 # 🇩🇪 德语 ## 目录 1. [Net-Fire-Monitor 是什么?](#was-ist-net-fire-monitor) 2. [v3.9 有哪些新功能?](#was-ist-neu-in-v39) 3. [架构(双进程模型)](#architektur-zwei-prozess-modell) 4. [系统要求](#voraussetzungen) 5. [安装说明](#installation) 6. [启动与运行](#start--betrieb) 7. [Web 界面](#web-interface) 8. [安全设置电子邮件密码](#e-mail-passwort-sicher-einrichten) 9. [配置](#konfiguration) 10. [防火墙模式](#firewall-modi) 11. [威胁情报](#threat-intelligence) 12. [定义防火墙规则](#firewall-regeln-definieren) 13. [电子邮件通知](#e-mail-benachrichtigung) 14. [Syslog 导出](#syslog-export) 15. [仪表板概览](#dashboard-übersicht) 16. [日志文件](#log-dateien) 17. [常见问题 (FAQ)](#häufige-fragen-faq) 18. [安全说明](#sicherheitshinweise) 19. [项目结构](#projektstruktur) ## Net-Fire-Monitor 是什么? Net-Fire-Monitor 是一个适用于 Linux、Windows 和 macOS 的主动式**网络监控与入侵防御系统 (IPS)**。它实时捕获所有网络流量,检测异常,并可以通过系统防火墙自动封锁攻击者 IP。 该工具同时提供两个操作界面: - **终端仪表板** – 在终端中直接显示基于 Rich 的实时视图 - **Web 界面** – 受 HTTPS 保护的浏览器仪表板,具有 CSRF 防护,可在整个网络中访问 ## v3.9 有哪些新功能? | 变更 | 详情 | |----------|---------| | **双进程架构** | 监控进程以 root 运行 (Scapy + iptables),Web 界面以非特权用户 `netfiremon` 运行 | | **HTTPS Web 界面** | 自签名证书自动生成,包含 LAN IP SANs | | **CSRF 防护** | 所有写入类 API 端点均受 CSRF Token 保护 | | **scrypt 密码哈希** | Web 界面密码使用 scrypt (n=16384) 哈希,旧版 SHA-256 自动迁移 | | **暴力破解防护** | 10 次失败尝试 → 15 分钟锁定 | | **基于文件系统的 IPC** | 监控进程与 Web 进程通过原子文件写入通信,而非共享内存 | | **重启后持久化** | 被封锁的 IP、规则、白名单和黑名单在系统启动后恢复 | | **OOM 保护** | 有限的数据结构 (`_BoundedCounter`, `_BoundedPortscanTracker`) 防止 SYN Flood 导致的 RAM 耗尽 | | **安全标头** | 自动设置 X-Frame-Options, CSP, HSTS, Referrer-Policy | | **TI 白名单保护** | 白名单 IP 绝不会通过威胁情报自动封锁 | | **TI 启动抖动** | Feed 下载以随机偏移量 (0–5 分钟) 启动 | | **Syslog 导出** | CEF 格式, TCP/UDP, 可配置 | ## 架构(双进程模型) ``` ┌─────────────────────────────────────────────┐ │ netfiremon.service (User: root) │ │ ┌──────────────────────────────────────┐ │ │ │ NetworkMonitor (Scapy, iptables) │ │ │ │ FirewallEngine, ThreatIntelManager │ │ │ │ RuleEngine, EmailNotifier │ │ │ └──────────┬──────────────────────┬───┘ │ │ │ schreibt alle 2s │ liest │ │ LIVE_STATE_FILE CMD_QUEUE │ └─────────────┼──────────────────────┼────────┘ │ │ ┌─────────────┼──────────────────────┼────────┐ │ netfiremon-web.service (User: netfiremon) │ │ ┌──────────▼──────────────────────▼───┐ │ │ │ Flask/Gunicorn (Port 5443, HTTPS) │ │ │ │ CSRF · Auth · Security-Header │ │ │ └──────────────────────────────────────┘ │ └─────────────────────────────────────────────┘ ``` **为什么采用双进程?** - 监控进程需要 Root 权限才能使用 Scapy 和 iptables。 - Web 界面**不需要**这些权限,因此以非特权系统用户运行。即使 Web 界面被攻陷,也无法直接操纵防火墙规则。 - 通信通过 `data/` 目录中的原子文件写入操作进行。 ## 系统要求 - **Python 3.10** 或更新版本 - **Linux** (推荐): `iptables`, `ip6tables`, `systemd` - **Windows**: [Npcap](https://npcap.com/#download) + 管理员权限 - **macOS**: `pfctl` + Root 权限 (`sudo`) Python 包在首次启动时**自动安装**: ``` scapy · rich · plyer · geoip2 · requests · flask · gunicorn · cryptography ``` ### 可选:Geo-IP 数据库 要显示国家和城市信息,需要 MaxMind 提供的免费 **GeoLite2-City** 数据库: 1. 创建账户:[maxmind.com/en/geolite2/signup](https://www.maxmind.com/en/geolite2/signup) 2. 下载 `GeoLite2-City.mmdb` 3. 将文件复制到 `/opt/netfiremon/GeoLite2-City.mmdb`(或手动启动时复制到项目目录) ## 安装说明 ### Linux – 通过 install.sh 自动安装 (推荐) ``` # 以 root 运行: sudo bash install.sh ``` 该脚本执行以下步骤: 1. 创建系统用户 `netfiremon` (无登录, 无 Home 目录) 2. 创建 `/opt/netfiremon/` 并设置正确的文件权限 3. 将所有 Python 包安装到虚拟环境 (`.venv`) 4. 注册 `netfiremon.service` (监控, root) 和 `netfiremon-web.service` (Web, 非特权) 5. 运行设置向导 (密码, 配置) 6. 启动两个服务 ### 管理服务 ``` # 检查状态 sudo systemctl status netfiremon netfiremon-web # 重启 sudo systemctl restart netfiremon netfiremon-web # 实时跟踪 Logs sudo journalctl -u netfiremon -f sudo journalctl -u netfiremon-web -f ``` ### Windows / macOS – 手动安装 ``` # Windows (以管理员身份): python netfiremon_web.py # Linux / macOS (需要 Root): sudo python3 netfiremon_web.py ``` ## 启动与运行 在**首次启动**时(或使用 `--setup`),设置向导将启动: ``` sudo python3 netfiremon_web.py --setup ``` 在**自动模式**下 (用于 systemd): ``` sudo python3 netfiremon_web.py --auto ``` ### 启动模式 (交互式) ``` 0 – Nur Terminal-Dashboard 1 – Terminal + Web-Interface 2 – Nur Web-Interface ``` ## Web 界面 Web 界面可通过 HTTPS 访问: ``` https://:5443 ``` ### Web 界面功能 | 页面 | 功能 | |-------|---------| | **仪表板** | 实时统计、图表、Top Talker、协议、最近数据包 | | **警报** | 警报列表,每个 IP 都有白名单/黑名单/封锁按钮 | | **白名单 / 黑名单** | 添加和移除 IP | | **防火墙规则** | 创建和删除端口/协议规则 | | **日志** | 实时查看监控日志和防火墙日志 | | **配置** | 通过 UI 调整所有参数 | ### 网络模式与密码 如果 Web 界面可在网络范围内访问 (bind `0.0.0.0`),则密码是**强制性的**。密码在设置向导中设置一次,并以 **scrypt** 哈希存储。 ## 安全设置电子邮件密码 电子邮件密码**绝不**存储在配置文件中。它通过环境变量 `NFM_EMAIL_PASSWORD` 加载,或单独存储在 `data/.email_password` 中 (文件权限 0600)。 ### Gmail – 创建应用密码 (必需!) 1. 访问 [myaccount.google.com/apppasswords](https://myaccount.google.com/apppasswords) 2. 名称:`NetFireMonitor` → **创建** 3. 记下 16 位代码 ### 设置环境变量 **Windows** (永久, 以管理员身份): ``` setx NFM_EMAIL_PASSWORD "abcdefghijklmnop" /M ``` **Linux / macOS** (永久, 在 `~/.bashrc` 或 `~/.zshrc` 中): ``` export NFM_EMAIL_PASSWORD="abcdefghijklmnop" ``` **仅限单次会话 (Linux/macOS):** ``` NFM_EMAIL_PASSWORD="abcdefghijklmnop" sudo -E python3 netfiremon_web.py ``` ## 配置 所有设置保存在 `data/net_fire_monitor_config.json` 中。 ### 所有参数 | 参数 | 默认值 | 描述 | |-----------|----------|--------------| | `average_period` | `60` | 基线测量时长(秒) | | `monitor_interval` | `10` | 测量间隔(秒) | | `threshold` | `20` | 警报阈值(高于基线的 %) | | `bpf_filter` | 依平台而定 | Scapy BPF 过滤器 | | `interface` | `""` | 网络接口 (`""` = 所有) | | `interfaces` | `[]` | 同时使用多个接口 | | `notify_desktop` | `true` | 桌面通知 | | `notify_log` | `true` | 日志文件记录 | | `resolve_dns` | `true` | 仪表板中的 DNS 解析 | | `geo_lookup` | `true` | Geo-IP 国家检测 | | `detect_portscan` | `true` | 端口扫描检测 | | `portscan_limit` | `100` | 每 10 秒端口数 → 端口扫描警报 | | `whitelist` | `[]` | 免除流量警报和自动封锁的 IP | | `blacklist` | `[]` | 每个数据包都触发立即警报的 IP | | `firewall_mode` | `"monitor"` | 防火墙模式(见下文) | | `firewall_rules` | `[]` | 自定义端口/协议规则 | | `max_tracked_ips` | `50000` | RAM 中的最大 IP 数 (OOM 保护) | | `threat_intel_enabled` | `true` | 启用威胁情报源 | | `threat_intel_auto_block` | `false` | 自动封锁已知的恶意 IP | | `threat_intel_feeds` | `[...]` | Feed URL | | `threat_intel_update_interval` | `3600` | Feed 更新间隔(秒) | | `email_enabled` | `false` | 电子邮件通知 | | `email_smtp` | `"smtp.gmail.com"` | SMTP 服务器 | | `email_port` | `587` | SMTP 端口 | | `email_user` | `""` | 发件人电子邮件地址 | | `email_recipient` | `""` | 收件人电子邮件地址 | | `email_sender` | `""` | 发件人显示名称 (可选) | | `export_csv` | `true` | 保存 CSV 报告 | | `export_json` | `false` | 保存 JSON 报告 | | `report_rotate` | `7` | N 天后删除报告 | | `syslog_enabled` | `false` | 启用 Syslog 导出 | | `syslog_host` | `"localhost"` | Syslog 目标主机 | | `syslog_port` | `514` | Syslog 端口 | | `syslog_protocol` | `"udp"` | `udp` 或 `tcp` | | `syslog_tag` | `"net-fire-monitor"` | Syslog 标签前缀 | | `behind_reverse_proxy` | `false` | 启用 ProxyFix (仅当使用 nginx/caddy 时!) | ## 防火墙模式 ### 👁 monitor (默认) 仅观察。无自动干预。非常适合了解您自己的网络。 ### ⚡ confirm 发生警报时发送电子邮件。封锁通过 Web 界面或终端手动进行。需要配置电子邮件。 ### 🔥 auto 可疑的外部 IP 被**立即自动封锁**。适用以下保护措施: - **白名单**上的 IP **绝不会**被封锁——即使通过威胁情报也不会 - **私有/LAN IP** 绝不会被封锁 - **速率限制**:每分钟最多封锁 30 次,每个 IP 至少间隔 10 秒 - 正常退出时会询问是否解除所有规则 - 系统启动时,持久化快照中被封锁的 IP 将被恢复 ## 威胁情报 该工具自动从可配置的 Feed 下载已知威胁 IP 列表: | Feed | 描述 | |------|-------------| | **Feodo Tracker** | 僵尸网络命令与控制服务器 | | **CINS Army** | 已知攻击者 IP | | **Spamhaus DROP** | 被盗/受损网络 (CIDR) | **技术细节:** - Feed 在后台每 **60 分钟**更新一次(可配置间隔) - 启动抖动:每个实例随机等待 0–5 分钟,以免 Feed 服务器过载 - 在 `data/threat_intel_cache.txt` 中进行本地缓存 → 快速启动,无需等待 - **支持 CIDR**:像 `185.220.0.0/16` 这样的网络地址作为网络范围进行检查 - 启动时显示:`TI: 12.450 IPs + 38 Netze` - 每个 Feed 最多下载 50 MB(防止 Feed 服务器受损) - **白名单优先**:即使处于 `auto` 模式,威胁情报也绝不会封锁白名单 IP ## 定义防火墙规则 规则可在 Web 界面的 **防火墙规则** 下创建,或直接在配置文件的 `firewall_rules` 中定义: ``` "firewall_rules": [ { "proto": "tcp", "port": 23, "src_ip": "", "action": "block", "comment": "Telnet immer blockieren" }, { "proto": "tcp", "port": 3389, "src_ip": "", "action": "alert", "comment": "RDP-Zugriff immer alarmieren" }, { "proto": "any", "port": 0, "src_ip": "10.0.0.99", "action": "block", "comment": "Bestimmte interne IP blockieren" } ] ``` | 字段 | 值 | 描述 | |------|-------|-------------| | `proto` | `tcp`, `udp`, `icmp`, `any` | 协议 | | `port` | `0`–`65535` (`0` = 所有端口) | 目标端口 | | `src_ip` | IP 地址或 `""` 表示所有 | 源 IP | | `action` | `block`, `alert`, `allow` | 匹配时的操作 | | `comment` | 任意文本 (最多 200 字符) | 规则描述 | ## 电子邮件通知 每次发生警报时,Net-Fire-Monitor 会发送一封包含完整 IP 分析的 HTML 电子邮件: ``` 🚨 Net-Fire-Monitor Alarm Zeitpunkt : 2026-03-14 10:27:17 Alarm : Netzwerkverkehr 293.6 pps via 2.16.168.125 ... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ IP : 2.16.168.125 Hostname : a2-16-168-125.deploy.static.akamaitechnologies.com Geo-IP : Frankfurt am Main, DE Besitzer : Akamai Technologies Bedrohung : ✅ Nicht bekannt ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Grund : PPS_Exceeded Modus : confirm ``` 分析通过以下方式自动进行: - **socket.gethostbyaddr()** → 主机名 (线程安全, 0.5 秒超时) - **whois** (Linux/macOS) → 所有者/组织 - **Geo-IP** (如果存在 GeoLite2 数据库) → 国家和城市 - **威胁情报缓存** → 威胁状态 ## Syslog 导出 Net-Fire-Monitor 可以将警报以 **CEF 格式** (Common Event Format) 发送到 Syslog 服务器: ``` Konfiguration in der Config oder im Web-Interface: syslog_enabled: true syslog_host: "192.168.1.10" syslog_port: 514 syslog_protocol: "udp" # oder "tcp" syslog_tag: "net-fire-monitor" ``` 示例 CEF 消息: ``` <132>Mar 14 10:27:17 hostname net-fire-monitor: CEF:0|NetFireMonitor|Net-Fire-Monitor|3.9|threat_intel|☠️ Bekannte Bedrohung: 185.220.101.45|4|src=185.220.101.45 reason=threat_intel ``` ## 仪表板概览 ### Web 仪表板 (https://\:5443) Web 仪表板实时显示: - **标头**:接口、防火墙模式 (MONITOR/CONFIRM/AUTO)、TI 条目 (如 `12.450 IPs + 38 Netze`)、时钟 - **图表**:过去 60 秒的 PPS 历史,带有基线标记 - **统计**:当前 PPS/BPS、基线、阈值、警报计数、已封锁 IP - **Top Talker**:IP、主机名、Geo-IP、LAN/WAN 指示器、数据包计数 - **协议条**:TCP / UDP / ICMP / OTHER - **Top 端口**:端口、服务、计数 - **最近数据包**:时间戳、地理位置、源 IP → 目标 IP、协议、端口、大小 ### 终端仪表板 ``` ╔══════════════════════════════════════════════════════╗ ║ NET-FIRE-MONITOR v3.9 │ eth0 │ 🔥 AUTO ║ ║ TI: 12.450 IPs + 38 Netze │ 10:29:40 ║ ╠══════════════════════════════════════════════════════╣ ║ 📈 PPS-Verlauf (letzte 60 Sekunden) ║ ╠══════════════╦═══════════════╦═════════════════════╣ ║ 📊 Statistik ║ 🔌 Protokolle ║ 🚨 Letzte Alarme ║ ╠══════════════╩═══════════════╬═════════════════════╣ ║ 🔝 Top-Talker ║ 🔒 Top-Ports ║ ╠══════════════════════════════╩═════════════════════╣ ║ 📦 Letzte Pakete (mit Geo-IP) ║ ╚════════════════════════════════════════════════════╝ ``` ## 日志文件 所有文件位于 `data/` 中(systemd 安装时为 `/opt/netfiremon/data/`): | 文件 | 内容 | 最大大小 | |-------|--------|------------| | `net_fire_monitor.log` | 所有事件和警报 | 5 MB × 3 个备份 | | `firewall.log` | 所有防火墙操作 (BLOCKED / UNBLOCKED) | 2 MB × 5 个备份 | | `net_fire_monitor_live.json` | Web 界面的实时状态 (每 2 秒) | ~50 KB | | `net_fire_monitor_state.json` | 完整快照 (退出时) | ~200 KB | | `net_fire_monitor_baseline.json` | 保存的基线 (最多 24 小时) | ~1 KB | | `net_fire_monitor_persist.json` | 被封锁的 IP、规则、列表 (重启持久化) | 可变 | | `threat_intel_cache.txt` | 已知威胁 IP 和网络 (缓存) | 可变 | | `cmd_queue/` | IPC 目录:从 Web 到监控进程的命令 | 临时 | | `reports/*.csv` | 数据包报告 | N 天后轮转 | ## 常见问题 (FAQ) **尽管模式设置为 `auto`,工具并未封锁 IP。** → 检查管理员权限。防火墙规则需要提升权限 (Windows:以管理员身份运行 / Linux:`sudo` 或 systemd 服务)。 **电子邮件发送失败 (`BadCredentials`)。** → 对于 Gmail,请使用应用密码,而不是真实密码。请参阅“安全设置电子邮件密码”部分。 **我不小心把自己/合法 IP 封锁了。** → 停止工具 (Strg+C) → 退出时使用 `y` 确认“解除所有防火墙规则?”。 或者手动操作: ``` # Linux: sudo iptables -D INPUT -s 1.2.3.4 -m comment --comment "NetFireMon" -j DROP sudo iptables -D OUTPUT -s 1.2.3.4 -m comment --comment "NetFireMon" -j DROP sudo iptables -D FORWARD -s 1.2.3.4 -m comment --comment "NetFireMon" -j DROP # Windows: netsh advfirewall firewall delete rule name="NetFireMon_Block_1.2.3.4" ``` **误报警报太多。** → 将已知 IP 添加到白名单。提高 `threshold` 值(例如提高到 40–50 %)。切换到 `confirm` 模式。 **威胁情报列表为空。** → 检查互联网连接。工具会在下次启动时从缓存加载。Feed 错误记录在 `net_fire_monitor.log` 中。 **Web 界面无法访问。** → 检查 `netfiremon-web.service` 是否正在运行:`sudo systemctl status netfiremon-web`。日志:`sudo journalctl -u netfiremon-web -n 50`。 **浏览器显示证书警告。** → 自签名证书属于正常现象。在浏览器中点击一次“接受风险”。在生产环境中,可以将 `certs/` 中的证书替换为您自己的。 **监控服务未启动,正在等待网络。** → 服务中的 `ExecStartPre` 最多等待 30 秒以获取活动接口。检查网络接口是否确实处于 `UP` 状态。 ## 安全说明 - **请仅在自己的网络中运行!** 在大多数国家,在他人网络中捕获数据包是非法的。 - 配置文件包含个人网络数据 → **请勿上传至 GitHub**。 - 电子邮件密码不存储在配置中——它通过 `NFM_EMAIL_PASSWORD` 或 `data/.email_password` 加载。 - 在 `auto` 模式下,误报可能会封锁合法 IP。激活前请仔细设置**白名单**。 - **白名单中的公共 IP** 绝不会被封锁——即使通过威胁情报也不会。如果白名单中存在公共 IP,会向日志写入警告。 - 网络模式下的 Web 界面受密码、HTTPS、CSRF Token 和暴力破解保护。对于面向互联网的部署,请在前面放置反向代理 (nginx/caddy)。 - `behind_reverse_proxy` 参数**仅**在确实有反向代理前置时才能启用——否则 `X-Forwarded-For` 是可伪造的。 ## 项目结构 ``` netfiremon/ ├── core.py ← Gemeinsame Engine (Monitor, Firewall, TI, IPC) ├── netfiremon_web.py ← Web-Interface (Flask/Gunicorn) + Setup-Wizard ├── netfiremon_terminal.py ← Terminal-Dashboard (Rich) ├── netfiremon.service ← systemd: Monitor-Prozess (root) ├── netfiremon-web.service ← systemd: Web-Prozess (netfiremon user) ├── install.sh ← Installations-Skript ├── requirements.txt ← Python-Abhängigkeiten ├── web/ │ ├── templates/ │ │ ├── base.html ← Basis-Layout mit CSRF-Helper │ │ ├── dashboard.html ← Dashboard-Seite │ │ └── login.html ← Login-Seite │ └── static/ │ ├── app.js ← Navigation, Alarme, Listen, Regeln, Config │ ├── dashboard.js ← Live-Graph, Stats, Top-Talker │ └── style.css ← Terminal-Dark-Theme └── certs/ ← TLS-Zertifikat (auto-generiert) ├── cert.pem └── key.pem ``` **不在仓库中(通过 .gitignore 保护):** ``` data/ ← Alle veränderlichen Daten net_fire_monitor_config.json ← Persönliche Einstellungen net_fire_monitor.log ← Monitor-Log firewall.log ← Firewall-Aktionen net_fire_monitor_live.json ← Live-State net_fire_monitor_state.json ← Snapshot net_fire_monitor_baseline.json ← Baseline net_fire_monitor_persist.json ← Persistenz-Daten net_fire_monitor_web_config.json ← Web-Passwort-Hash .email_password ← E-Mail-Passwort (0600) .web_secret_key ← Flask Session-Key (0600) threat_intel_cache.txt ← IP-Listen Cache cmd_queue/ ← IPC-Queue reports/ ← CSV/JSON-Reports GeoLite2-City.mmdb ← Geo-IP-Datenbank (zu groß für Git) ``` *Net-Fire-Monitor 是一个开源项目,按原样提供,不提供任何保证。* *使用风险自负——请仅在自己的网络中捕获数据包!* # 🇬🇧 英语 ## 目录 1. [什么是 Net-Fire-Monitor?](#what-is-net-fire-monitor) 2. [v3.9 有哪些新功能?](#whats-new-in-v39) 3. [架构(双进程模型)](#architecture-two-process-model) 4. [系统要求](#requirements) 5. [安装说明](#installation-1) 6. [启动与运行](#starting--running) 7. [Web 界面](#web-interface-1) 8. [安全设置电子邮件密码](#setting-up-the-e-mail-password-securely) 9. [配置](#configuration-1) 10. [防火墙模式](#firewall-modes) 11. [威胁情报](#threat-intelligence-1) 12. [定义防火墙规则](#defining-firewall-rules) 13. [电子邮件通知](#e-mail-notifications) 14. [Syslog 导出](#syslog-export-1) 15. [仪表板概览](#dashboard-overview) 16. [日志文件](#log-files) 17. [常见问题](#faq) 18. [安全说明](#security-notes) 19. [项目结构](#project-structure) ## 什么是 Net-Fire-Monitor? Net-Fire-Monitor 是一个适用于 Linux、Windows 和 macOS 的主动式**网络监控与入侵防御系统 (IPS)**。它实时捕获所有网络流量,检测异常,并可以通过系统防火墙自动封锁攻击者 IP。 该工具同时提供两个操作界面: - **终端仪表板** – 在终端中直接显示基于 Rich 的实时视图 - **Web 界面** – 受 HTTPS 保护的浏览器仪表板,具有 CSRF 防护,可在整个网络中访问 ## v3.9 有哪些新功能? | 变更 | 详情 | |--------|---------| | **双进程架构** | 监控进程以 root 运行 (Scapy + iptables),Web 界面以非特权用户 `netfiremon` 运行 | | **HTTPS Web 界面** | 自动生成自签名证书,包含 LAN IP SANs | | **CSRF 防护** | 所有写入类 API 端点均受 CSRF Token 保护 | | **scrypt 密码哈希** | Web 界面密码使用 scrypt (n=16384) 哈希,旧版 SHA-256 自动迁移 | | **暴力破解防护** | 10 次失败尝试 → 15 分钟锁定 | | **基于文件的 IPC** | 监控进程与 Web 进程通过原子文件写入通信 | | **重启后持久化** | 被封锁的 IP、规则、白名单和黑名单在系统重启后恢复 | | **OOM 保护** | 有限的数据结构防止 SYN Flood 期间的 RAM 耗尽 | | **安全标头** | 自动设置 X-Frame-Options, CSP, HSTS, Referrer-Policy | | **TI 白名单保护** | 白名单 IP 绝不会通过威胁情报自动封锁 | | **TI 启动抖动** | Feed 下载以随机偏移量 (0–5 分钟) 启动 | | **Syslog 导出** | CEF 格式, TCP/UDP, 可配置 | ## 架构(双进程模型) ``` ┌─────────────────────────────────────────────┐ │ netfiremon.service (User: root) │ │ ┌──────────────────────────────────────┐ │ │ │ NetworkMonitor (Scapy, iptables) │ │ │ │ FirewallEngine, ThreatIntelManager │ │ │ │ RuleEngine, EmailNotifier │ │ │ └──────────┬──────────────────────┬───┘ │ │ │ writes every 2s │ reads │ │ LIVE_STATE_FILE CMD_QUEUE │ └─────────────┼──────────────────────┼────────┘ │ │ ┌─────────────┼──────────────────────┼────────┐ │ netfiremon-web.service (User: netfiremon) │ │ ┌──────────▼──────────────────────▼───┐ │ │ │ Flask/Gunicorn (Port 5443, HTTPS) │ │ │ │ CSRF · Auth · Security Headers │ │ │ └──────────────────────────────────────┘ │ └─────────────────────────────────────────────┘ ``` **为什么采用双进程?** - 监控进程需要 Root 权限才能使用 Scapy 和 iptables。 - Web 界面**不需要**这些权限,因此以非特权系统用户运行。即使 Web 界面被攻陷,也无法直接操纵防火墙规则。 - 通信通过 `data/` 目录中的原子文件写入操作进行。 ## 系统要求 - **Python 3.10** 或更新版本 - **Linux** (推荐): `iptables`, `ip6tables`, `systemd` - **Windows**: [Npcap](https://npcap.com/#download) + 管理员权限 - **macOS**: `pfctl` + Root 权限 (`sudo`) Python 包在首次启动时**自动安装**: ``` scapy · rich · plyer · geoip2 · requests · flask · gunicorn · cryptography ``` ### 可选:Geo-IP 数据库 要显示国家和城市信息,需要 MaxMind 提供的免费 **GeoLite2-City** 数据库: 1. 创建账户:[maxmind.com/en/geolite2/signup](https://www.maxmind.com/en/geolite2/signup) 2. 下载 `GeoLite2-City.mmdb` 3. 将文件复制到 `/opt/netfiremon/GeoLite2-City.mmdb`(或手动安装时复制到项目目录) ## 安装说明 ### Linux – 通过 install.sh 自动安装 (推荐) ``` # 以 root 运行: sudo bash install.sh ``` 该脚本执行以下步骤: 1. 创建 `netfiremon` 系统用户 (无登录, 无主目录) 2. 创建 `/opt/netfiremon/` 并设置正确的文件权限 3. 将所有 Python 包安装到虚拟环境 (`.venv`) 4. 注册 `netfiremon.service` (监控, root) 和 `netfiremon-web.service` (Web, 非特权) 5. 运行设置向导 (密码, 配置) 6. 启动两个服务 ### 管理服务 ``` # 检查状态 sudo systemctl status netfiremon netfiremon-web # 重启 sudo systemctl restart netfiremon netfiremon-web # 实时跟踪 Logs sudo journalctl -u netfiremon -f sudo journalctl -u netfiremon-web -f ``` ### Windows / macOS – 手动安装 ``` # Windows (以管理员身份): python netfiremon_web.py # Linux / macOS (需要 root): sudo python3 netfiremon_web.py ``` ## 启动与运行 在**首次启动**时(或使用 `--setup`),设置向导将启动: ``` sudo python3 netfiremon_web.py --setup ``` 在**自动模式**下 (用于 systemd): ``` sudo python3 netfiremon_web.py --auto ``` ### 启动模式 (交互式) ``` 0 – Terminal dashboard only 1 – Terminal + web interface 2 – Web interface only ``` ## Web 界面 Web 界面可通过 HTTPS 访问: ``` https://:5443 ``` ### Web 界面功能 | 页面 | 功能 | |------|---------| | **仪表板** | 实时统计、图表、Top Talker、协议、最近数据包 | | **警报** | 警报列表,每个 IP 都有白名单/黑名单/封锁按钮 | | **白名单 / 黑名单** | 添加和移除 IP | | **防火墙规则** | 创建和删除端口/协议规则 | | **日志** | 实时查看监控日志和防火墙日志 | | **配置** | 通过 UI 调整所有参数 | ### 网络模式与密码 如果 Web 界面可在网络范围内访问 (bind `0.0.0.0`),则密码是**强制性的**。密码在设置向导中设置一次,并以 **scrypt** 哈希存储。 ## 安全设置电子邮件密码 电子邮件密码**绝不**存储在配置文件中。它通过环境变量 `NFM_EMAIL_PASSWORD` 加载,或单独存储在 `data/.email_password` 中 (文件权限 0600)。 ### Gmail – 创建应用密码 (必需!) 1. 访问 [myaccount.google.com/apppasswords](https://myaccount.google.com/apppasswords) 2. 名称:`NetFireMonitor` → **创建** 3. 记下 16 位代码 ### 设置环境变量 **Windows** (永久, 以管理员身份): ``` setx NFM_EMAIL_PASSWORD "abcdefghijklmnop" /M ``` **Linux / macOS** (永久, 在 `~/.bashrc` 或 `~/.zshrc` 中): ``` export NFM_EMAIL_PASSWORD="abcdefghijklmnop" ``` **仅限单次会话 (Linux/macOS):** ``` NFM_EMAIL_PASSWORD="abcdefghijklmnop" sudo -E python3 netfiremon_web.py ``` ## 配置 所有设置保存在 `data/net_fire_monitor_config.json` 中。 ### 所有参数 | 参数 | 默认值 | 描述 | |-----------|---------|-------------| | `average_period` | `60` | 基线测量时长(秒) | | `monitor_interval` | `10` | 测量间隔(秒) | | `threshold` | `20` | 警报阈值(高于基线的 %) | | `bpf_filter` | 依平台而定 | Scapy BPF 过滤器 | | `` | `""` | 网络接口 (`""` = 所有) | | `interfaces` | `[]` | 同时使用多个接口 | | `notify_desktop` | `true` | 桌面通知 | | `notify_log` | `true` | 日志文件记录 | | `resolve_dns` | `true` | 仪表板中的 DNS 解析 | | `geo_lookup` | `true` | Geo-IP 国家检测 | | `detect_portscan` | `true` | 端口扫描检测 | | `portscan_limit` | `100` | 每 10 秒端口数 → 端口扫描警报 | | `whitelist` | `[]` | 免除流量警报和自动封锁的 IP | | `blacklist` | `[]` | 每个数据包都触发立即警报的 IP | | `firewall_mode` | `"monitor"` | 防火墙模式(见下文) | | `firewall_rules` | `[]` | 自定义端口/协议规则 | | `max_tracked_ips` | `50000` | RAM 中的最大 IP 数 (OOM 保护) | | `threat_intel_enabled` | `true` | 启用威胁情报源 | | `threat_intel_auto_block` | `false` | 自动封锁已知的恶意 IP | | `threat_intel_feeds` | `[...]` | Feed URL | | `threat_intel_update_interval` | `3600` | Feed 更新间隔(秒) | | `email_enabled` | `false` | 电子邮件通知 | | `email_smtp` | `"smtp.gmail.com"` | SMTP 服务器 | | `email_port` | `587` | SMTP 端口 | | `email_user` | `""` | 发件人电子邮件地址 | | `email_recipient` | `""` | 收件人电子邮件地址 | | `email_sender` | `""` | 发件人显示名称 (可选) | | `export_csv` | `true` | 保存 CSV 报告 | | `export_json` | `false` | 保存 JSON 报告 | | `report_rotate` | `7` | N 天后删除报告 | | `syslog_enabled` | `false` | 启用 Syslog 导出 | | `syslog_host` | `"localhost"` | Syslog 目标主机 | | `syslog_port` | `514` | Syslog 端口 | | `syslog_protocol` | `"udp"` | `udp` 或 `tcp` | | `syslog_tag` | `"net-fire-monitor"` | Syslog 标签前缀 | | `behind_reverse_proxy` | `false` | 启用 ProxyFix (仅当使用 nginx/caddy 时!) | ## 防火墙模式 ### 👁 monitor (默认) 仅观察。无自动干预。非常适合入门和了解您的网络。 ### ⚡ confirm 发生警报时发送电子邮件。封锁通过 Web 界面或终端手动进行。需要配置电子邮件。 ### 🔥 auto 可疑的外部 IP 被**立即自动封锁**。适用以下保护措施: - **白名单**上的 IP **绝不会**被封锁——即使通过威胁情报也不会 - **私有/LAN IP** 绝不会被封锁 - **速率限制**:每分钟最多封锁 30 次,每个 IP 至少间隔 10 秒 - 正常退出时会询问是否解除所有规则 - 系统重启时,持久化快照中被封锁的 IP 将被恢复 ## 威胁情报 该工具自动从可配置的 Feed 下载已知恶意 IP 列表: | Feed | 描述 | |------|-------------| | **Feodo Tracker** | 僵尸网络命令与控制服务器 | | **CINS Army** | 已知攻击者 IP | | **Spamhaus DROP** | 被盗/受损网络 (CIDR) | **技术细节:** - Feed 在后台每 **60 分钟**更新一次(可配置间隔) - 启动抖动:每个实例随机等待 0–5 分钟,以免 Feed 服务器过载 - 在 `data/threat_intel_cache.txt` 中进行本地缓存 → 快速启动,无需等待 - **支持 CIDR**:像 `185.220.0.0/16` 这样的网络地址作为网络范围进行检查 - 仪表板显示:`TI: 12,450 IPs + 38 networks` - 每个 Feed 最多下载 50 MB(防止 Feed 服务器受损) - **白名单优先**:即使处于 `auto` 模式,威胁情报也绝不会封锁白名单 IP ## 定义防火墙规则 规则可在 Web 界面的 **防火墙规则** 下创建,或直接在配置文件的 `firewall_rules` 中定义: ``` "firewall_rules": [ { "proto": "tcp", "port": 23, "src_ip": "", "action": "block", "comment": "Always block Telnet" }, { "proto": "tcp", "port": 3389, "src_ip": "", "action": "alert", "comment": "Always alert on RDP access" }, { "proto": "any", "port": 0, "src_ip": "10.0.0.99", "action": "block", "comment": "Block specific internal IP" } ] ``` | 字段 | 值 | 描述 | |-------|--------|-------------| | `proto` | `tcp`, `udp`, `icmp`, `any` | 协议 | | `port` | `0`–`65535` (`0` = 所有端口) | 目标端口 | | `src_ip` | IP 地址或 `""` 表示所有 | 源 IP | | `action` | `block`, `alert`, `allow` | 匹配时的操作 | | `comment` | 任意文本 (最多 200 字符) | 规则描述 | ## 电子邮件通知 每次发生警报时,Net-Fire-Monitor 会发送一封包含完整 IP 分析的 HTML 电子邮件: ``` 🚨 Net-Fire-Monitor Alert Timestamp : 2026-03-14 10:27:17 Alert : Network traffic 293.6 pps via 2.16.168.125 ... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ IP : 2.16.168.125 Hostname : a2-16-168-125.deploy.static.akamaitechnologies.com Geo-IP : Frankfurt am Main, DE Owner : Akamai Technologies Threat : ✅ Not known ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Reason : PPS_Exceeded Mode : confirm ``` IP 分析通过以下方式自动进行: - **socket.gethostbyaddr()** → 主机名 (线程安全, 0.5 秒超时) - **whois** (Linux/macOS) → 所有者/组织 - **Geo-IP** (如果存在 GeoLite2 数据库) → 国家和城市 - **威胁情报缓存** → 威胁状态 ## Syslog 导出 Net-Fire-Monitor 可以将警报以 **CEF 格式** (Common Event Format) 发送到 Syslog 服务器: ``` Configuration in config or web interface: syslog_enabled: true syslog_host: "192.168.1.10" syslog_port: 514 syslog_protocol: "udp" # or "tcp" syslog_tag: "net-fire-monitor" ``` 示例 CEF 消息: ``` <132>Mar 14 10:27:17 hostname net-fire-monitor: CEF:0|NetFireMonitor|Net-Fire-Monitor|3.9|threat_intel|Known threat: 185.220.101.45|4|src=185.220.101.45 reason=threat_intel ``` ## 仪表板概览 ### Web 仪表板 (https://\:5443) Web 仪表板实时显示: - **标头**:接口、防火墙模式 (MONITOR/CONFIRM/AUTO)、TI 条目 (如 `12,450 IPs + 38 networks`)、时钟 - **图表**:过去 60 秒的 PPS 历史,带有基线标记 - **统计**:当前 PPS/BPS、基线、阈值、警报计数、已封锁 IP - **Top Talker**:IP、主机名、Geo-IP、LAN/WAN 指示器、数据包计数 - **协议条**:TCP / UDP / ICMP / OTHER - **Top 端口**:端口、服务、计数 - **最近数据包**:时间戳、地理位置、源 IP → 目标 IP、协议、端口、大小 ### 终端仪表板 ``` ╔══════════════════════════════════════════════════════╗ ║ NET-FIRE-MONITOR v3.9 │ eth0 │ 🔥 AUTO ║ ║ TI: 12,450 IPs + 38 networks │ 10:29:40 ║ ╠══════════════════════════════════════════════════════╣ ║ 📈 PPS history (last 60 seconds) ║ ╠══════════════╦═══════════════╦═════════════════════╣ ║ 📊 Stats ║ 🔌 Protocols ║ 🚨 Recent alerts ║ ╠══════════════╩═══════════════╬═════════════════════╣ ║ 🔝 Top talkers ║ 🔒 Top ports ║ ╠══════════════════════════════╩═════════════════════╣ ║ 📦 Recent packets (with Geo-IP) ║ ╚════════════════════════════════════════════════════╝ ``` ## 日志文件 所有文件位于 `data/` 中(systemd 安装时为 `/opt/netfiremon/data/`): | 文件 | 内容 | 最大大小 | |------|----------|-----------| | `net_fire_monitor.log` | 所有事件和警报 | 5 MB × 3 个备份 | | `firewall.log` | 所有防火墙操作 (BLOCKED / UNBLOCKED) | 2 MB × 5 个备份 | | `net_fire_monitor_live.json` | Web 界面的实时状态 (每 2 秒) | ~50 KB | | `net_fire_monitor_state.json` | 完整快照 (退出时) | ~200 KB | | `net_fire_monitor_baseline.json` | 保存的基线 (最多 24 小时) | ~1 KB | | `net_fire_monitor_persist.json` | 被封锁的 IP、规则、列表 (重启持久化) | 可变 | | `threat_intel_cache.txt` | 已知威胁 IP 和网络 (缓存) | 可变 | | `cmd_queue/` | IPC 目录:从 Web 到监控进程的命令 | 临时 | | `reports/*.csv` | 数据包报告 | N 天后轮转 | ## 常见问题 **尽管模式设置为 `auto`,工具并未封锁 IP。** → 检查管理员权限。防火墙规则需要提升权限 (Windows:以管理员身份运行 / Linux:`sudo` 或 systemd 服务)。 **电子邮件发送失败 (`BadCredentials`)。** → 对于 Gmail,请使用应用密码,而不是真实密码。请参阅“安全设置电子邮件密码”部分。 **我不小心把自己/合法 IP 封锁了。** → 停止工具 (Ctrl+C) → 退出时使用 `y` 确认“解除所有防火墙规则?”。 或者手动移除: ``` # Linux: sudo iptables -D INPUT -s 1.2.3.4 -m comment --comment "NetFireMon" -j DROP sudo iptables -D OUTPUT -s 1.2.3.4 -m comment --comment "NetFireMon" -j DROP sudo iptables -D FORWARD -s 1.2.3.4 -m comment --comment "NetFireMon" -j DROP # Windows: netsh advfirewall firewall delete rule name="NetFireMon_Block_1.2.3.4" ``` **误报警报太多。** → 将已知 IP 添加到白名单。提高 `threshold` 值(例如提高到 40–50 %)。切换到 `confirm` 模式。 **威胁情报列表为空。** → 检查互联网连接。工具会在下次启动时从缓存加载。Feed 错误记录在 `net_fire_monitor.log` 中。 **Web 界面无法访问。** → 检查 `netfiremon-web.service` 是否正在运行:`sudo systemctl status netfiremon-web`。日志:`sudo journalctl -u netfiremon-web -n 50`。 **浏览器显示证书警告。** → 自签名证书属于正常现象。在浏览器中点击一次“接受风险”。在生产环境中,可以将 `certs/` 中的证书替换为您自己的。 **监控服务未启动,正在等待网络。** → 服务中的 `ExecStartPre` 最多等待 30 秒以获取活动接口。检查网络接口是否确实处于 `UP` 状态。 ## 安全说明 - **请仅在自己的网络中使用!** 在大多数国家,在他人网络中捕获数据包是非法的。 - 配置文件包含个人网络数据 → **请勿上传至 GitHub**。 - 电子邮件密码不存储在配置中——它通过 `NFM_EMAIL_PASSWORD` 或 `data/.email_password` 加载。 - 在 `auto` 模式下,误报可能会封锁合法 IP。启用前请设置您的**白名单**。 - **白名单中的公共 IP** 绝不会被封锁——即使通过威胁情报也不会。如果白名单中存在公共 IP,会向日志写入警告。 - 网络模式下的 Web 界面受密码、HTTPS、CSRF Token 和暴力破解保护。对于面向互联网的部署,请在前面放置反向代理 (nginx/caddy)。 - `behind_reverse_proxy` 参数**仅**在确实有反向代理前置时才能启用——否则 `X-Forwarded-For` 是可伪造的。 ## 项目结构 ``` netfiremon/ ├── core.py ← Shared engine (monitor, firewall, TI, IPC) ├── netfiremon_web.py ← Web interface (Flask/Gunicorn) + setup wizard ├── netfiremon_terminal.py ← Terminal dashboard (Rich) ├── netfiremon.service ← systemd: monitor process (root) ├── netfiremon-web.service ← systemd: web process (netfiremon user) ├── install.sh ← Installation script ├── requirements.txt ← Python dependencies ├── web/ │ ├── templates/ │ │ ├── base.html ← Base layout with CSRF helper │ │ ├── dashboard.html ← Dashboard page │ │ └── login.html ← Login page │ └── static/ │ ├── app.js ← Navigation, alarms, lists, rules, config │ ├── dashboard.js ← Live graph, stats, top talkers │ └── style.css ← Terminal dark theme └── certs/ ← TLS certificate (auto-generated) ├── cert.pem └── key.pem ``` **不在仓库中(通过 .gitignore 保护):** ``` data/ ← All mutable data net_fire_monitor_config.json ← Personal settings net_fire_monitor.log ← Monitor log firewall.log ← Firewall actions net_fire_monitor_live.json ← Live state net_fire_monitor_state.json ← Snapshot net_fire_monitor_baseline.json ← Baseline net_fire_monitor_persist.json ← Persistence data net_fire_monitor_web_config.json ← Web password hash .email_password ← E-mail password (0600) .web_secret_key ← Flask session key (0600) threat_intel_cache.txt ← IP list cache cmd_queue/ ← IPC queue reports/ ← CSV/JSON reports GeoLite2-City.mmdb ← Geo-IP database (too large for Git) ``` *Net-Fire-Monitor 是一个开源项目,按原样提供,不提供任何保证。* *使用风险自负——请仅在自己的网络中捕获数据包!*
标签:Beacon Object File, HTTPS, IPS, IP 地址批量处理, OISF, PE 加载器, Python, Scapy, Syslog, Web界面, 入侵防御系统, 威胁情报, 威胁检测与响应, 威胁猎捕, 实时仪表盘, 开发者工具, 开源安全工具, 异常检测, 无后门, 日志管理, 系统防火墙, 网络安全, 自动封禁, 逆向工具, 逆向工程平台, 邮件告警, 防火墙自动化, 隐私保护