一次奇妙深刻的域名在海外解析失敗問題排查之旅

語言: CN / TW / HK

:grinning: 加個關注,後續上新不錯過~

作者介紹:Eli Gao,ByteDance Web Infra 團隊成員,目前主要負責 Serverless 方向底層基礎設施建設

起因

上個月, 有個同事提到,有使用者反應 我們的內網服務域名 goofy.app 及其子域名在新加坡辦公室無法訪問,但是我從新加坡的家裡用企業虛擬專用網路(辦公 VPN)一直可以訪問,其他中國區辦公室的同學表示也都可以訪問。

排查

回到新加坡的辦公室後,我開始排查問題,隨便挑了一個 https://foo.goofy.app/ 測試, 確實打不開:

$> curl https://foo.goofy.app/
curl: (6) Could not resolve host: foo.goofy.app

直接看到的問題是,foo.goofy.app  的 DNS 無法解析。那直接用 IP 訪問網路通不通呢?

➜  ~ curl -i 10.*.*.* -H "host: foo.goofy.app"
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 31 Aug 2021 10:39:20 GMT
Content-Type: text/html; charset=utf-8
...

是可以的,那麼在稍稍做了一些嘗試之後,目前知道的情況是:

  • :white_check_mark: 中國辦公網可以訪問

  • :white_check_mark: 新加坡辦公 VPN 可以訪問

  • :x: 新加坡辦公室不可以訪問

    • :white_check_mark: 網路層鏈路通

    • :x: DNS 無法解析

  • :x: 新加坡公網不可以訪問

    • :x: 網路層鏈路不通(服務使用內網IP,符合預期)

    • :x: DNS 無法解析

非常明顯,如果新加坡辦公室 DNS 可以正確解析域名,理論上網站就可以正常開啟。那我們就從 DNS 入手。

猜想 0:內網 DNS 配置有誤

既然這個域名指向的都是內網服務,是不是這個域名在內網的解析配置有錯誤呢?

詢問這個域名的管理員後發現,其實這個域名並不是內網域名,在公網就可以解析,只不過都是指向的內網地址。

這裡我們找一個線上 DNS 測試站點解析一下 A 記錄:https://ping.sx/dig?t=foo.goofy.app

從ping.sx的全球各個第三方測試節點返回的結果表明,foo.goofy.app 確實是可以在公網解析的,不過也是隻有中國大陸可以解析。

:pushpin:小知識:

在很多情況下,內網域名不需要在公網解析,此時為了安全與速度,很可能會在內網 DNS 中直接返回解析結果,而不需要查詢上游公網 DNS。

猜想 1:GeoDNS

那麼,是不是 DNS 平臺通過 GeoDNS 配置使得 DNS 只能在中國大陸解析呢?

問了一下 DNS 的負責同學,並沒有開啟相關的設定。實際上用 EDNS Subnet 也可以驗證這一點:

(隨便假裝了個在中國大陸的 IP 段)

➜  ~ dig foo.goofy.app @8.8.8.8 +subnet=114.114.114.0/24 +short
(空結果)
:pushpin:小知識:
GeoDNS 是一種 DNS 擴充套件,可以使得 DNS 伺服器根據使用者所在的不同區域解析出不同的結果。它通過 EDNS(Extension Mechanisms for DNS) 實現。

猜想 2:跨境鏈路問題

託管在中國大陸境內的域名不能在境外解析,可不可能是跨境網路抖動呢?讓我們 dig + trace 一下看看再說

trace 可以一路 trace 到 CNAME

再試試 dig 一下 NS:

中國區以外也是空的,看樣子是這些 DNS 不約而同地在從 .appgoofy.app 的 NS 時候就掉鏈子了。

可是 .app 的 NS ns-tld1.charlestonroadregistry.com 不在中國大陸,並沒有跨境,所以應該不是這個原因。

:pushpin:小知識:

dig 命令除了常規解析域名的用法外,還可以通過 +trace 選項使它在本地完整執行DNS迭代查詢並輸出日誌,以便排查問題

:pushpin:小知識:

域名的 NS 記錄代表 Name Server,它指向的是託管這個域名子域名的伺服器地址。比如: dig bytedance.com ns +short 的返回值為: vip4.alidns.com. vip3.alidns.com. 說明如果要查詢 bytedance.com 的子域名,請聯絡 vip4.alidns.com 或者 vip3.alidns.com

猜想 3:.app TLD NS 故障

運維同學表示可能是 .app TLD 的 NS 壞了,不過我隨便找了個 get.app 域名測試沒有問題(那是當然的了):

