DNS協(xié)議分析_wireshark
1.1 DNS識別主機(jī)有兩種方式:主機(jī)名、IP 地址。前者便于記憶,但路由器很難處理(主機(jī)名長度不定) ;后者定長、有層次結(jié)構(gòu),便于路由器處理,但難以記憶。折中的辦法就是建立IP 地址與主機(jī)名間的映射
1.1 DNS

識別主機(jī)有兩種方式:主機(jī)名、IP 地址。前者便于記憶,但路由器很難處理(主機(jī)名長度不定) ;后者定長、有層次結(jié)構(gòu),便于路由器處理,但難以記憶。折中的辦法就是建立IP 地址與主機(jī)名間的映射,這就是域名系統(tǒng)DNS 做的工作。DNS 通常由其他應(yīng)用層協(xié)議使用(如HTTP 、SMTP 、FTP) ,將主機(jī)名解析為IP 地址,其運(yùn)行在UDP 之上,使用53號端口。 注:DNS 除了提供主機(jī)名到IP 地址轉(zhuǎn)換外,還提供如下服務(wù):主機(jī)別名、郵件服務(wù)器別名、負(fù)載分配。
1.2 HTTP使用DNS 情形
考慮這樣的操作,在瀏覽器輸入http://www.baidu.com/index.html并回車,首先需要將URL(存放對象的服務(wù)器主機(jī)名和對象的路徑名) 解析成IP 地址,具體步驟為:
(1)同一臺(tái)用戶主機(jī)上運(yùn)行著DNS 應(yīng)用的客戶機(jī)端(如瀏覽器)
(2)從上述URL 抽取主機(jī)名www.baidu.com ,傳給DNS 應(yīng)用的客戶機(jī)端(瀏覽器)
(3)該DNS 客戶機(jī)向DNS 服務(wù)器發(fā)送一個(gè)包含主機(jī)名的請求(DNS 查詢報(bào)文)
(4)該DNS 客戶機(jī)收到一份回答報(bào)文(即DNS 回答報(bào)文) ,該報(bào)文包含該主機(jī)名對應(yīng)的IP 地址119.75.218.70
(5)瀏覽器由該IP 地址定位的HTTP 服務(wù)器發(fā)送一個(gè)TCP 鏈接
用Wireshark 捕獲的DNS 報(bào)文如下圖,顯然第一行是DNS 查詢報(bào)文,第二行是DNS 回答報(bào)文。
圖1 Wireshark捕獲的DNS 報(bào)文
二、DNS 報(bào)文
2.1 DNS報(bào)文格式
DNS 只有兩種報(bào)文:查詢報(bào)文、回答報(bào)文,兩者有著相同格式,如下:
,
圖2 DNS

報(bào)文格式
2.1.1 首部區(qū)域
標(biāo)識數(shù)
對該查詢進(jìn)行標(biāo)識,該標(biāo)識會(huì)被復(fù)制到對應(yīng)的回答報(bào)文中,客戶機(jī)用它來匹配發(fā)送的請求與接收到的回答。
標(biāo)志[1]
圖3 DNS報(bào)文首部區(qū)域的標(biāo)志
QR(1比特) :查詢/響應(yīng)的標(biāo)志位,1為響應(yīng),0為查詢。
opcode(4比特) :定義查詢或響應(yīng)的類型(若為0則表示是標(biāo)準(zhǔn)的,若為1則是反向的,若為2則是服務(wù)器狀態(tài)請求) 。
AA(1比特) :授權(quán)回答的標(biāo)志位。該位在響應(yīng)報(bào)文中有效,1表示名字服務(wù)器是權(quán)限服務(wù)器(關(guān)于權(quán)限服務(wù)器以后再討論)
TC(1比特) :截?cái)鄻?biāo)志位。1表示響應(yīng)已超過512字節(jié)并已被截?cái)?依稀好像記得哪里提過這個(gè)截?cái)嗪蚒DP 有關(guān),先記著)
RD(1比特) :該位為1表示客戶端希望得到遞歸回答(遞歸以后再討論)
,RA(1比特) :只能在響應(yīng)報(bào)文中置為1

,表示可以得到遞歸響應(yīng)。
zero(3比特) :不說也知道都是0了,保留字段。
rcode(4比特) :返回碼,表示響應(yīng)的差錯(cuò)狀態(tài),通常為0和3,各取值含義如下: 0 無差錯(cuò)
1 格式差錯(cuò)
2 問題在域名服務(wù)器上
3 域參照問題
4 查詢類型不支持
5 在管理上被禁止
6 -- 15 保留
問題數(shù)、回答RR 數(shù)、權(quán)威RR 數(shù)、附加RR 數(shù)
這四個(gè)字段都是兩字節(jié),分別對應(yīng)下面的查詢問題、回答、授權(quán)和附加信息部分的數(shù)量。一般問題數(shù)都為1,DNS 查詢報(bào)文中,資源記錄數(shù)、授權(quán)資源記錄數(shù)和附加資源記錄數(shù)都為0[1]。
2.1.2 區(qū)域
(1)問題區(qū)域
包含正在進(jìn)行的查詢信息。包含查詢名(被查詢主機(jī)名字的名字字段) 、查詢類型、查詢類。
圖4 DNS報(bào)文的問題區(qū)域
,查詢名
查詢名部分長度不定,一般為要查詢的域名(也會(huì)有IP 的時(shí)候,即反向查詢) 。此部分由一個(gè)或者多個(gè)標(biāo)示符序列組成,每個(gè)標(biāo)示符以首字節(jié)數(shù)的計(jì)數(shù)值來說明該標(biāo)示符長度,每個(gè)名字以0結(jié)束。計(jì)數(shù)字節(jié)數(shù)必須是0~63之間。該字段無需填充字節(jié)。還是借個(gè)例子來說明更直觀些,查詢名為gemini.tuc.noao.edu 的話,查詢名字段如下[1]:


