各位前輩大家好,我用 dig +trace 想了解DNS查詢流程,結果如下
**dig +tracer www.google.com.tw @8.8.8.8
; <<>> DiG 9.2.4 <<>> +tracer www.google.com.tw @8.8.8.8
; (1 server found)
;; global options: printcmd
. 13422 IN NS j.root-servers.net.
. 13422 IN NS d.root-servers.net.
. 13422 IN NS a.root-servers.net.
. 13422 IN NS g.root-servers.net.
. 13422 IN NS h.root-servers.net.
. 13422 IN NS i.root-servers.net.
. 13422 IN NS c.root-servers.net.
. 13422 IN NS m.root-servers.net.
. 13422 IN NS f.root-servers.net.
. 13422 IN NS l.root-servers.net.
. 13422 IN NS b.root-servers.net.
. 13422 IN NS k.root-servers.net.
. 13422 IN NS e.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 53 ms
tw. 172800 IN NS sec4.apnic.net.
tw. 172800 IN NS b.dns.tw.
tw. 172800 IN NS ns.twnic.net.
tw. 172800 IN NS e.dns.tw.
tw. 172800 IN NS d.dns.tw.
tw. 172800 IN NS a.dns.tw.
tw. 172800 IN NS h.dns.tw.
tw. 172800 IN NS g.dns.tw.
tw. 172800 IN NS f.dns.tw.
tw. 172800 IN NS c.dns.tw.**
;; Received 498 bytes from 192.58.128.30#53(j.root-servers.net) in 58 ms
----------- 以下省略 -------------
第一個問題,我的 dns server 是否本身就知道 j.root-servers.net 的 ip address ? 不然它怎麼繼續封裝 DNS Query 的封包
第二個問題,當我詢問 j.root-servers.net 這台 dns server 後,他說我可以去查 ns.twnic.net. 這台 dns server。可是對我的 dns server 來說,它要怎麼知道 ns.twnic.net. 這台 dns server 的 ip address ,好讓它繼續往下查詢? 是 j.root-servers.net 會同時主動告訴我的 dns server,還是我的 dns server 需要自己去查詢?
希望大家看的懂我的問題 ...0rz
感恩
DNS的查詢模式有分兩種
1.遞迴式(Recursive)
2.交談式(Interactive)
你所下的指令(dig +tracer www.google.com.tw @8.8.8.8)是從根找起(.全世界13台伺服器)
www.google.com.tw.
Client與8.8.8.8是用(Recursive) 查詢
8.8.8.8與其他DNS是用(Interactiv)查詢
Client----------->8.8.8.8---->(先去問. 13台根伺服器)
8.8.8.8<-----(告訴8.8.8.8你可以到所屬的.tw DNS去查詢)
8.8.8.8----->(去問所屬的.tw DNS)
8.8.8.8<------(告訴8.8.8.8你可以到所屬的com.tw DNS去查)
8.8.8.8------->(去問所屬 的com.tw DNS)
Client<-----------8.8.8.8<--------(告訴8.8.8.8 google.com.tw這就是你要)
它會去問你系統設定的 dns server
rfc1034 內定義了 additional section: Carries RRs which may be helpful in using the RRs in the other sections.
也就是說, 它可以在 additional record 裡順便送 ip 給你(如果有的話..)
dns的查詢過程完全可以用 wireshark 觀察, 也是很好的學習方式
先假設你說的"我的 dns server", 指的是
Windows : 網路連線設定的"慣用DNS伺服器"
UNIX : resolv.conf 之 nameserver
也就是我以下講的 resolver (提供遞迴查詢服務的解析器,亦或稱recursor).
dig , nslookup , host 都是DNS query 工具/client,
dig 有 UNIX win32 win64 ..等版本,
執行上並不依賴本機平台是否有啟動DNS daemon,
但一定會與你的 resolver 有密切往來.
( 若本機有啟動DNS daemon並提供遞迴查詢, resolver也可以是自己 )
dig +trace (不是+tracer) 用意是 Trace delegation down from root ,
就是列出從根網域到你要查的FQDN, 各層網域的授權分佈,
當你執行 dig +trace @8.8.8.8 www.google.com.tw ,
8.8.8.8#53 只回你 . (根網域)有哪些Authoritative name server :
. 13422 IN NS k.root-servers.net.
. 13422 IN NS e.root-servers.net.
;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 53 ms
但它們的IPv4/IPv6 (A/AAAA)資訊卻不是 8.8.8.8 提供,
而是你的 dig 向 resolver 提出,
由 resolver 去查詢後回給你的 dig ,
這部份資訊 dig 是看不到的, 要從 resolver 那邊才能證實, 例如:
19-May-2014 20:40:05.359 queries: info: client 192.168.1.100#1889
(i.root-servers.net): query: i.root-servers.net IN A + (192.168.1.70)
19-May-2014 20:40:05.363 queries: info: client 192.168.1.100#1805
(j.root-servers.net): query: j.root-servers.net IN A + (192.168.1.70)
或者可監看上網歷程的機制也可以觀察出.
接下來再由你的 dig 程式選擇一筆(例如 j.root-servers.net ),
去向 192.58.128.30 問 tw 這層有哪些Authoritative DNS ,
所以這部份是由 j.root-servers.net 192.58.128.30#53 來回應你的 dig :
tw. 172800 IN NS f.dns.tw.
tw. 172800 IN NS c.dns.tw.
;; Received 498 bytes from 192.58.128.30#53(j.root-servers.net)
而不是由 8.8.8.8 來回答這部份喔!
所有 DNS server 都需要設定 . (根網域)可以從哪裡開始查詢, 例如
zone "." {
type hint;
file "named.root";
};
這個 named.root ( 或named.ca )就記錄著
(a,b,c,...,m).root-servers.net 以及它們的IPv4/IPv6,
雖然裡面只有13筆, 教學網站/書籍也都是講13台,
我覺得稱它們是13群DNS servers較合理,
例如 j.root-servers.net (Verisign)就分佈世界各地73組, 其中一組在台北,
以及 f.root-servers.net (ISC), i.root-servers.net (Netnod)也有在台北的.
要不然, 如果台灣對外國際海纜斷線,
豈不是連 *.tw *.台灣 *.台湾 也跟著停擺?
您的第二問, j.root-servers.net 回應 tw 這層的Authoritative DNS,
其中有個 ns.twnic.net , 如果你的 resolver 沒有 ns.twnic.net
的 cahce data, 就要再從根網域問起, 得到答案後cache起來然後回應你的 dig 程式.
[參考]
http://www.root-servers.org/
http://www.iana.org/
http://www.internic.com/
http://en.wikipedia.org/wiki/Domain_Name_System