使用tcpdump觀察DNS通訊過程

readyao發表於2016-01-14

1. DNS簡介:

我們通常使用機器的域名來訪問這臺機器,而不直接使用其IP地址,比如訪問因特網上的各種網站。那麼如何將機器的域名轉換成IP地址呢?這就需要使用域名查詢服務。域名查詢服務有很多種實現方式,比如NIS(Network Information Service,網路資訊服務)、DNS和本地靜態檔案等。主要討論DNS。


DNS是一套分散式的域名服務系統。每個DNS伺服器上都存放著大量的機器名和IP地址的對映,並且是動態更新的。眾多網路客戶端程式都使用DNS協議來向DNS伺服器查詢目標主機的IP地址。

Linux使用/etc/resolv.conf檔案來存放DNS伺服器的IP地址。


2. host程式的使用:

Linux下一個常用的訪問DNS伺服器的客戶端程式是host,比如下面的命令是向首選DNS伺服器查詢機器www.baidu.com的IP地址:


host命令的輸出告訴我們,機器名www.baidu.com是www.a.shifen.com.的別名,並且該機器名對應兩個IP地址。host命令使用DNS協議和DNS伺服器通訊,其-t選項告訴DNS協議使用哪種查詢型別。我們這裡使用的是A型別,即通過機器的域名獲得其IP地址(但實際上返回的資源記錄中還包含機器的別名)。


3. tcpdump監聽資料

為了看清楚DNS通訊的過程,下面我們將從主機1:192.168.0.141上執行host命令以查詢主機www.jd.com對應的IP地址,並使用tcpdump抓取這一過程中LAN上傳輸的乙太網幀。
具體的操作過程如下:

# tcpdump-i eth0-nt-s 500 port domain

然後在另外一個終端中輸入下面的命令:

#host-t A www.jd.com


下圖是host-t A www.jd.com輸出的資料:



下圖是tcpdump監聽到的資料:



其中IP地址192.168.0.1是預設閘道器的地址。


root@linux_ever:~# route
核心 IP 路由表
目標            閘道器            子網掩碼        標誌  躍點   引用  使用 介面
default         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
192.168.0.0     *               255.255.255.0   U     1      0        0 eth0

4. 對資料進行分析

這一次執行tcpdump抓包時,我們使用“port domain”來過濾資料包,表示只抓取使用domain(域名)服務的資料包,即DNS查詢和應答報文。tcpdump的輸出如下:

IP 192.168.0.141.53511 > 192.168.0.1.53: 65362+ A? www.jd.com. (28)
IP 192.168.0.1.53 > 192.168.0.141.53511: 65362 2/0/0 CNAME www.jdcdn.com., A 14.152.71.1 (68)
這兩個資料包開始的“IP”指出,它們後面的內容描述的是IP資料包。tcpdump以“IP地址.埠號”的形式來描述通訊的某一端;以“>”表示資料傳輸的方向,“>”前面是源端,後面是目的端。可見,第一個資料包是測試主機1(IP地址是192.168.0.141)向其首選DNS伺服器(IP地址是192.168.0.1.53)傳送的DNS查詢報文(目標埠53是DNS服務使用的埠),第二個資料包是伺服器反饋的DNS應答報文。

相關文章