Skip to main content
Glama

dns-eye — DNS 之眼 MCP Server

面向 AI Agent 的 CDN 溯源 + IP 情报 + C 段资产发现 + Host 碰撞 侦察工具集。 基于 Model Context Protocol,以 stdio 方式接入任意 MCP 客户端(Claude Desktop / CodeBuddy / Cursor 等),由大模型直接调用完成域名资产侦察。

设计原则:只读优先、无 shell 注入、输入严格校验、结果以 JSON 结构化返回,便于 Agent 解析与编排。


功能特性

  • 多地 DNS 解析:12 个国内外公共 DNS 节点并行解析,通过 IP 离散度判断目标是否位于 CDN 之后,并标出疑似源站 IP。

  • CNAME 链路追踪:递归追踪 CNAME 链,结合云厂商 CNAME 关键词库识别 CDN 提供商。

  • crt.sh 证书关联:查询证书透明度日志,挖掘同证书关联域名与内联 IPv4。

  • IP 云厂商判定:离线云厂商 IP 段 + CDN 特征库,判定 IP 类型(云 / 托管 / 自建),无需联网查询。

  • C 段高速扫描:raw socket + asyncio 非阻塞并发(2000 并发),默认扫描 135 个常用 Web 端口;fast 模式仅扫 20 个高频端口秒出。

  • Web 指纹探测:aiohttp 主引擎(~60ms)获取标题 / Server / 技术栈;可选 httpx 备选引擎做 tech-detect。

  • Host 碰撞:自定义 Host 头请求,对比 baseline 响应差异,发现隐藏在 CDN / 反代后的真实服务。

  • 一站式侦察full_recon 将上述步骤编排为 7 步流水线,一键输出完整侦察结论。


9 个工具速查

工具

用途

输入

典型场景

dns_resolve_multi

12 节点多地 DNS 解析 + CDN 判定

domain

判断目标是否在 CDN 后

cname_trace

CNAME 链路追踪 + CDN 厂商识别

domain

确认 CDN 厂商

crtsh_query

crt.sh SSL 证书关联子域名

domain

发现同证书其他域名

ip_classify

IP 云厂商判定(云/托管/自建)

ips[](≤200)

判断 IP 类型

c_scan

C 段端口扫描(默认 135 Web 端口;fast=20)

ip/domainports?fast?

发现同网段服务

c_scan_status

查询历史扫描任务(保留兼容)

task_id

查询历史任务

web_probe

Web 指纹探测(aiohttp 主引擎)

targets[]

获取存活服务标题/Server

full_recon

一站式侦察流水线(7 步)

domain + 多项开关

一键域名全量侦察

host_collision

Host 碰撞(域名 × IP 交叉爆破)

domains[]ips[]

发现 CDN 隐藏真实服务

完整参数与返回结构见文末「工具详细参考」。


安装

要求 Python >= 3.11

# 方式一:直接安装运行依赖(推荐,最简)
pip install mcp aiohttp

# 方式二:可编辑安装(便于从任意目录 import 包)
pip install -e .

bin/httpx.exe 已随仓库通过 Git LFS 分发,用于 web_probe 的可选 httpx 备选引擎,主引擎 aiohttp 不需要它


MCP 客户端配置

在 MCP 客户端的配置文件中加入(stdio 传输,无需端口 / 鉴权管理):

{
  "mcpServers": {
    "dns-eye": {
      "command": "python",
      "args": ["server.py"],
      "cwd": "<dns-eye 所在目录>"
    }
  }
}

如需启用 httpx 备选引擎(tech-detect 场景),追加 env

{
  "mcpServers": {
    "dns-eye": {
      "command": "python",
      "args": ["server.py"],
      "cwd": "<dns-eye 所在目录>",
      "env": {
        "HTTPX_BIN": "<dns-eye 所在目录>/bin/httpx.exe"
      }
    }
  }
}

MCP 配置不依赖任何本机绝对路径硬编码,克隆到任意目录后只需把 cwd 指向项目根即可。


快速验证

在 AI 会话中直接调用工具:

dns_resolve_multi(domain="example.com")
cname_trace(domain="example.com")
crtsh_query(domain="example.com")

# C 段扫描:默认 135 个常用 Web 端口(同 iptest v3.0)
c_scan(ip="1.2.3.4")
# 自定义端口
c_scan(ip="1.2.3.4", ports=[80, 443, 8080])
# 快速模式:20 个最高频端口,秒出结果
c_scan(ip="1.2.3.4", fast=True)
# 也支持传域名(自动 DNS 解析取首个 IP)
c_scan(domain="mail.example.com")

c_scan_status(task_id="xxx")
web_probe(targets=["1.2.3.4:443", "https://1.2.3.5:8080"])
host_collision(domains=["target.com"], ips=["1.2.3.4"])
full_recon(domain="example.com", allow_clouds=["all"])

项目结构

