做站点监控、域名诊断、网络工具或运维后台时,经常会遇到一个问题:同一个域名,在不同 DNS 服务商那里解析出来的结果是否一致?如果某个环境解析到了异常 IP,是 CDN 分流、GeoDNS 差异,还是可能存在 DNS 劫持?

这类判断如果自己从零实现,需要并发请求多个 DNS 服务、解析 A/AAAA 记录、整理 CNAME 链路、合并 TTL,并且还要给出一个可读的综合结论。极数本源的 dns-check 接口把这套流程封装成了一个 GET API,适合直接接入到监控面板、域名检测工具和运维诊断流程里。

官方页面:https://apizero.cn/marketplace/dns-check

接口介绍

dns-check 是一个 DNS 劫持检测接口。它会通过 4 家公共 DoH(DNS over HTTPS)服务器并发查询同一个域名,并对比各方解析结果,最终给出综合判定。

接口会同时查询:

  • A 记录,也就是 IPv4
  • AAAA 记录,也就是 IPv6
  • CNAME 链路
  • TTL 信息
  • 各 DoH 服务的响应状态与耗时

综合结果会放在 summary 字段里,适合前端直接展示。

核心能力

这个接口比较适合开发者的地方在于,它不是只返回一组 IP,而是把“判断结果”也整理好了。

主要能力包括:

能力 说明
多 DoH 并发检测 同时对比 AliDNS、DNSPod、360、Cloudflare
A / AAAA 同查 IPv4 和 IPv6 结果都能看
CNAME 汇总 能看到 CDN 跳转链路
TTL 汇总 可用于观察 DNS 缓存情况
输入自动规范化 支持 domainhttps://domaindomain/path 等输入
综合风险判断 返回 safesafe_with_geodnssuspicious 等状态

对运维工具来说,summary.status_textsummary.risk_levelsummary.explain 很有用,因为它们可以直接变成页面上的检测结论。

请求方式

接口地址:

GET https://v1.apizero.cn/api/dns-check

请求参数:

参数 类型 必填 说明
domain string 要检测的域名,支持自动剥离协议头、端口和路径

请求头:

Header 说明
X-API-Key API Key,可按项目接入方式放到请求头里

一个最简单的请求可以这样写:

curl "https://v1.apizero.cn/api/dns-check?domain=apizero.cn"

如果你的项目里统一使用 API Key,可以这样写:

curl "https://v1.apizero.cn/api/dns-check?domain=apizero.cn" \
  -H "X-API-Key: YOUR_API_KEY"

返回字段

接口成功后,核心数据在 data 字段里。

基础字段

字段 类型 说明
domain string 规范化后的域名
input string 原始输入回显
exec_ms integer 本次检测总耗时
unique_ipv4 string[] 所有 DoH 返回 IPv4 的去重并集
unique_ipv6 string[] 所有 DoH 返回 IPv6 的去重并集
servers array 各 DoH 服务的检测明细
summary object 综合判定结果

summary 字段

summary 是最适合页面展示的部分:

字段 类型 说明
status_text string 人类可读的检测结论
risk_level string 风险等级
risk_score integer 安全评分,0 到 100
explain string 判定依据说明
cname_chain string[] 合并后的 CNAME 链路
success_count integer 成功响应的 DoH 数量
total_count integer DoH 总数
unique_ipv4_count integer 去重后的 IPv4 数量
unique_ipv6_count integer 去重后的 IPv6 数量

risk_level 常见值包括:

含义
safe DNS 解析正常
safe_with_geodns 解析结果存在差异,但符合 CDN 或 GeoDNS 分流特征
suspicious 解析结果存在可疑差异
hijack_likely 存在较明显的劫持迹象
unknown 当前结果不足以判断

servers 字段

servers 会列出每家 DoH 的明细:

字段 类型 说明
key string 服务标识,如 alidnsdnspod
name string 展示名称
status string 查询状态
latency_ms integer 查询耗时
ipv4 string[] 当前服务返回的 A 记录
ipv6 string[] 当前服务返回的 AAAA 记录
cname_chain string[] 当前服务返回的 CNAME 链路
ttl_min integer 当前服务返回的最小 TTL

这个字段适合做“展开详情”,比如在检测结果页里先展示综合判断,再让用户展开查看每家 DoH 的具体解析值。

返回示例

下面是一次对 apizero.cn 的实测结果节选:

