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 的通过/失败细分。

## 工作原理
包含三个组件:
- **`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解析, 二进制发布, 反垃圾邮件, 可视化管理, 后端开发, 域名安全, 开源工具, 数据可视化, 无后门, 系统管理, 网络安全, 聚合报告分析, 自托管, 调试辅助, 逆向工具, 邮件合规, 邮件安全, 钓鱼防护, 隐私保护