dns-eye/
├── README.md            # 使用说明(本文件)
├── DESIGN.md            # 设计文档(流程 / 工具 / 架构 / 设计决策)
├── server.py            # MCP Server 主入口(stdio transport)
├── pyproject.toml       # 项目配置 / 依赖
├── LICENSE              # MIT 许可证
├── core/
│   ├── dns_resolver.py      # 多地 DNS 解析 + CNAME 追踪
│   ├── crtsh_client.py      # crt.sh API 客户端
│   ├── ip_classifier.py     # IP 云厂商判定
│   ├── c_scanner.py         # C 段端口扫描(raw socket + asyncio)
│   ├── web_prober.py        # aiohttp Web 探测(备选 httpx)
│   ├── collision.py         # Host 碰撞
│   └── __init__.py
├── data/
│   ├── cloud_ips.json       # 云厂商 IP 段 + CDN CNAME 特征(离线判定用)
│   └── ports.json           # Web 端口字典(135 个常用 Web 端口)
└── bin/
    └── httpx.exe            # 外部工具(可选备选引擎,Git LFS 分发)

数据文件

  • data/cloud_ips.json:云厂商 IP 段与 CDN CNAME 关键词库,ip_classify 离线匹配,无需联网。

  • data/ports.json:C 段扫描默认端口字典,当前 135 个常用 Web 端口(与 iptest v3.0 一致)。修改此文件即可调整默认扫描端口。


工具详细参考

1. dns_resolve_multi

12 节点(阿里 / 腾讯 / 114 / 360 / Google / Cloudflare / Quad9 / OpenDNS / Level3 / Verisign / Comodo / Norton)并行解析,手工构建 DNS A 记录 UDP 查询包。

  • 输出:多地解析结果、IP 分布、共识度、C 段聚合、cdn_likely 判定、疑似源站 suspect_origin_ips

  • IP 分散 → CDN;同 /24 集中 → 负载均衡 / GeoDNS;海外 DNS 独有 IP → 疑似源站。

2. cname_trace

递归追踪 CNAME 链(Windows 用 nslookup -type=CNAME 中英文兼容,Linux 用 dns.resolver),与 cloud_ips.json 中 CDN CNAME 关键词模糊匹配。

  • 输出:cname_chaincdn_detectedcdn_matches

3. crtsh_query

GET https://crt.sh/?q=%.{domain}&output=json,从证书关联子域名提取 IPv4。

  • 输出:total_entriesrelated_domainsextracted_ips

4. ip_classify

策略:IP 段 CIDR 匹配(高置信)→ PTR 反查(中)→ 默认 unknown。

  • 输入:ips[],最多 200 个。

  • 输出:type(cloud / hosting / self_built / unknown)、confidencecloud_matchesptr_info

5. c_scan

raw socket + asyncio 非阻塞连接,2000 并发(同 iptest v3.0)。

  • 输入:ip(C 段内任意 IP)或 domain(二选一,自动解析取首个 IP);ports? 自定义;fast? 快速模式(仅 20 高频端口)。

  • 默认扫描 135 个常用 Web 端口(仅 Web 端口,不做全端口扫描)。

  • 输出:subnetscanned_ips(254)、scanned_portsopen_countopen_services[{ip,port}]elapsed_ms

6. c_scan_status

查询历史扫描任务状态(保留兼容旧版异步任务)。输入 task_id

7. web_probe

  • 主引擎:aiohttp(~60ms,远快于 httpx 的 ~23s Go 启动)。

  • 需要 tech_stack 时调用 bin/httpx.exe 备选引擎(需 HTTPX_BIN)。

  • 单请求超时 8s,最大并发 100。

  • 输出:total_targetsrespondedresults[{url,status_code,title,server,content_type,content_length,location}]

8. full_recon

7 步编排:DNS → CNAME → crt.sh(仅 CDN 命中时)→ IP 分类 → C 段扫描 → Web 探测 → Host 碰撞。

  • 开关:allow_clouds(云 IP 白名单,["all"] 放行全部)、custom_portsno_scanno_probeno_collision

  • 云 IP 默认跳过 C 段扫描;同类 /24 子网去重(每网段只扫一次)。

  • 输出:各步骤结果 + summary(cdn_detected / scan_targets / total_open_ports / host_collision_hits / status)。

9. host_collision

domains[] × ips[] × ports[](默认 [80,443])发送自定义 Host 头请求,对比 baseline 响应差异(状态码变化 / 长度偏差 >30% / 标题变化 / Server 头差异)。

  • 输入:domains[](≤100)、ips[](≤50)、timeout?(5)、auto_variants?(true,自动扩展 admin/api/www 等前缀,上限 30)。

  • 碰撞组合保护:最多 2000 个请求。

  • 输出:hits_counthits[{ip,port,protocol,domain,status_code,title,server,hit_reason}]


安全与合规

  • 输入校验:域名工具统一经 validate_domain 校验,拦截命令注入 / URL 注入;IP 经 validate_ip 校验;端口范围 1–65535。

  • 无 shell:所有外部调用(含 httpx)均以参数数组方式执行,不使用 shell,杜绝命令注入。

  • 限额保护ip_classify ≤200 IP、host_collision ≤100 域名 / ≤50 IP / ≤2000 请求组合,防止资源滥用。

  • 仅被动侦察:工具仅做 DNS 解析、端口连接探测、Web 请求与证书查询,不发起漏洞利用。

  • ⚠️ 授权使用:本工具仅用于你拥有合法授权的目标。未经授权对第三方资产进行扫描可能违反法律与服务条款。


依赖

  • Python >= 3.11

  • mcp >= 1.0.0

  • aiohttp >= 3.9.0

  • (可选)bin/httpx.exe — httpx 备选引擎,用于 tech-detect。


许可证

MIT © bae

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Gentle-bae/dns-eyes'

If you have feedback or need assistance with the MCP directory API, please join our Discord server