2021/4/9 更新,最近換電腦下載了新版本的 dig 9.16.13,不知道從那個版本開始,+subnet 這個參數已經不能再用比 /24 廣的查詢了,所以使用時我就是都以 /24 來查詢了,例如:
> dig www.google.com @8.8.8.8 +subnet=128.32.203.137/24
2019/1/31 更新,大概是 2/1 是 DNS flag day 的關係,這篇略有相關的文章竟然也湧入了很多遊客,所以我也是 google 了一下相關文章,更新如下:
本文所提到的 edns client subnet 功能其實只能算是使用 edns 這個延伸協定中的一個項目,由於在古早的 DNS 協定中,一次 DNS query 的回應只規範了 512 bytes 的大小,由於當時網路速度慢,機器也不快,這樣子的設計也可以理解。但隨著網路越來越快,使用的情境越來越複雜時,512 bytes 大小的回應便顯得很難用了,最典型的狀況是:你最多只能有 13 個 DNS 權威伺服器,連 root DNS 也是一樣(a 到 m 共 13 個),原因是一個回應放不下,所以現在有了 edns 之後,理論上要可以到 4096 bytes,有人說這樣子可以回應出 236 個 DNS Servers,想來不久的相來可以看到 root DNS server 變多的情景了。
那為什麼很多網路上的文章寫說支持這個 DNS flag day 是為了更好更安全的網路環境呢? 這說是對也是對,說是硬湊也是可以。由於有個 DNSSEC 的協定被設計來避免 DNS poison 的安全性問題(很常見,對岸那邊尤其多),而這個 DNSSEC 協定卻依賴 edns 才有足夠的 payload 可以放這些資料,所以呢,你可以說這個 DNS flag day 是為了 DNSSEC 鋪路,因為他只測試你的 DNS Server 是不是支援 edns ,但說有 edns 相容性之後就可以提高安全性就有點超過了。(甚至於 payload 變高搞不好還可能被用來作為 DNS 放大攻擊)
那為什麼要這麼大聲量的宣傳這個東西? 其實 DNSSEC 協定推出了很久,各大的 DNS 供應商也都有支援了,只是 DNSSEC 這協定如果沒有「從最源頭到最底層」,也就是從 root DNS server 到 DNS client (eg. 你的 Windows NB) 都支援的話,那效果就不太顯著。講個例子好了,我想大家都可以理解一件事:IPv6 從 1994 年出現到現在一直都沒成為主流,就可以知道想在 Internet 上「全面」的推行一個新標準有多困難,由於要推行 DNSSEC 不只是所有的 DNS Server 都得全面更新,連可能經過的 firewall, load balancer 之類的設備也可能需要升級 (eg. 你的 F5 GTM 版本支援 EDNS 嗎?),所以先從這著手鋪路一下是個不錯的漸進手段。
和這篇文章的關係是? 其實我覺得要驗證是不是 edns 相容最好最快的方法就是用官方網站上的測試網頁了,如果真的想要手動測試的話,請參考下文去下載 Windows 下的 dig 程式 (BIND 9.11.0 之後),然後依照這個方法來手動測試。
啥? 那為什麼 Hinet 或 TWNIC 一直廣告說讓大家用他們的 DNS Server (168.95.1.1 或 101.101.101.101) 就不會有影響? 那顯然就是她們為了「體恤」那些還來不及做好相容性升級的域名管理者(或網站),所以選擇不加入這個「為網際網路安全」的下一步
———————————-以下是原文章 ————————————
之前提到了說 BIND 會從 9.11 開始支援 EDNS client-subnet,所以若你的 BIND 已經開始使用 GeoDNS 的功能,恰好你的 end user 用的 DNS server 也支援 EDNS client-subnet 的話 (eg. Google DNS 就支援),那恭喜你,你的 GeoDNS 的效果應該會變得更加顯著。
但實際把功能丟上去之後,你就會發現有事沒事的你會遇到使用者抱怨他連你的網站速度太慢,原因是因為你的 GeoDNS 回給他的結果和你預期的不同,原本你想要 GeoDNS 丟個離日本最近的 IP 給他,但他拿到的卻是個英國的 IP。這時候我們就需要個可以快速驗證 GeoDNS 設定是否正確的工具了。
這工具其實也很簡單,因為就是隨著 BIND 9.11 一起更新的 dig 命令,只是以前我笨笨的,以為 BIND 只有出 source code,自己又沒種花時間去 Windows 下建立編譯的環境,所以都是去抓別人編譯好的執行檔,自己都覺得有點不是挺安全的,不過剛剛仔細一瞧,原來 ISC 自己的官方網站上就放了 BIND 的 Windows 版,只要下載之後安裝也就可以用了…
安裝的時候只要選擇「Tools Only」就好,我想大家也不想在自己的電腦裡裝個用不著的 BIND Server
裝好之後,如果你像我一樣對自己用的系統有一點潔癖的話,可以把目錄下的這些檔案(除 BINDInstall之外)拷貝到你喜歡的目錄,剩下的東西則可以全部移除。
dig + EDNS client-subnet 的使用方法也很簡單,就是
dig [domain name you want to query] @[DNS Server] +subnet=[addr]
以 http://www.google.com 為例,如果我是個位於美國的使用者,IP 是 128.32.203.137 (我隨便抓了個柏克萊大學的 IP 來測試),解析出來的會是 172.217.5.100
那如果我是個台大的學生,IP 是 140.112.8.116 的話,解析出來的會是 163.28.18.30 (左右…)
我自己現在用的是遠傳的網路,從 ping 的結果看來,Google 應該也是有應用 GeoDNS 來加快網站的速度(當然也用了 BGP anycast,但不在此文討論範圍)
最後,更笨的是,如果你什麼都不想裝,就用別人放在雲端上的服務就好了…