一文看懂 DNS 劫持检测 API:多 DoH 对比、CNAME 链路与风险判断
DNS劫持检测API:dns-check 该接口通过并发查询4家公共DoH服务器(AliDNS、DNSPod、360、Cloudflare),对比域名解析结果,检测DNS劫持风险。支持A/AAAA记录、CNAME链路和TTL信息查询,并自动生成综合判定结果(如安全、疑似劫持等)。适用于运维监控、域名诊断等场景,提供规范化输入、多维度数据对比和可读性强的风险分析。开发者可通过GET请求快速接入,返回
做站点监控、域名诊断、网络工具或运维后台时,经常会遇到一个问题:同一个域名,在不同 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 缓存情况 |
| 输入自动规范化 | 支持 domain、https://domain、domain/path 等输入 |
| 综合风险判断 | 返回 safe、safe_with_geodns、suspicious 等状态 |
对运维工具来说,summary.status_text、summary.risk_level 和 summary.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 | 服务标识,如 alidns、dnspod |
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"])
如果要把它接到监控系统里,可以重点保存:
domainsummary.risk_levelsummary.risk_scoresummary.explainunique_ipv4servers
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_level 从 safe 变成 suspicious,就可以在面板里标记出来,再人工查看各 DoH 返回的 IP 与 CNAME。
客服和故障排查
用户反馈“网站打不开”时,DNS 解析结果经常是排查入口。使用这个接口可以快速对比多个公共 DoH 的结果,把“本地网络问题”“CDN 分流”“解析异常”区分开。
开发者工具箱
很多开发者工具箱会包含 IP 查询、Whois、SSL 检测、DNS 查询等能力。dns-check 可以作为其中的“DNS 劫持检测”模块,和其他网络诊断功能组合使用。
接入建议
在实际接入时,我建议页面上分成三块:
- 顶部展示
summary.status_text和summary.risk_score - 中间展示
unique_ipv4、unique_ipv6和cname_chain - 底部展示
servers明细表格
这样的结构比较适合用户理解:先看结论,再看汇总,最后看明细。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)