{
  "code": 0,
  "msg": "成功",
  "data": {
    "domain": "apizero.cn",
    "input": "apizero.cn",
    "summary": {
      "status_text": "DNS 解析正常(CDN 多节点分流)",
      "risk_level": "safe_with_geodns",
      "risk_score": 75,
      "explain": "DoH 各自返回不同 IP,但 CNAME 链路完全一致,属于同一 CDN 的不同节点(如阿里云、淘宝 CDN)。",
      "cname_chain": [
        "apizero.cn.eo.dnse1.com"
      ],
      "success_count": 3,
      "total_count": 4,
      "unique_ipv4_count": 7,
      "unique_ipv6_count": 0
    },
    "unique_ipv4": [
      "119.96.17.181",
      "58.49.197.107",
      "150.139.230.193"
    ],
    "unique_ipv6": [],
    "servers": [
      {
        "key": "alidns",
        "name": "AliDNS",
        "status": "ok",
        "latency_ms": 227,
        "ipv4": [
          "119.96.17.181",
          "58.49.197.107"
        ],
        "cname_chain": [
          "apizero.cn.eo.dnse1.com"
        ],
        "ttl_min": 60
      }
    ],
    "exec_ms": 6006
  }
}

这个结果很适合说明 safe_with_geodns 的含义:不同 DoH 返回了不同 IP,但 CNAME 链路一致,所以更像是 CDN 多节点分流,而不是简单地把“IP 不一致”判成异常。

Python 调用示例

import requests

url = "https://v1.apizero.cn/api/dns-check"
params = {
    "domain": "apizero.cn"
}
headers = {
    "X-API-Key": "YOUR_API_KEY"
}

resp = requests.get(url, params=params, headers=headers, timeout=15)
data = resp.json()

summary = data["data"]["summary"]

print("检测域名:", data["data"]["domain"])
print("状态:", summary["status_text"])
print("风险等级:", summary["risk_level"])
print("评分:", summary["risk_score"])
print("说明:", summary["explain"])

如果要把它接到监控系统里,可以重点保存:

  • domain
  • summary.risk_level
  • summary.risk_score
  • summary.explain
  • unique_ipv4
  • servers

JavaScript 调用示例

const params = new URLSearchParams({
  domain: "apizero.cn",
});

const res = await fetch(
  `https://v1.apizero.cn/api/dns-check?${params.toString()}`,
  {
    headers: {
      "X-API-Key": "YOUR_API_KEY",
    },
  }
);

const json = await res.json();
const { data } = json;

console.log("检测域名:", data.domain);
console.log("综合状态:", data.summary.status_text);
console.log("风险等级:", data.summary.risk_level);
console.log("IPv4 并集:", data.unique_ipv4);

前端展示时,可以把 summary 放在顶部卡片,把 servers 做成表格:

DoH 状态 耗时 IPv4 CNAME
AliDNS ok 227ms 2 个 apizero.cn.eo.dnse1.com
DNSPod ok 263ms 2 个 apizero.cn.eo.dnse1.com
360 ok 204ms 5 个 apizero.cn.eo.dnse1.com

这样用户可以先看到“综合结论”,再看到“每家 DNS 的原始解析差异”。

适用场景

域名检测工具

如果你在做一个在线 DNS 检测页面,可以用 dns-check 直接完成后端检测逻辑。用户输入域名后,接口返回综合状态和各 DoH 明细,前端负责展示即可。

运维监控面板

在运维后台里,可以定期检测重点域名。如果 risk_levelsafe 变成 suspicious,就可以在面板里标记出来,再人工查看各 DoH 返回的 IP 与 CNAME。

客服和故障排查

用户反馈“网站打不开”时,DNS 解析结果经常是排查入口。使用这个接口可以快速对比多个公共 DoH 的结果,把“本地网络问题”“CDN 分流”“解析异常”区分开。

开发者工具箱

很多开发者工具箱会包含 IP 查询、Whois、SSL 检测、DNS 查询等能力。dns-check 可以作为其中的“DNS 劫持检测”模块,和其他网络诊断功能组合使用。

接入建议

在实际接入时,我建议页面上分成三块:

  1. 顶部展示 summary.status_textsummary.risk_score
  2. 中间展示 unique_ipv4unique_ipv6cname_chain
  3. 底部展示 servers 明细表格

这样的结构比较适合用户理解:先看结论,再看汇总,最后看明细。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