利用WireShark進行DNS協議分析
一.準備工作
系統是Windows 8.1Pro
分析工具是WireShark1.10.8 Stable Version
使用系統Ping命令傳送ICMP報文.
二.開始工作
開啟CMD.exe鍵入:
ping www.oschina.net
將自動進行域名解析,預設傳送4個ICMP報文.
啟動Wireshark,選擇一個有效網絡卡,啟動抓包.
在控制檯回車執行完畢後停止監控.
三.分析階段
截獲的所有報文如下:
總得來看有兩個DNS包(一次域名解析),和8個ICMP包(四次ping)
下面開始分析DNS的工作過程:
開啟第一個包:
可以發現DNS為應用層協議,下層傳輸層採用UDP,再下層網路層是IP協議,然後是資料鏈路層的乙太網幀.
在此之前,可以從下層獲得一些必要資訊:
UDP(User Datagram Protocol)報文中:DNS的目的埠(Dst Port)是53
IPv4(Internet Protocol Version 4)報文中目的IP是192.168.1.1(區域網路由器)
由於IP報文在網路層進行路由選擇,他會依次送給路由器而不是直接送給DNS伺服器,這一點也十分容易理解,
第一個包是請求包,不可能直接包含DNS伺服器地址.
展開DNS資料:
第一個是Transaction ID為標識欄位,2位元組,用於辨別DNS應答報文是哪個請求報文的響應.
第二個是Flags標誌欄位,2位元組,每一位的含義不同,具體可以參考上面那個圖,也可以看下面這個圖:
QR: 查詢/響應,1為響應,0為查詢
Opcode: 查詢或響應型別,這裡0表示標準,1表示反向,2表示伺服器狀態請求
AA: 授權回答,在響應報文中有效,待會兒再看
TC: 截斷,1表示超過512位元組並已被截斷,0表示沒有發生截斷
RD: 是否希望得到遞歸回答
RA: 響應報文中為1表示得到遞迴響應
zero: 全0保留欄位
rcode: 返回碼,在響應報文中,各取值的含義:
0 - 無差錯
1 - 格式錯誤
2 - 域名伺服器出現錯誤
3 - 域參照問題
4 - 查詢型別不支援
5 - 被禁止
6 ~ 15 保留
緊接著標誌位的是
Quetions(問題數),2位元組,通常為1
Answer RRs(資源記錄數),Authority RRs(授權資源記錄數),Additional RRs(額外資源記錄數)通常為0
欄位Queries為查詢或者響應的正文部分,分為Name Type Class
Name(查詢名稱):這裡是ping後的引數,不定長度以0結束
Type(查詢型別):2位元組,這裡是主機A記錄.其各個取值的含義如下:
值 助記符 說明
1 A IPv4地址。
2 NS 名字伺服器。
5 CNAME 規範名稱。定義主機的正式名字的別名。
6 SOA 開始授權。標記一個區的開始。
11 WKS 熟知服務。定義主機提供的網路服務。12 PTR 指標。把IP地址轉化為域名。
13 HINFO 主機資訊。給出主機使用的硬體和作業系統的表述。
15 MX 郵件交換。把郵件改變路由送到郵件伺服器。
28 AAAA IPv6地址。
252 AXFR 傳送整個區的請求。
255 ANY 對所有記錄的請求。
Class(類):2位元組,IN表示Internet資料,通常為1
下面是截獲的第二個DNS包:
可以看到和第一個請求包相比,響應包多出了一個Answers欄位,同時Flags欄位每一位都有定義.
關注一下Flags中Answer RRs 為4 說明對應的Answers欄位中將會出現4項解析結果.
Answers欄位可以看成一個List,集合中每項為一個資源記錄,除了上面提到過的Name,Type,Class之外,還有Time to
Live,Data length,Addr.
Time to Live(生存時間TTL):表示該資源記錄的生命週期,從取出記錄到抹掉記錄快取的時間,以秒為單位.這裡是0x00 00 00 fd 合計253s.
Data length(資源資料長度):以位元組為單位,這裡的4表示IP地址的長度為4位元組.也就是下面Addr欄位的長度.Addr(資源資料): 返回的IP地址,就是我們想要的結果.
可以發現有4條資源記錄,4個不同的IP地址,說明域名 www.oschina.net 對應有4個IP地址,分別是:
112.124.5.74
219.136.249.194
61.145.122.155
121.9.213.124
CMD中顯示的是第一條IP地址.我試了下直接訪問上面各個地址的80埠(http),
第一個和第二個顯示403 Forbidden
本文簡單介紹了DNS協議理論知識,給出URL解析步驟,詳細講述了DNS報文各個欄位含義,並從Wireshark俘獲分組中選取DNS相關報文進行分析。
一、概述
1.1 DNS
識別主機有兩種方式:主機名、IP地址。前者便於記憶(如www.yahoo.com),但路由器很難處理(主機名長度不定);後者定長、有層次結構,便於路由器處理,但難以記憶。折中的辦法就是建立IP地址與主機名間的對映,這就是域名系統DNS做的工作。DNS通常由其他應用層協議使用(如HTTP、SMTP、FTP),將主機名解析為IP地址,其執行在UDP之上,使用53號埠。
注:DNS除了提供主機名到IP地址轉換外,還提供如下服務:主機別名、郵件伺服器別名、負載分配。
1.2 HTTP使用DNS情形
考慮這樣的操作,在瀏覽器輸入http://www.baidu.com/index.html並回車,首先需要將URL(存放物件的伺服器主機名和物件的路徑名)解析成IP地址,具體步驟為:
(1)同一臺使用者主機上執行著DNS應用的客戶機端(如瀏覽器)
(2)從上述URL抽取主機名www.baidu.com,傳給DNS應用的客戶機端(瀏覽器)
(3)該DNS客戶機向DNS伺服器傳送一個包含主機名的請求(DNS查詢報文)
(4)該DNS客戶機收到一份回答報文(即DNS回答報文),該報文包含該主機名對應的IP地址119.75.218.70
(5)瀏覽器由該IP地址定位的HTTP伺服器傳送一個TCP連結
用Wireshark捕獲的DNS報文如下圖,顯然第一行是DNS查詢報文,第二行是DNS回答報文。
圖1 Wireshark捕獲的DNS報文
二、DNS報文
2.1 DNS報文格式
DNS只有兩種報文:查詢報文、回答報文,兩者有著相同格式,如下:
圖2 DNS報文格式
2.1.1 首部區域
標識數
對該查詢進行標識,該標識會被複制到對應的回答報文中,客戶機用它來匹配發送的請求與接收到的回答。
標誌[1]
圖3 DNS報文首部區域的標誌
QR(1位元):查詢/響應的標誌位,1為響應,0為查詢。
opcode(4位元):定義查詢或響應的型別(若為0則表示是標準的,若為1則是反向的,若為2則是伺服器狀態請求)。
AA(1位元):授權回答的標誌位。該位在響應報文中有效,1表示名字伺服器是許可權伺服器(關於許可權伺服器以後再討論)
TC(1位元):截斷標誌位。1表示響應已超過512位元組並已被截斷(依稀好像記得哪裡提過這個截斷和UDP有關,先記著)
RD(1位元):該位為1表示客戶端希望得到遞歸回答(遞迴以後再討論)
RA(1位元):只能在響應報文中置為1,表示可以得到遞迴響應。
zero(3位元):不說也知道都是0了,保留欄位。
rcode(4位元):返回碼,表示響應的差錯狀態,通常為0和3,各取值含義如下:
0 無差錯
1 格式差錯
2 問題在域名伺服器上
3 域參照問題
4 查詢型別不支援
5 在管理上被禁止
6 -- 15 保留
問題數、回答RR數、權威RR數、附加RR數
這四個欄位都是兩位元組,分別對應下面的查詢問題、回答、授權和附加資訊部分的數量。一般問題數都為1,DNS查詢報文中,資源記錄數、授權資源記錄數和附加資源記錄數都為0[1]。
2.1.2 區域
(1)問題區域
包含正在進行的查詢資訊。包含查詢名(被查詢主機名字的名字欄位)、查詢型別、查詢類。
圖4 DNS報文的問題區域
查詢名
查詢名部分長度不定,一般為要查詢的域名(也會有IP的時候,即反向查詢)。此部分由一個或者多個標示符序列組成,每個標示符以首位元組數的計數值來說明該標示符長度,每個名字以0結束。計數字節數必須是0~63之間。該欄位無需填充位元組。還是借個例子來說明更直觀些,查詢名為gemini.tuc.noao.edu的話,查詢名欄位如下[1]:
圖5 DNS報文問題區別的查詢名
查詢型別
通常查詢型別為A(由名字獲得IP地址)或者PTR(獲得IP地址對應的域名),型別列表如下:
型別 |
助記符 |
說明 |
1 |
A |
IPv4地址 |
2 |
NS |
名字伺服器 |
5 |
CNAME |
規範名稱定義主機的正式名字的別名 |
6 |
SOA |
開始授權標記一個區的開始 |
11 |
WKS |
熟知服務定義主機提供的網路服務 |
12 |
PTR |
指標把IP地址轉化為域名 |
13 |
HINFO |
主機資訊給出主機使用的硬體和作業系統的表述 |
15 |
MX |
郵件交換把郵件改變路由送到郵件伺服器 |
28 |
AAAA |
IPv6地址 |
252 |
AXFR |
傳送整個區的請求 |
255 |
ANY |
對所有記錄的請求 |
NS記錄指定了名字伺服器。一般情況,每個DNS資料庫中,針對每個頂級域都會有一條NS記錄,這樣一來,電子郵件就可以被髮送到域名樹中遠處的部分。
查詢類
通常為1,指Internet資料。
(2)回答、權威、附加區域
回答區域包含了最初請求名字的資源記錄,一個回答報文的回答區域可以包含多條資料記錄RR(因為一個主機名可以對應多個IP地址,冗餘Web伺服器)。權威區域包含了其他權威DNS伺服器的記錄。附加區域包含其他一些"有幫助"的記錄,例如,對於一個MX(郵件交換)請求的回答報文中,回答區域包含一條資料記錄(該記錄提供郵件伺服器的規範主機名),附加區域可以包含一條型別A記錄(該記錄提供了該郵件伺服器的規範主機名的IP地址)。
每條資料記錄是一個五元組,如下:
(域名,生存期,類別,型別,值)
直接表示如下[1]:
圖6 DNS報文的資源記錄
域名(2位元組或不定長)
記錄中資源資料對應的名字,它的格式和查詢名欄位格式相同。當報文中域名重複出現時,就需要使用2位元組的偏移指標來替換。例如,在資源記錄中,域名通常是查詢問題部分的域名的重複,就需要用指標指向查詢問題部分的域名。關於指標怎麼用,TCP/IP詳解裡面有,即2位元組的指標,最前面的兩個高位是11,用於識別指標。其他14位從報文開始處計數(從0開始),指出該報文中的相應位元組數。注意,DNS報文的第一個位元組是位元組0,第二個報文是位元組1。一般響應報文中,資源部分的域名都是指標C00C(1100000000001100,12正好是首部區域的長度),剛好指向請求部分的域名[1]。
型別(記錄的型別,見表1)
A記錄,Name是主機名,Value是該主機名的IP地址,因此,一條型別為A的資源記錄提供了標準的主機名到IP地址的對映。
NS記錄,Name是域(如foo.com),Value是知道如何獲得該域中主機IP地址的權威DNS伺服器的主機名(如dns.foo.com),這個記錄常用於沿著查詢鏈進一步路由DNS查詢。
CNAME記錄,Name是主機別名,Value是主機別名對應的規範主機名,該記錄能夠向請求主機提供一個主機名對應的規範主機名。
MX記錄,Name是郵件伺服器別名,Value是郵件伺服器別名的規範主機名。通過MX記錄,一個公司的郵件伺服器和其他伺服器可以使用相同的別名。
注:有著複雜主機名的主機能擁有多個別名,前者稱為規範主機名,後者稱為主機別名(便於記憶)。
類
對於Internet資訊,它總是IN。
生存時間
用於指示該記錄的穩定程度,極為穩定的資訊會被分配一個很大的值(如86400,一天的秒數)。該欄位表示資源記錄的生命週期(以秒為單位),一般用於當地址解析程式取出資源記錄後決定儲存及使用快取資料的時間[1]。
資源資料長度(2位元組)
表示資源資料的長度(以位元組為單位,如果資源資料為IP則為0004)。
資源資料
該欄位是可變長欄位,表示按查詢段要求返回的相關資源記錄的資料。
2.2 DNS查詢報文例項
以www.baidu.com為例,用Wireshark俘獲分組,結合2.1的理論內容,很容易看明白的,DNS請求報文如下:
圖7 DNS請求報文示例
2.3 DNS回答報文例項
圖8 DNS回答報文示例
第三個和第四個顯示404 Not Found
還有每個地址哦Server都不一樣oscali,oscdb,liubc,ep2,第一個像阿里雲伺服器,第二個看起來像資料庫的伺服器,其他就不知道了...
Web伺服器貌似是Tengine,