為什麼我不是用最近節點瀏覽本站?
/ 閱讀時間 4 分鐘
目次
我最近發現我自己瀏覽本站的時候,連接的 CDN 節點不是 TPE(台北)而是 KIX(大阪),覺得奇怪,所以就來找找可能的原因。
我先稍微介紹一下本站與我自己使用的環境:
- 本站使用 AWS 的 CloudFront CDN
- 本站域名的 DNS 託管在 CloudFlare 上
- 我使用的 DNS 是 Quad9 的 DNS over HTTPS
- 我使用的網路是中華電信的 Hinet
先確認一下問題是不是真的存在:
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:93a1, 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
節點,所以是連到大阪的節點去了,這個問題真的存在。
在這篇文章中提到了幾個可能的原因:
- 我選的價格分級(price class)納入的節點不包含台灣
- DNS resolver 不支援 anycast IP
- 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 的大阪節點?我也不知道,可能是路由的關係吧。