DNS工作原理講解
DNS請求/應答報文詳解
DNS是一套分布式的域名服務系統。每個DNS服務器中都存放著大量的域名與IP地址之間的映射,並且是動態更新的。眾多網絡客戶端程序是通過DNS協議去域名服務器中查詢目標IP地址的。DNS查詢與應答報文格式如下圖所示:
0 15 16 31
16位標識位(ID) | 16位標誌位 |
16位請求記錄數目 | 16位應答記錄數目 |
16位授權記錄數目 | 16位額外記錄數目 |
32位查詢記錄信息 | |
應答記錄信息(長度可變) | |
授權記錄信息(長度可變) | |
額外記錄信息(長度可變) |
16位標識字段是用來標記一對查詢/應答報文的,通過查詢該字段來確定返回的應答報文是由哪一個查詢報文發出的。
16位標誌字段是用來協商通信方式和返回通信狀態的,DNS頭部報文標識字段的具體細節如下圖所示:
QR | opcode | AA | TC | RD | RA | zero | rcode |
1位 | 4位 | 1位 | 1位 | 1位 | 1位 | 3位 | 4位 |
各個標識符的含義分別是:
QR:查詢/應答標識,0標識查詢,1標識應答。
opcode:定義查詢和應答的類型。0標識標準查詢,1標識反向查詢(根據IP地址查詢域名),2標識請求服務器狀態。
AA:授權服務器應答標識。1標識域名服務器是授權服務器。
TC:截斷標識,僅當DNS報文使用UDP服務時使用。因為UDP數據包有長度限制,當長度過長時會被截斷。1標識DNS報文長度超過512字節,並被截斷。
RD:遞歸查詢標識。1標識執行遞歸查詢,即DNS服務器無法解析某一個主機名,則它向其它DNS服務器繼續查詢,如此反復,直到它解析到目標主機名並返回給客戶端。0標識叠代查詢,即DNS服務器無法解析目標主機時,它將查詢到的其它DNS服務器的IP地址返回給客戶端,供客戶端進行參考。
RA:允許遞歸標識。此字段在應答字段中使用,1標識DNS服務器支持遞歸查詢。
zero:默認為0,屬於保留字段。
rcode:4位返回碼,標識應答狀態。常用值有0(無錯誤)和3(域名不存在)
接下來的四個字段分別指出了DNS報文最後四個字段的資源記錄數目。對查詢報文而言,它一般包含一個查詢問題,而應答記錄數目、授權記錄數目、額外記錄數目為0.對於應答報文而言,應答記錄數目至少是1,而授權記錄數目和額外記錄數目可為0或非0.
查詢問題格式如下:
0 15 16 31
查詢名 | |
16位查詢類型 | 16位查詢類 |
類型A:值是1,表示獲取目標主機的IP地址。
類型CNAME:值是5,表示獲取目標主機的別名。
類型PTR:值是12,表示反向查詢。
16位查詢類通常是1,表示獲取因特網地址(IP地址)
應答字段、授權字段、額外字段都采用了資源記錄格式。資源記錄格式如下所示:
0 15 16 31
32位域名 16位類型 16位類 32位生存時間 16位資源記錄數據長度 資源數據 資源數據 表中的32位域名是該記錄中與資源對應的名字,其格式與查詢記錄中的查詢域名所對應的格式一樣。16位類型和16位類與DNS中查詢記錄中對應的字段格式一樣。
32位生存時間表示該查詢記錄結果可被客戶端緩存多久,單位:秒。
16位資源記錄數據長度和資源數據字段的內容取決於類型字段。對於A類型而言,資源數據是32位IPV4地址,而資源記錄長度為4(單位:字節)。
至此,我們簡要地介紹了DNS協議,接下來我們以具體例子來看DNS協議。
2. Linux下訪問DNS服務
我們要訪問DNS服務,就必須要先知道DNS服務器的IP地址。Linux使用/etc/resolv.conf文件來存放DNS服務器的IP地址。在Ubuntu上,該文件的內容如下:
第一個IP地址代表DNS服務器地址。
Linux下一個常用的訪問DNS服務器的客戶端程序是host,比如下面的命令是向著DNS服務器127.0.0.1查詢機器www.baidu.com的IP地址:
host命令的輸出告訴我們,機器名www.baidu.com是www.a.shifen.com的別名,並且該別名對應著兩個IP地址。host命令使用DNS協議和DNS服務器通信,其-t選項告訴DNS協議使用哪種查詢類型。我們這裏使用的是A類型,即通過機器的域名獲取其IP地址(但實際返回資源中還包含著機器的別名)。關於host命令的詳細使用方法,請參考man手冊。
3.使用TCPDUMP觀察DNS通信過程
為了看清楚DNS通信過程,下面我們將從Ubuntu上面運行host命令一查詢主機www.baidu.com對應的IP地址,並使用tcpdump抓取這一過程中LAN上傳輸的以太網幀的數據包,具體操作如下:
這一次執行tcpdump抓包時,我們使用“port domain”來過濾數據包,表示只抓取domain域名服務的數據包,即DNS查詢和應答報文,tcpdump的輸出如下:
這兩個數據包開始的“IP”指出,他們後面描述的內容是IP數據報。tcpdump以“IP地址:端口號”的形式來描述通信的某一端:以“>”表示數據傳輸方向,“>”前面是源端,後面是目的端。第一個數據包是測試機器Ubuntu(IP地址是192.168.48.2.53)發送的DNS查詢報文(目標端口53是DNS服務器使用的端口,這一點我們在前面介紹過),第二個數據包是服務器反饋的DNS應答報文。
DNS工作原理講解