DNS 污染检测与域前置诊断工具,支持 ECH 检测与连通性分析
- DNS 污染检测:对比系统 DNS 与 DOH 解析结果,识别 ASN 不匹配等污染特征
- 域前置检测:测试直连与域前置可用性,检测网络阻断与 SNI 过滤
- IP 归属分析:查询 IP 的 ASN 信息,识别所属组织与 CDN 服务商
- ECH 支持:自动识别 Cloudflare 与 Meta 域名,提示 ECH 加密连接支持
- 连通性测试:Ping 与 TCP 端口测试,检测 IP 是否被网络阻断
- 诊断历史:本地保存诊断记录,方便回顾与对比
- 实时进度:诊断过程实时显示各阶段状态
SNIViewer/
├── core/ # 核心诊断引擎
│ ├── config/ # 配置管理
│ ├── dns/ # DNS 解析模块
│ ├── network/ # 网络测试模块
│ ├── asn/ # ASN 查询模块
│ ├── fronting/ # 域前置检测模块
│ ├── diagnose/ # 诊断流程编排
│ └── logger/ # 日志系统
│
├── gui/ # GUI 层
│ ├── app.go # Wails 应用
│ ├── handlers.go # 前端调用接口
│ └── frontend/ # 前端资源
│ ├── index.html # 主页面
│ └── src/
│ ├── main.js # 前端逻辑
│ └── styles.css # 样式
│
├── data/ # 数据目录
│ └── GeoLite2-ASN.mmdb # ASN 数据库(嵌入到可执行文件)
│
├── main.go # 程序入口
├── wails.json # Wails 配置
└── README.md
cd SNIViewer
wails build构建完成后,可执行文件位于 build/bin/SNIViewer.exe
# Windows
SNIViewer.exe- 进入"测试"页面
- 在 DOH 配置区域输入完整的 DOH URL
- 点击"添加"按钮
- DOH URL 必须以
https://开头
示例:
https://cloudflare-dns.com/dns-queryhttps://dns.google/dns-query
- 输入要诊断的域名
- 从下拉框选择 DOH 服务器
- (可选)填写自定义 SNI,留空则使用空 SNI 测试域前置
- 点击"开始诊断"
- 观察实时诊断进度
- 查看诊断结果
- 系统 DNS:本机配置的 DNS 服务器解析结果
- DOH:可信 DOH 服务器的解析结果
- 污染检测:对比两个结果的 ASN,判断是否存在 DNS 污染
- IP:解析出的 IP 地址
- ASN:自治系统号
- 组织:所属组织机构
- CDN:识别的 CDN 服务商
- 来源:DNS 来源(system/doh)
- 直连可用:使用正确 IP 和域名 SNI 可直接连接,建议修改 hosts
- 域前置可用:使用空 SNI 或自定义 SNI 可连接
- ECH 支持:Cloudflare 或 Meta 域名,支持 ECH 加密连接
- 连接失败:直连和域前置均失败
| 状态 | 含义 |
|---|---|
| 正常 | 未检测到 DNS 污染,网络连通正常 |
| 检测到污染 | 系统 DNS 与 DOH 返回的 IP 属于不同 ASN |
| 错误 | DNS 解析失败或网络阻断 |
┌─────────────────────────────────────────────────────────┐
│ 诊断流程 │
├─────────────────────────────────────────────────────────┤
│ 1. DNS 解析 │
│ ├── 系统 DNS 查询 │
│ └── DOH 查询 │
├─────────────────────────────────────────────────────────┤
│ 2. 污染检测 │
│ └── 对比系统 DNS 与 DOH 的 ASN │
├─────────────────────────────────────────────────────────┤
│ 3. IP 归属分析 │
│ └── MMDB 数据库查询 ASN 信息 │
├─────────────────────────────────────────────────────────┤
│ 4. 连通性测试 │
│ ├── Ping 测试(TCP 方式) │
│ └── TCPing 测试(端口 443) │
├─────────────────────────────────────────────────────────┤
│ 5. 连接测试 │
│ ├── 检查是否为 Cloudflare/Meta(ECH 支持) │
│ ├── 尝试直连(正确 IP + 正确 SNI) │
│ └── 尝试域前置(正确 IP + 空/自定义 SNI) │
└─────────────────────────────────────────────────────────┘
ECH(Encrypted Client Hello)是一种 TLS 扩展,可以加密 TLS 握手中的 SNI 信息。
支持的 CDN:
- Cloudflare
- Meta
当检测到 DOH 返回的 IP 属于以上 CDN 时,会显示 ECH 支持提示,不再进行域前置测试。
域前置是一种绕过 SNI 过滤的技术:
-
直连测试:使用正确的域名作为 SNI
- 如果成功:说明可以直接连接,建议修改 hosts
- 如果失败:可能是 SNI 被过滤
-
域前置测试:使用空 SNI 或自定义 SNI
- 如果成功:说明服务器支持域前置
- 如果失败:说明服务器不支持域前置
配置保存在 config.json:
{
"version": "1.0",
"doh_servers": [
"https://your-doh-server.com/dns-query"
],
"network": {
"ping_timeout": 5000,
"ping_retry": 3,
"tcp_timeout": 5000,
"tcp_retry": 3
}
}- GUI 框架:Wails v2(Go + WebView2)
- ASN 数据库:MaxMind GeoLite2-ASN.mmdb(嵌入可执行文件)
- DNS 解析:支持 DNS wire format(RFC 8484)
- 前端:原生 HTML/CSS/JavaScript
- ASN 数据库:已嵌入到可执行文件中,无需单独下载;可自行更新从MaxMind下载的最新数据库文件替换并自行编译
- 网络环境:某些网络环境可能禁止 ICMP,导致 Ping 失败
- 域前置:并非所有 CDN 都支持域前置,测试结果仅供参考
- ECH:目前仅 Cloudflare 和 Meta 支持 ECH
- 污染测试准确性:目前仅对照两个 DNS 返回IP的 ASN,对于多CDN网站场景可能不完全准确,但参考价值足够
- 上游Doh:必须是无污染可信任的DoH服务,否则测试结果不可靠
- 检查 DOH URL 是否正确
- 确认网络可以访问 DOH 服务器
- 查看控制台日志了解详细错误
- 可能是目标服务器不支持域前置
- 可能是网络完全阻断
- 尝试更换域名测试
MIT License