圖5 DNS報(bào)文問題區(qū)別的查詢名
查詢類型
通常查詢類型為A(由名字獲得IP 地址) 或者PTR(獲得IP 地址對應(yīng)的域名) ,類型列表如下:
表1 DNS報(bào)文查詢類型
NS 記錄指定了名字服務(wù)器。一般情況,每個(gè)DNS 數(shù)據(jù)庫中,針對每個(gè)頂級域都會(huì)有一條NS 記錄,這樣一來,電子郵件就可以被發(fā)送到域名樹中遠(yuǎn)處的部分。
查詢類
通常為1,指Internet 數(shù)據(jù)。
,(2)回答、權(quán)威、附加區(qū)域
回答區(qū)域包含了最初請求名字的資源記錄,一個(gè)回答報(bào)文的回答區(qū)域可以包含多條資料記錄RR(因?yàn)橐粋€(gè)主機(jī)名可以對應(yīng)多個(gè)IP

地址,冗余Web 服務(wù)器) 。權(quán)威區(qū)域包含了其他權(quán)威DNS 服務(wù)器的記錄。附加區(qū)域包含其他一些" 有幫助" 的記錄,例如,對于一個(gè)MX(郵件交換) 請求的回答報(bào)文中,回答區(qū)域包含一條資料記錄(該記錄提供郵件服務(wù)器的規(guī)范主機(jī)名) ,附加區(qū)域可以包含一條類型A 記錄(該記錄提供了該郵件服務(wù)器的規(guī)范主機(jī)名的IP 地址) 。
每條資料記錄是一個(gè)五元組,如下:
(域名,生存期,類別,類型,值)
直接表示如下[1]:
圖6 DNS報(bào)文的資源記錄
域名(2字節(jié)或不定長)
記錄中資源數(shù)據(jù)對應(yīng)的名字,它的格式和查詢名字段格式相同。當(dāng)報(bào)文中域名重復(fù)出現(xiàn)時(shí),就需要使用2字節(jié)的偏移指針來替換。例如,在資源記錄中,域名通常是查詢問題部分的域名的重復(fù),就需要用指針指向查詢問題部分的域名。關(guān)于指針怎么用,TCP/IP詳解里面有,即2字節(jié)的指針,最前面的兩個(gè)高位是11,用于識別指針。其他14位從報(bào)文開始處計(jì)數(shù)(從0開始) ,指出該報(bào)文中的相應(yīng)字節(jié)數(shù)。注意,DNS 報(bào)文的第一個(gè)字節(jié)是字節(jié)0,第二個(gè)報(bào)文是字節(jié)1。一般響應(yīng)報(bào)文中,資源部分的域名都是指針
C00C(1100000000001100,12正好是首部區(qū)域的長度) ,剛好指向請求部分的域名[1]。
,類型(記錄的類型,見表1)
A 記錄,Name 是主機(jī)名,Value 是該主機(jī)名的IP 地址,因此,一條類型為A 的資源記錄提供了標(biāo)準(zhǔn)的主機(jī)名到IP 地址的映射。
NS 記錄,Name 是域(如foo.com) ,Value 是知道如何獲得該域中主機(jī)IP 地址的權(quán)威DNS 服務(wù)器的主機(jī)名(如dns.foo.com) ,這個(gè)記錄常用于沿著查詢鏈進(jìn)一步路由DNS 查詢。 CNAME 記錄,Name 是主機(jī)別名,Value 是主機(jī)別名對應(yīng)的規(guī)范主機(jī)名,該記錄能夠向請求主機(jī)提供一個(gè)主機(jī)名對應(yīng)的規(guī)范主機(jī)名。
MX 記錄,Name 是郵件服務(wù)器別名,Value 是郵件服務(wù)器別名的規(guī)范主機(jī)名。通過MX 記錄,一個(gè)公司的郵件服務(wù)器和其他服務(wù)器可以使用相同的別名。
注:有著復(fù)雜主機(jī)名的主機(jī)能擁有多個(gè)別名,前者稱為規(guī)范主機(jī)名,后者稱為主機(jī)別名(便于記憶) 。
類
對于Internet 信息,它總是IN 。
生存時(shí)間
用于指示該記錄的穩(wěn)定程度,極為穩(wěn)定的信息會(huì)被分配一個(gè)很大的值(如86400,一天的秒數(shù)) 。該字段表示資源記錄的生命周期(以秒為單位) ,一般用于當(dāng)?shù)刂方馕龀绦蛉〕鲑Y源記錄后決定保存及使用緩存數(shù)據(jù)的時(shí)間[1]。
資源數(shù)據(jù)長度(2字節(jié))
表示資源數(shù)據(jù)的長度(以字節(jié)為單位,如果資源數(shù)據(jù)為IP 則為0004) 。
資源數(shù)據(jù)
該字段是可變長字段,表示按查詢段要求返回的相關(guān)資源記錄的數(shù)據(jù)。
2.2 DNS查詢報(bào)文實(shí)例
以www.baidu.com 為例,用Wireshark 俘獲分組,結(jié)合2.1的理論內(nèi)容,很容易看明白的,DNS 請求報(bào)文如下:
,圖7 DNS請求報(bào)文示例

2.3 DNS回答報(bào)文實(shí)例
,圖8 DNS回答報(bào)文示例
