Francesco149/dmarc-analyzer

GitHub: Francesco149/dmarc-analyzer

一个极简的自托管 DMARC 聚合报告分析器,自动扫描邮箱解析 XML 报告并通过 Web UI 展示发送 IP 的认证通过/失败情况。

Stars: 0 | Forks: 0

# dmarc-analyzer 一个自托管的 DMARC 汇总报告分析器。扫描 Maildir 以查找 DMARC 报告邮件,提取并解析 XML 附件,并提供一个小型 Web UI,显示报告源及每个发送 IP 的通过/失败细分。 ![截图](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/2457755767095844.png) ## 工作原理 包含三个组件: - **`dmarc-scanner.py`** — 一个 Python 脚本,用于扫描 Maildir,从匹配的邮件中提取 DMARC zip/xml 附件,解析 XML,并写入 `reports.json` 数据文件。作为 systemd oneshot 服务按定时器运行。 - **`dmarc-server.py`** — 一个极简的 stdlib Python HTTP 服务器,在 `localhost:PORT` 上提供前端 HTML 和 `reports.json` 数据。旨在置于反向代理之后。 - **`src/`** — 前端源代码。`build.py` 将 `index.html`、`style.css`、`app.js`、内联字体和打包的 JSZip 合并为一个独立的 `dmarc-feed.html` 文件。 ## 项目结构 ``` dmarc-analyzer/ ├── build.py # assembles dmarc-feed.html from src/ ├── dmarc-feed.html # built output — committed, used by the flake ├── src/ │ ├── index.html # HTML shell with {{PLACEHOLDER}} tokens │ ├── style.css │ └── app.js ├── package.json # jszip + fontsource deps for build ├── flake.nix ├── module.nix # NixOS module ├── packages.nix # packages ├── dmarc-scanner.py └── dmarc-server.py ``` ## 构建前端 一次性设置: ``` npm install ``` 在修改 `src/` 中的任何内容后: ``` python3 build.py ``` 或使用开发 shell: ``` nix develop python3 build.py ``` ## NixOS 模块 将 flake 输入添加到您的系统 flake: ``` inputs.dmarc.url = "github:Francesco149/dmarc-analyzer"; ``` 导入模块并进行配置: ``` imports = [ inputs.dmarc.nixosModules.dmarc-analyzer ]; services.dmarc-analyzer = { enable = true; mailDir = "/var/vmail/example.com/postmaster/mail"; scanUser = config.mailserver.vmailUserName; port = 8741; # Default is 127.0.0.1. Set to a LAN IP if your reverse proxy # is on a different machine. Restrict with a firewall rule. listenHost = "0.0.0.0"; scanInterval = "15min"; # systemd OnUnitActiveSec format maxReports = 200; }; ``` 接入您的反向代理 —— 例如 Caddy: ``` dmarc.box.example.com { reverse_proxy 10.0.10.x:8741 } ``` ### 模块选项 | 选项 | 默认值 | 描述 | | -------------- | ---------------- | -------------------------------------------------------------------------------------------------------- | | `enable` | — | 启用服务 | | `mailDir` | — | 包含 DMARC 报告邮件的 Maildir 或 mbox 路径 | | `scanUser` | `dmarc-analyzer` | 运行扫描器的用户。必须拥有 `mailDir` 的读取权限。若使用 nixos-mailserver,请设置为 `config.mailserver.vmailUserName` | | `port` | `8741` | HTTP 服务器监听的端口 | | `listenHost` | `127.0.0.1` | 绑定的地址 | | `scanInterval` | `15min` | 扫描新报告的频率 | | `maxReports` | `200` | 在 `reports.json` 中保留的最大报告数 | ### 注意事项 - 该模块**不**涉及 Caddy、nginx、`/etc/hosts` 或任何其他系统配置。反向代理的对接需由您自行完成。 - 扫描器以 `scanUser`(例如 `virtualMail`)身份运行,以便读取权限为 `700` 的 Maildir。输出文件以 `dmarc-analyzer` 组的身份写入,以便 HTTP 服务器读取。 - 状态数据位于 `/var/lib/dmarc-analyzer/`。删除它是安全的 —— systemd 会在下次启动时通过 `StateDirectory` 重新创建目录。 - HTTP 服务器仅提供两个路径:`/`(前端)和 `/data/reports.json`。其他所有请求均返回 404。 ## 防火墙 如果 `listenHost` 不是 `127.0.0.1`,请使用防火墙规则限制访问。在 NixOS iptables 中: ``` networking.firewall.extraCommands = '' iptables -A nixos-fw -s -d -p tcp --dport 8741 -j nixos-fw-accept ''; networking.firewall.extraStopCommands = '' iptables -D nixos-fw -s -d -p tcp --dport 8741 -j nixos-fw-accept || true ''; ``` ## 前端 —— 独立使用 构建好的 `dmarc-feed.html` 是完全独立的(内联了字体和 JSZip)。它可以在没有后端的情况下使用 —— 只需在浏览器中打开它并直接上传 `.zip` 或 `.xml` 报告文件。当被托管时,它会在加载时自动获取 `/data/reports.json`。
标签:Awesome, DMARC, Maildir, NixOS, Python, SPF/DKIM, TCP SYN 扫描, Web UI, XML解析, 二进制发布, 反垃圾邮件, 可视化管理, 后端开发, 域名安全, 开源工具, 数据可视化, 无后门, 系统管理, 网络安全, 聚合报告分析, 自托管, 调试辅助, 逆向工具, 邮件合规, 邮件安全, 钓鱼防护, 隐私保护