Update:續篇請參考「PChome 24h 連線會慢的原因... (續篇)」。
tl;dr:因為他們的 DNS servers 不會對 IPv6 的 AAAA
record 正確的回應 NXDOMAIN
,導致 DNS resolver 會不斷嘗試。
好像一行就把原因講完了啊,還是多寫一些細節好了。
起因於我的電腦連 PChome 24h 時常常會卡住,Google Chrome 會寫「Resolving host...」,於是就花了些時間找這個問題。
一開始先用幾個工具測試,發現 host 會卡,但不知道卡什麼:
$ host 24h.pchome.com.tw
拿 tcpdump 出來聽的時候發現 host 會跑 A
、AAAA
以及 MX
三個種類,而後面兩個都會卡住:
24h.pchome.com.tw is an alias for shopping.gs1.pchome.com.tw.
shopping.gs1.pchome.com.tw has address 210.242.43.53
;; connection timed out; no servers could be reached
;; connection timed out; no servers could be reached
這樣就有方向了... 我的電腦是 Dual-stack network (同時有 IPv4 address 與 IPv6 address),所以可以預期 Google Chrome 會去查 IPv6 address。而國內很多網站都還沒有把有 IPv6 的情境當標準測試,很容易中獎...
有了方向後,用 dig 測試 IPv6 的 AAAA
,發現都是給 SERVFAIL
,而且多跑幾次就發現會卡住:
$ dig 24h.pchome.com.tw aaaa @168.95.192.1
然後對 {cheetah,dns,dns2,dns3,wolf}.pchome.com.tw
(上層登記的) 與 dns4.pchome.com.tw
(實際多的) 測,可以拿到 CNAME
record,像是這樣:
$ dig 24h.pchome.com.tw aaaa @dns.pchome.com.tw
; <<>> DiG 9.9.5-3ubuntu0.16-Ubuntu <<>> 24h.pchome.com.tw aaaa @dns.pchome.com.tw
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26037
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 6
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;24h.pchome.com.tw. IN AAAA
;; ANSWER SECTION:
24h.pchome.com.tw. 300 IN CNAME shopping.gs1.pchome.com.tw.
;; AUTHORITY SECTION:
gs1.pchome.com.tw. 300 IN NS ns3.gs1.pchome.com.tw.
gs1.pchome.com.tw. 300 IN NS ns1.gs1.pchome.com.tw.
gs1.pchome.com.tw. 300 IN NS ns4.gs1.pchome.com.tw.
gs1.pchome.com.tw. 300 IN NS ns5.gs1.pchome.com.tw.
gs1.pchome.com.tw. 300 IN NS ns2.gs1.pchome.com.tw.
;; ADDITIONAL SECTION:
ns1.gs1.pchome.com.tw. 300 IN A 210.242.216.91
ns2.gs1.pchome.com.tw. 300 IN A 210.242.216.92
ns3.gs1.pchome.com.tw. 300 IN A 210.242.43.93
ns4.gs1.pchome.com.tw. 300 IN A 203.69.38.91
ns5.gs1.pchome.com.tw. 300 IN A 210.71.147.91
;; Query time: 12 msec
;; SERVER: 210.59.230.85#53(210.59.230.85)
;; WHEN: Wed Nov 22 11:05:24 CST 2017
;; MSG SIZE rcvd: 243
但往 ns{1,2,3,4,5}.gs1.pchome.com.tw
問的時候給不出答案,也不給 NXDOMAIN
,像是這樣:
$ dig shopping.gs1.pchome.com.tw aaaa @ns1.gs1.pchome.com.tw
; <<>> DiG 9.9.5-3ubuntu0.16-Ubuntu <<>> shopping.gs1.pchome.com.tw aaaa @ns1.gs1.pchome.com.tw
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36249
;; flags: qr rd ad; QUERY: 1, ANSWER: 0, AUTHORITY: 5, ADDITIONAL: 6
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;shopping.gs1.pchome.com.tw. IN AAAA
;; AUTHORITY SECTION:
gs1.pchome.com.tw. 3600 IN NS ns3.gs1.pchome.com.tw.
gs1.pchome.com.tw. 3600 IN NS ns4.gs1.pchome.com.tw.
gs1.pchome.com.tw. 3600 IN NS ns5.gs1.pchome.com.tw.
gs1.pchome.com.tw. 3600 IN NS ns1.gs1.pchome.com.tw.
gs1.pchome.com.tw. 3600 IN NS ns2.gs1.pchome.com.tw.
;; ADDITIONAL SECTION:
ns3.gs1.pchome.com.tw. 3600 IN A 210.242.43.93
ns4.gs1.pchome.com.tw. 3600 IN A 203.69.38.91
ns5.gs1.pchome.com.tw. 3600 IN A 210.71.147.91
ns1.gs1.pchome.com.tw. 3600 IN A 210.242.216.91
ns2.gs1.pchome.com.tw. 3600 IN A 210.242.216.92
;; Query time: 11 msec
;; SERVER: 210.242.216.91#53(210.242.216.91)
;; WHEN: Wed Nov 22 11:07:17 CST 2017
;; MSG SIZE rcvd: 310
於是 DNS resolver 就倒在路邊了...