DNS解析過程詳解
目錄(?)[+]
先說一下DNS的幾個基本概念:
一. 根域
就是所謂的“.”,其實我們的網址www.baidu.com在配置當中應該是www.baidu.com.(最後有一點),一般我們在浏覽器裡輸入時會省略後面的點,而這也已經成為了習慣。
根域伺服器我們知道有13台,但是這是錯誤的觀點。
根域伺服器隻是具有13個IP位址,但機器數量卻不是13台,因為這些IP位址借助了任播的技術,是以我們可以在全球設立這些IP的鏡像站點,你通路到的這個IP并不是唯一的那台主機。
具體的鏡像分布可以參考維基百科。這些主機的内容都是一樣的
二. 域的劃分
根域下來就是頂級域或者叫一級域,
有兩種劃分方式,一種網際網路剛興起時的按照行業性質劃分的com.,net.等,一種是按國家劃分的如cn.,jp.,等。
具體多少你可以自己去查,我們這裡不關心。
每個域都會有域名伺服器,也叫權威域名伺服器。
Baidu.com就是一個頂級域名,而www.baidu.com卻不是頂級域名,他是在baidu.com 這個域裡的一叫做www的主機。
一級域之後還有二級域,三級域,隻要我買了一個頂級域,并且我搭建了自己BIND伺服器(或者其他軟體搭建的)注冊到網際網路中,那麼我就可以随意在前面多加幾個域了(當然長度是有限制的)。
比如a.www.baidu.com,在這個網址中,www.baidu.com變成了一個二級域而不是一台主機,主機名是a。
三. 域名伺服器
能提供域名解析的伺服器,上面的記錄類型可以是A(address)記錄,NS記錄(name server),MX(mail),CNAME等。
(詳解參見部落格:域名解析中A記錄、CNAME、MX記錄、NS記錄的差別和聯系)
A記錄是什麼意思呢,就是記錄一個IP位址和一個主機名字,比如我這個域名伺服器所在的域test.baidu.com,我們知道這是一個二級的域名,然後我在裡面有一條A記錄,記錄了主機為a的IP,查到了就傳回給你了。
如果我現在要想baidu.com這個域名伺服器查詢a.test.baidu.com,那麼這個頂級域名伺服器就會發現你請求的這個網址在test.baidu.com這個域中,我這裡記錄了這個二級域的域名伺服器test.baidu.com的NS的IP。我傳回給你這個位址你再去查主機為a的主機把。
這些域内的域名伺服器都稱為權威伺服器,直接提供DNS查詢服務。(這些伺服器可不會做遞歸哦)
四.解析過程
那麼我們的DNS是怎麼解析一個域名的呢?
1.現在我有一台計算機,通過ISP接入了網際網路,那麼ISP就會給我配置設定一個DNS伺服器,這個DNS伺服器不是權威伺服器,而是相當于一個代理的dns解析伺服器,他會幫你疊代權威伺服器傳回的應答,然後把最終查到IP傳回給你。
2.現在的我計算機要向這台ISPDNS發起請求查詢www.baidu.com這個域名了,
3.ISPDNS拿到請求後,先檢查一下自己的緩存中有沒有這個位址,有的話就直接傳回。這個時候拿到的ip位址,會被标記為非權威伺服器的應答。
4.如果緩存中沒有的話,ISPDNS會從配置檔案裡面讀取13個根域名伺服器的位址(這些位址是不變的,直接在BIND的配置檔案中),
5.然後像其中一台發起請求。
6.根伺服器拿到這個請求後,知道他是com.這個頂級域名下的,是以就會傳回com域中的NS記錄,一般來說是13台主機名和IP。
7.然後ISPDNS向其中一台再次發起請求,com域的伺服器發現你這請求是baidu.com這個域的,我一查發現了這個域的NS,那我就傳回給你,你再去查。
(目前百度有4台baidu.com的頂級域名伺服器)。
8.ISPDNS不厭其煩的再次向baidu.com這個域的權威伺服器發起請求,baidu.com收到之後,查了下有www的這台主機,就把這個IP傳回給你了,
9.然後ISPDNS拿到了之後,将其傳回給了用戶端,并且把這個儲存在高速緩存中。
下面我們來用 nslookup 這個工具詳細來說一下解析步驟:
從上圖我們可以看到:
第一行Server是:DNS伺服器的主機名--210.32.32.1
第二行Address是: 它的IP位址--210.32.32.1#53
下面的Name是:解析的URL-- www.jsjzx.com
Address是:解析出來的IP--112.121.162.168
但是也有像百度這樣的DNS比較複雜的解析:
你會發現百度有一個cname = www.a.shifen.com 的别名。
這是怎麼一個過程呢?
我們用dig工具來跟蹤一下把(linux系統自帶有)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Dig工具會在本地計算機做疊代,然後記錄查詢的過程。
第一步是向我這台機器的ISPDNS擷取到根域服務區的13個IP和主機名[b-j].root-servers.net.。
第二步是向其中的一台根域伺服器(Servername就是末行小括号裡面的)發送www.baidu.com的查詢請求,他傳回了com.頂級域的伺服器IP(未顯示)和名稱,
第三步,便向com.域的一台伺服器192.33.4.12請求,www.baidu.com,他傳回了baidu.com域的伺服器IP(未顯示)和名稱,百度有四台頂級域的伺服器
【此處可以用dig @192.33.4.12 www.baidu.com檢視傳回的百度頂級域名伺服器IP位址】。
第四步呢,向百度的頂級域伺服器(202.108.22.220)請求www.baidu.com,他發現這個www有個别名,而不是一台主機,别名是www.a.shifen.com。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
按照一般的邏輯,當dns請求到别名的時候,查詢會終止,而是重新發起查詢别名的請求,是以此處應該傳回的是www.a.shifen.com而已。
但是為什麼傳回a.shifen.com的這個域的NS呢?
我們可以嘗試下面的這個指令:dig +trace shifen.com 看看有什麼結果。。。。。。。。
你會發現第三步時shifen.com這個頂級域的域名伺服器和baidu.com這個域的域名伺服器是同一台主機(即:dns.baidu.com)!
當我拿到www.baidu.com的别名www.a.shifen.com的時候,我本來需要重新到com域查找shifen.com域的NS,但是因為這兩個域在同一台NS上,是以直接向本機發起了,
shifen.com域發現請求的www.a.shifen.com是屬于a.shifen.com這個域的,
于是就把a.shifen.com的這個NS和IP傳回,讓我到a.shifen.com這個域的域名伺服器上查詢www.a.shifen.com。
于是我便從ns X .a.shifen.com中一台拿到了一條A記錄,最終的最終也便是www.baidu.com的IP位址了.【此處也可以用dig +trace www.a.shifen.com】跟蹤一下
用一個圖來說明一下(圖中第三步的全世界隻有13台是錯誤的)
以下内容為在虛拟機中搭建local dns伺服器得到的實驗資料,糾正上述結論
在上面的分析中,我們用dig工具進行了追蹤,但是dig沒有繼續追蹤當我們從baidu.com拿到cname和ns2.a.shifen.com的IP之後的事情。
我們就是以然的下結論認為local dns會向ns2.a.shifen.com請求www.a.shifenc.om。
其實這個想法是錯誤,在自己的本地搭建一個local dns,抓取整個解析過程中是所有包,看看就明白拉。
實際的結果是雖然dns.baidu.com傳回了a.shifen.com域的伺服器位址和IP,
但是local dns并不是直接向上述傳回的IP請求www.a.shifen.com,而是再一次去請求com域,得到shifen.com域的伺服器(也就是baidu.com的那四台),
然後又請求www.a.shifen.com,傳回a.shifen.com的域的伺服器,最後才是去請求www.a.shifen.com,
雖然上面已經傳回了IP,但是實驗的結果就是再走一遍shifen.com域的查詢。
上圖就是localdns在解析www.baidu.com的抓包全過程。藍色那條就是在收到cname和響應的a.shifen.com的域名伺服器IP位址之後,繼續向com域請求shifen.com。
這個圖充分說明了傳回cname的同時也傳回了ns2.a.shifen.com的IP。
是以總結一下便是
①本機向local dns請求www.baidu.com
②local dns向根域請求www.baidu.com,根域傳回com.域的伺服器IP
③向com.域請求www.baidu.com,com.域傳回baidu.com域的伺服器IP
④向baidu.com請求www.baidu.com,傳回cname www.a.shifen.com和a.shifen.com域的伺服器IP
⑤向root域請求www.a.shifen.com
⑥向com.域請求www.a.shife.com
⑦向shifen.com請求