老衲曰:
張老師是圈內公認的大神,不僅知識全面,而且親自動手完成大量神作應用在實踐中。同時,熱心行業同仁共同提高,費心費力寫作大量文稿,公之於眾。老衲也是十年的追隨者,可惜蜻蜓點水只是學得皮毛,徵得大神同意(大神直接給了所有作品,特意說可以不署名。一心以推廣知識為追求,實在是我等楷模。),在微信公眾號陸續選取一些文章介紹給大家。
本文原創:中國科學技術大學 張煥傑
修改時間:2017.12.03
前幾天一條標題是"中國部署4臺IPv6根DNS,自主掌控網際網路中樞命脈"的新聞刷了屏,針對該新聞暫不發表意見。
我們來看看中國大陸根DNS伺服器的奧秘。
根DNS伺服器是網際網路上DNS工作最核心的伺服器,它存放的信息和處理功能其實很簡單。
一、根DNS伺服器存有什麼信息根DNS伺服器上存放有頂級域的域名,以及負責該頂級域解析的域名伺服器信息。
比如中國的頂級域.cn,在根DNS伺服器中就有如下的信息:
cn. 172800 IN NS a.dns.cn.
cn. 172800 IN NS b.dns.cn.
cn. 172800 IN NS c.dns.cn.
cn. 172800 IN NS d.dns.cn.
cn. 172800 IN NS e.dns.cn.
cn. 172800 IN NS ns.cernet.net.
ns.cernet.net. 172800 IN A 202.112.0.44
a.dns.cn. 172800 IN A 203.119.25.1
a.dns.cn. 172800 IN AAAA 2001:dc7:0:0:0:0:0:1
b.dns.cn. 172800 IN A 203.119.26.1
c.dns.cn. 172800 IN A 203.119.27.1
d.dns.cn. 172800 IN A 203.119.28.1
d.dns.cn. 172800 IN AAAA 2001:dc7:1000:0:0:0:0:1
e.dns.cn. 172800 IN A 203.119.29.1
h.dns.cn. 172800 IN A 125.208.32.1
h.dns.cn. 172800 IN AAAA 2001:dc7:fffe:0:0:0:0:1
i.dns.cn. 172800 IN A 125.208.33.1
i.dns.cn. 172800 IN AAAA 2001:dc7:ffff:0:0:0:0:1
j.dns.cn. 172800 IN A 125.208.34.1
k.dns.cn. 172800 IN A 125.208.35.1
l.dns.cn. 172800 IN A 125.208.36.1
細心的會看出來,前面只有a-e.dns.cn,後面的h-l.dns.cn是幹什麼用的呢?後面的那些是".中國"之類的中文域名解析使用的。
這些信息不是機密,負責DNS的機構IANA在 Root Zone File 公開提供,目前該文件大小是2.2MB。
二、根DNS伺服器的處理過程當一臺DNS伺服器解析一個域名時,首先向根DNS域名伺服器發送請求。
比如一臺DNS伺服器需要查詢科大的主頁www.ustc.edu.cn對應的IP位址,它會首先向某一個根DNS伺服器發送wwww.ustc.edu.cn的域名請求。根DNS伺服器接到請求後,根據自己保存的信息,返回一個下面的應答
;; AUTHORITY SECTION:
cn. 172800 IN NS a.dns.cn.
cn. 172800 IN NS e.dns.cn.
cn. 172800 IN NS d.dns.cn.
cn. 172800 IN NS c.dns.cn.
cn. 172800 IN NS ns.cernet.net.
cn. 172800 IN NS b.dns.cn.
;; ADDITIONAL SECTION:
a.dns.cn. 172800 IN A 203.119.25.1
a.dns.cn. 172800 IN AAAA 2001:dc7::1
b.dns.cn. 172800 IN A 203.119.26.1
c.dns.cn. 172800 IN A 203.119.27.1
d.dns.cn. 172800 IN A 203.119.28.1
d.dns.cn. 172800 IN AAAA 2001:dc7:1000::1
e.dns.cn. 172800 IN A 203.119.29.1
ns.cernet.net. 172800 IN A 202.112.0.44
這些應答的含義是:請向a.dns.cn、b.dns.cn、... ns.cernet.net查詢,它們會負責處理www.ustc.edu.cn有關的信息。
域名伺服器會從a.dns.cn、b.dns.cn、... ns.cernet.net挑一個,向它發送查詢。這樣的步驟一直持續,直到有個域名伺服器返回了IP位址信息。
從上面過程看,根DNS伺服器需要進行的處理真的很簡單。
那問題來了,一個普通的DNS伺服器,怎麼知道誰是根DNS伺服器呢?
答案很簡單,每個DNS伺服器都有個文件,存放有根DNS伺服器的信息,這個文件很小,有用的信息只有13*3=39行,每3行是一個根DNS伺服器的信息,如下所示:
. 3600000 NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:ba3e::2:30
DNS服務軟體會附帶提供這個文件,一般很少修改。IANA也有提供,放在 Root Hints File。如果你維護有DNS伺服器,建議從這裡下載最新的更新一下。
如果每次域名查詢都這樣從根DNS開始,查詢響應的速度會很慢。實際上DNS伺服器會儘量使用緩存,減少不必要的查詢,大大加快域名查詢的響應速度。
三、一共有多少個根DNS伺服器呢這個問題很不好回答。
由於UDP數據包長度的原因,根DNS伺服器最多只有13個,就是 a-m.root-servers.net。
但這僅僅是有13個不同名字(地址)的根DNS伺服器,實際上每個名字(地址)對應有多臺伺服器,或者說存在很多臺根DNS伺服器,它們具有相同的IP位址。
一般來說,網際網路上的IP很少會重疊使用,也就是說很少有2臺設備使用相同的IP位址。但例外就是DNS這種服務,稱為AnyCast服務,可以由很多設備使用相同的IP,就近對外提供服務。
http://root-servers.org/ 網站公布有分布在全球的根DNS伺服器,從這裡可以看到中國大陸有若干。
四、自己可以做根DNS伺服器嗎當然可以,而且非常簡單。只要安裝DNS服務軟體,定期從IANA網站下載那個2.2MB的根文件,就可以做根DNS伺服器了。
為了方便使用,需要在公布的那些IP位址提供服務,一般來說需要利用BGP/OSPF/靜態路由之類手段的把路由注入到網絡中(注入是文雅的說法,其實就是劫持到根DNS伺服器IP的路由),因此最好是ISP來做才比較方便。
使用BGP注入路由並不複雜,遠比想像的簡單,可以參考 使用ExaBGP發送BGP路由信息和清洗DDoS流量
五、國內有ISP做根DNS伺服器嗎當然有了,比如中國教育和科研計算機網,從合肥測試的話,與a-m.root-servers.net的通信延遲,主要分3檔:
延遲伺服器0msf j30msa b c d e g i k l m300msh從延遲可以推斷,f j這兩個伺服器就在合肥(確切的說就在中國科學技術大學網絡信息中心機房內),h伺服器不在國內,其它的在中國教育和科研計算機網內的某個地方。
僅僅中國教育和科研計算機網內就至少有12個根DNS伺服器,而且其中2個就在合肥。
到這裡就明白為什麼很難回答有多少個根DNS伺服器,因為誰也不知道。