skip to content
鰭狀漏斗
目次

我最近發現我自己瀏覽本站的時候,連接的 CDN 節點不是 TPE(台北)而是 KIX(大阪),覺得奇怪,所以就來找找可能的原因。

我先稍微介紹一下本站與我自己使用的環境:

  • 本站使用 AWS 的 CloudFront CDN
  • 本站域名的 DNS 託管在 CloudFlare 上
  • 我使用的 DNS 是 Quad9 的 DNS over HTTPS
  • 我使用的網路是中華電信的 Hinet

先確認一下問題是不是真的存在:

Terminal window
curl -v --doh-url https://dns.quad9.net/dns-query https://vrabe.tw

DNS 查詢部分的結果是:

* Host vrabe.tw:443 was resolved.
* IPv6: 2600:9000:2025:5e00:12:9407:80:93a1, 2600:9000:2025:4600:12:9407:80:93a1, 2600:9000:2025:6400:12:9407:80:93a1, 2600:9000:2025:e00:12:9407:80:93a1, 2600:9000:2025:1200:12:9407:80:93
a1, 2600:9000:2025:2800:12:9407:80:93a1, 2600:9000:2025:6600:12:9407:80:93a1, 2600:9000:2025:400:12:9407:80:93a1
* IPv4: 54.239.168.95, 54.239.168.114, 54.239.168.87, 54.239.168.94

下面 header 也顯示我連上的是 KIX56-C2 節點,所以是連到大阪的節點去了,這個問題真的存在。

這篇文章中提到了幾個可能的原因:

  1. 我選的價格分級(price class)納入的節點不包含台灣
  2. DNS resolver 不支援 anycast IP
  3. DNS resolver 不支援 EDNS Client-Subnet(下面簡稱 ECS)

我選的是包含所有節點的價格分級,所以不可能是第一個原因。

關於第二點,Quad9 自己的 IP 就是 anycast IP,應該不會不支援 anycast IP 吧?

至於第三點,Quad9 的這個伺服器還真的不支援 ECS。用 https://dns.quad9.net/dns-query 查詢不會將我的 IP 傳到權威 DNS,讓權威 DNS 可以用我的 IP 回傳給我離我比較近的結果。所以 Quad9 只會回傳離這個 DNS 比較近的結果,也就是大阪節點。

Quad9 有提供另一個支援 ECS 的 DNS over HTTPS 伺服器:https://dns11.quad9.net/dns-query,改用這個伺服器的結果還是連上大阪節點。

這讓我困惑,都已經用支援 ECS 的 DNS 了,結果還是一樣,問題到底是出在哪裡呢?

後來我突然想到可以改用 CloudFront 提供的網址測試。使用原本的 DNS 時,連到的是更遠的紐約節點。改用支援 ECS 的 DNS 後,終於連上台北節點了!

我推測原因是託管本站域名的 CloudFlare 因為無法對根域名加上 CNAME 記錄指到 CloudFront 提供的域名,所以採用 CNAME flattening 轉成 A 記錄指到 CloudFront 域名指向的 IP。這個轉換過程可能不支援 ECS,導致訪客連上的可能不是地理上最近的節點。

我暫時還想不到比較好的方法可以完全支援 ECS,大概只能先維持現狀吧。

至於為什麼 Quad9 有在台北設點,我卻是連到 Quad9 的大阪節點?我也不知道,可能是路由的關係吧。

參考資料