➜  ~ dig get.app ns @8.8.8.8 +short
ns4.zdns.google.
ns1.zdns.google.
ns3.zdns.google.
ns2.zdns.google.

:pushpin:小知識:

TLD指Top Level Domain,頂級域。比如常見的 .com , .cn , .net 都是頂級域。在DNS查詢中,終究會迭代查詢到頂級域的NS伺服器。如果它故障了,會導致這個頂級域下的幾乎所有域名大規模無法解析。

猜想 4:DNSSEC 配置錯誤

此時問題似乎陷入僵局,有沒有什麼情況下,可能導致部分使用者解析結果為空呢?

有。

如果對 DNS 比較熟悉的同學可能聽說過 DNSSEC,這是一個用於保證 DNS 解析不被劫持的安全擴充套件。

如果 DNSSEC 的配置出錯,可能會導致解析結果被認作無效並丟棄,就像 HTTPS 的證書配置有誤會導致網站無法開啟一樣。

我們去線上 Google DNS 解析一下試試,這裡解析可以給出比較詳細的解析結果:

https://dns.google/query?name=goofy.app&rr_type=A

這裡錯誤就很明顯了, DNSSEC validation failure ,DNSSEC 驗證失敗。

關掉 DNSSEC 驗證後,可以正確解析:

點開解析失敗結果中的連結,可以看到更詳細的解析過程:https://dnsviz.net/d/goofy.app/dnssec/

可以看到這裡 DNSSEC 有報錯。

https://dnssec-analyzer.verisignlabs.com/goofy.app 的結果也類似。

問題解決

DNS 運維同學幫忙看了一下 DNS 管理後臺,裡面有一個不知道哪裡來的 sha256 的 key,刪除後問題解決

All Green!:clap|type_1_2::clap|type_1_2::clap|type_1_2:

覆盤分析

發生了啥?

  • 一句話解釋:DNSSEC 配置錯誤導致全球大部分 DNS 伺服器都丟棄瞭解析結果,解析失敗。

那為什麼之前只在中國大陸能解析,而境外 DNS 全軍覆沒?

  • 因為中國大陸 DNS 伺服器絕大多數都關閉了 DNSSEC 校驗

    • 即使 DNSSEC 配置歪了,只要不校驗就不會丟棄結果

    • 這是一個不幸的巧合,負負得正

  • 而海外 DNS 基本上都預設開啟了 DNSSEC 校驗,所以國際(幾乎)清一色解析失敗

    • 少數海外 DNS 沒開 DNSSEC 校驗,所以恰巧能解析

那具體是哪裡配壞了?

域名的 DS 記錄中配置了一條錯誤的 Hashed KSK(SHA-256 key),導致 DNSSEC 信任鏈被破壞。

這條錯誤的記錄可能是在我們把域名從最開始的託管方 get.app 處遷移到目前 DNS 時候一併遷移過來的。

而刪除這條 DS 記錄等同於告訴下游 resolver 這個域名不需要 DNSSEC 校驗,所以刪了就好了。

:pushpin:小知識:
DNS 的 DS 記錄(Delegation Signer) 是 DNSSEC 信任鏈的一部分,用於把每一層域名的 NS 串聯起來(與 HTTPS 證書鏈原理類似)

排查過程能否更有效?

可以:

  1. 一開始就可以用 https://dns.google 測試,可以直接發現問題

  2. 其實 dig 命令中一開始就返回了SERVFAIL。而根據DNSSEC的標準,這就是DNSSEC驗證失敗的返回值。

有沒有考慮過其他修復方案?

有:

  • 嘗試本地編輯 hosts 檔案

    • 治標不治本,而且*.goofy.app多如牛毛,不可能全加上

  • 在純內網 DNS 解析

    • 運維同學表示.app是一個新的頂級域,需要單獨支援,代價太大

  • 開啟 DNSSEC 並正確配置

    • 理論上可行,但是由於 DNS 遞迴請求到  .app 的 NS 需要跨境,要是簽名過的請求被幹擾則小概率導致解析失敗。

    • 先跑起來再說

擴充套件閱讀:DNSSEC 工作原理

  • DNSSEC 如何運作  https://www.cloudflare.com/zh-cn/dns/dnssec/how-dnssec-works/

  • DNSSEC 原理和分析  https://blog.thecjw.me/?p=1221

  • 保護網站訪問安全--阿里雲 DNS 正式支援 DNSSEC  https://zhuanlan.zhihu.com/p/107552714