接口接入教程:domain 參數(shù)、請(qǐng)求示例與風(fēng)險(xiǎn)分級(jí)解讀)
排查“域名解析異?!薄氨贿\(yùn)營(yíng)商插廣告”這類問題時(shí)光查一條 DNS 記錄不夠需要對(duì)比多個(gè)解析源的返回結(jié)果。DNS 劫持檢測(cè)接口通過多家公共 DoH 并發(fā)查詢同一域名并比對(duì)結(jié)果給出風(fēng)險(xiǎn)分級(jí)。本文從第一次調(diào)用講起。一、適用場(chǎng)景解析異常排查用戶反饋域名打不開判斷是本地污染還是服務(wù)端問題。安全巡檢對(duì)關(guān)鍵域名做定期檢測(cè)發(fā)現(xiàn)解析被篡改的跡象。CDN 與 GeoDNS 核查查看是否存在異常地域分流。終端 hosts 排查對(duì)比公共 DoH 結(jié)果輔助判斷本機(jī)解析是否被改。需要明確接口給出的是“基于多源對(duì)比的風(fēng)險(xiǎn)判斷”不是對(duì)劫持行為的取證結(jié)論業(yè)務(wù)上應(yīng)作為排查線索而非最終裁決。二、接口能力邊界項(xiàng)目說明請(qǐng)求方法GET參數(shù)domain查詢?cè)? 家公共 DoH 并發(fā)查詢記錄類型A AAAA 同時(shí)查詢IPv4 / IPv6附加信息CNAME 鏈路、TTL 匯總風(fēng)險(xiǎn)分級(jí)safe / safe_with_geodns / suspicious / hijack_likely / unknown輸入兼容domain、https://domain、domain:port、domain/path 自動(dòng)剝離參與對(duì)比的 DoH 服務(wù)器來源說明AliDNS阿里云中國(guó)DNSPod騰訊中國(guó)360 安全 DNS中國(guó)Cloudflare美國(guó)在中國(guó)大陸服務(wù)器側(cè)可能超時(shí)會(huì)被標(biāo)記為 timeout關(guān)鍵點(diǎn)Cloudflare 出現(xiàn)timeout是已知現(xiàn)象單看這一項(xiàng)超時(shí)不能直接判定為風(fēng)險(xiǎn)要結(jié)合其余三家的結(jié)果與整體分級(jí)來看。三、請(qǐng)求參數(shù)與鑒權(quán)參數(shù)只有一個(gè)參數(shù)說明domain待檢測(cè)域名支持多種輸入格式自動(dòng)剝離協(xié)議、端口與路徑鑒權(quán)方式與請(qǐng)求頭字段素材未給出以文檔為準(zhǔn)。這是GET請(qǐng)求參數(shù)放在查詢字符串中接入前請(qǐng)確認(rèn)是否需要攜帶 Key。四、最小請(qǐng)求示例下面是一個(gè)可復(fù)制的 curl 模板curl -X GET https://v1.apizero.cn/api/dns-check?domainexample.com帶協(xié)議頭的輸入也能直接傳接口會(huì)自動(dòng)剝離curl -X GET https://v1.apizero.cn/api/dns-check?domainhttps://example.com對(duì)應(yīng)的 Python 調(diào)用示例import requests def check_dns_hijack(domain: str, api_key: str | None None) - dict: headers {} if api_key: headers[Authorization] fBearer {api_key} resp requests.get( https://v1.apizero.cn/api/dns-check, params{domain: domain}, headersheaders, timeout20, # 多源并發(fā)查詢超時(shí)給寬一些 ) resp.raise_for_status() return resp.json()超時(shí)建議比普通查詢放寬因?yàn)榻涌趦?nèi)部要并發(fā)等待多家 DoH 返回。五、返回值解讀風(fēng)險(xiǎn)分級(jí)是核心結(jié)果五檔含義如下具體判定規(guī)則以文檔為準(zhǔn)分級(jí)含義理解safe多家結(jié)果一致未發(fā)現(xiàn)異常safe_with_geodns結(jié)果差異可由正常 GeoDNS 分流解釋suspicious存在可疑差異需人工復(fù)核hijack_likely多源結(jié)果顯著不一致疑似劫持unknown數(shù)據(jù)不足或查詢?cè)炊鄶?shù)失敗無(wú)法判斷除分級(jí)外還應(yīng)關(guān)注 A/AAAA 記錄、CNAME 鏈路與 TTL 匯總。CNAME 鏈路能看出是否經(jīng)過 CDN 跳轉(zhuǎn)TTL 能輔助判斷緩存影響。一個(gè)防御式解析示例字段名請(qǐng)按文檔實(shí)際返回替換LEVELS {safe, safe_with_geodns, suspicious, hijack_likely, unknown} def parse_check(payload: dict) - dict: level payload.get(level) or payload.get(risk) # 字段名以文檔為準(zhǔn) if level not in LEVELS: level unknown sources payload.get(sources) or {} timeouts [name for name, info in sources.items() if isinstance(info, dict) and info.get(status) timeout] return { level: level, timeout_sources: timeouts, need_manual_review: level in (suspicious, hijack_likely), }處理邏輯建議suspicious與hijack_likely進(jìn)入人工復(fù)核隊(duì)列unknown先重試一次再判定safe_with_geodns不必告警。六、常見錯(cuò)誤與排查現(xiàn)象可能原因排查方向參數(shù)錯(cuò)誤domain為空或格式非法傳標(biāo)準(zhǔn)域名其余格式由接口剝離超時(shí)查詢?cè)错憫?yīng)慢Cloudflare 側(cè)可能超時(shí)放寬超時(shí)看是否為單源超時(shí)結(jié)果為 unknown多數(shù)查詢?cè)词』驍?shù)據(jù)不足稍后重試檢查域名是否可解析分級(jí)與預(yù)期不符GeoDNS 正常分流被誤判結(jié)合 CNAME 與 A 記錄人工復(fù)核鑒權(quán)失敗需要 Key 但未攜帶以文檔為準(zhǔn)補(bǔ)充請(qǐng)求頭注意單個(gè)來源timeout屬于正?,F(xiàn)象不要把它當(dāng)成劫持證據(jù)也不要在這種情況下直接告警。七、工程化注意事項(xiàng)超時(shí)設(shè)置多源并發(fā)查詢耗時(shí)更長(zhǎng)客戶端超時(shí)應(yīng)顯著大于單次 DNS 查詢。分級(jí)映射本地維護(hù)五級(jí)枚舉未知值統(tǒng)一歸入unknown避免展示層崩潰。告警策略只對(duì)hijack_likely直接告警suspicious走人工復(fù)核unknown重試后再定。來源記錄保存各 DoH 的返回與超時(shí)情況便于復(fù)盤誤判。巡檢頻率域名安全巡檢按小時(shí)或按天做即可不宜高頻調(diào)用。結(jié)果展示把 CNAME 鏈路和 TTL 一并展示給排查人員比只給一個(gè)分級(jí)更有用。參考文檔接口文檔