DNS: Domain Name System,指的是整一個系統,而不是一個特定的機器
NS: Nameserver,提供域名解析服務的機器,給它一個域名,它會給你解析出ip或者給你對應的NS信息
DNS server: 代替用戶的機器向NS查詢域名<->ip
A記錄 -> 域名 -> ip
,直接給你ip
NS記錄 -> 域名 -> NS
,給你一個NS地址php
DNS 利用相似樹狀目錄的架構,將主機名稱的管理分配在不一樣層級的 DNS 服務器當中,經由分層管理, 因此每一部 DNS 服務器存儲的數據就不會不少linux
Layer | host name | domain name |
---|---|---|
頂級 | edu | .tw |
二級 | ksu | edu.tw |
三級 | www | ksu.edu.tw |
這裏給出一個不太嚴謹的例子。這裏以查詢www.baidu.com 爲例, 展現DNS服務器如何一級級地查詢到它的IP地址,中間要通過三個NS。若是DNS服務器裏面有緩存(一段時間失效),就能夠直接報給client。緩存
下面使用dig +trace來模擬DNS查詢出南京大學小百合bbs的地址安全
dig +trace bbs.nju.edu.cn ; <<>> DiG <<>> +trace bbs.nju.edu.cn ;; global options: +cmd . 3230 IN NS g.root-servers.net. . 3230 IN NS e.root-servers.net. . 3230 IN NS m.root-servers.net. . 3230 IN NS l.root-servers.net. . 3230 IN NS d.root-servers.net. . 3230 IN NS b.root-servers.net. . 3230 IN NS i.root-servers.net. . 3230 IN NS h.root-servers.net. . 3230 IN NS a.root-servers.net. . 3230 IN NS k.root-servers.net. . 3230 IN NS j.root-servers.net. . 3230 IN NS c.root-servers.net. . 3230 IN NS f.root-servers.net. ;; Received 460 bytes from 127.0.1.1#53(127.0.1.1) in 8 ms cn. 172800 IN NS b.dns.cn. cn. 172800 IN NS a.dns.cn. cn. 172800 IN NS ns.cernet.net. cn. 172800 IN NS e.dns.cn. cn. 172800 IN NS d.dns.cn. cn. 172800 IN NS c.dns.cn. ;; Received 513 bytes from 192.5.5.241#53(f.root-servers.net) in 300 ms edu.cn. 172800 IN NS ns2.cuhk.hk. edu.cn. 172800 IN NS deneb.dfn.de. edu.cn. 172800 IN NS dns.edu.cn. edu.cn. 172800 IN NS dns2.edu.cn. edu.cn. 172800 IN NS ns2.cernet.net. ;; Received 716 bytes from 203.119.25.1#53(a.dns.cn) in 30 ms NJU.edu.cn. 172800 IN NS DNS.NJU.EDU.CN. NJU.edu.cn. 172800 IN NS NS.NJU.EDU.CN. ;; Received 131 bytes from 202.112.0.35#53(dns.edu.cn) in 3639 ms bbs.nju.edu.cn. 10800 IN A 210.28.129.4 ;; Received 59 bytes from 202.119.32.12#53(NS.NJU.EDU.CN) in 167 ms
簡化過程以下:服務器
這是一個企業級的網站的例子,能夠看出架構
若是搭建一個很簡單的網站,也能夠不用創建Nameserver,向上一級申請填寫你的主機名和ip,這樣就簡便多了。這樣在DNS查詢的最後一步,結果是直接指向你的網站,而不是指向你的網站的dns服務器less
解析一個域的DNS服務器能夠有多個。這樣數據的同步更新就是一個問題了,因此有了Master-Slave架構。dom
當Master更新了數據以後,Slave會向其拿更新的數據,這樣維護DNS的時候就不用每一臺都去更新了。tcp
當你從ISP得到動態IP的時候,IP常常變換的狀況就會顯得很不方便。DDNS機制使得你能夠頻繁地將本身的IP報告給NS,而後Internet上面的DNS主機須要頻繁地更新解析的記錄(設定一個較短的最大緩存時間)。函數
DNS一般使用基於port 53的UDP,有時候數據量太大的時候使用TCP
cat /etc/services | grep 53 domain 53/tcp # Domain Name Server domain 53/udp
用戶自定義的 ip <-> 域名
# cat /etc/hosts 127.0.0.1 localhost. 1.2.3.4 www.fake.com 3.4.5.6 www.fake1.com
存儲DNS服務器的地址,在DHCP以後,DHCP client會自動修改這個配置文件。
#cat /etc/resolv.conf # Generated by dhcpcd nameserver 8.8.8.8
注意到,uclibc裏面的__dns_lookup
函數,會使用__open_nameservers函數
從這個文件裏面拿到的DNS服務器的地址,而後向這個地址發送DNS數據包。
Nslookup is a program to query Internet domain name servers. Nslookup has two modes: interactive and non-interactive
tan@tanhangbo-pc:~$ nslookup bbs.nju.edu.cn Server: 127.0.1.1 Address: 127.0.1.1#53 Non-authoritative answer: Name: bbs.nju.edu.cn Address: 210.28.129.4
tcpdump抓包結果以下,說明是進行了一次DNS查詢。
host is a simple utility for performing DNS lookups. It is normally used to convert names to IP addresses and vice versa
@query1 tan@tanhangbo-pc:~$ host bbs.nju.edu.cn bbs.nju.edu.cn has address 210.28.129.4 @query2 tan@tanhangbo-pc:~$ host 8.8.8.8 8.8.8.8.in-addr.arpa domain name pointer google-public-dns-a.google.com. @query3 tan@tanhangbo-pc:~$ host www.baidu.com 8.8.8.8 Using domain server: Name: 8.8.8.8 Address: 8.8.8.8#53 Aliases: www.baidu.com is an alias for www.a.shifen.com. www.a.shifen.com has address 61.135.169.125 www.a.shifen.com has address 61.135.169.121
tcpdump抓包結果以下,說明是進行了一次DNS查詢。
能夠看出,host也能夠做爲反解,而且能夠指定DNS服務器的地址讓它進行查詢。
dig (domain information groper) is a flexible tool for interrogating DNS name servers. It performs DNS lookups and displays the answers that are returned from the name server(s) that were queried. Most DNS administrators use dig to troubleshoot DNS problems because of its flexibility, ease of use and clarity of output. Other lookup tools tend to have less functionality than dig
從man的介紹來看,dig的逼格是最高的,上面已有一個實例,就再也不介紹了。
推薦程度來講,dig > host > nslookup
http://linux.vbird.org/linux_server/0350dns.php