1. 程式人生 > >DNS工作原理講解

DNS工作原理講解

發出 -s pro lan lsp 程序 1.5 靜態文件 額外

我們通常使用域名來訪問目標機器,而不是直接使用其IP地址,那麽域名與IP地址之間存在什麽樣子的轉化關系呢?想要了解他們之間的轉化關系,我們不得不提域名查詢服務。域名查詢服務具有很多種實現方式,例如:NIS(Network Information Service,網絡信息服務)、DNS和本地靜態文件等。本次主要講解DNS。

  1. DNS請求/應答報文詳解

DNS是一套分布式的域名服務系統。每個DNS服務器中都存放著大量的域名與IP地址之間的映射,並且是動態更新的。眾多網絡客戶端程序是通過DNS協議去域名服務器中查詢目標IP地址的。DNS查詢與應答報文格式如下圖所示:

0 15 16 31

16位標識位(ID)
16位標誌位
16位請求記錄數目16位應答記錄數目
16位授權記錄數目16位額外記錄數目
32位查詢記錄信息
應答記錄信息(長度可變)
授權記錄信息(長度可變)
額外記錄信息(長度可變)

16位標識字段是用來標記一對查詢/應答報文的,通過查詢該字段來確定返回的應答報文是由哪一個查詢報文發出的。

16位標誌字段是用來協商通信方式和返回通信狀態的,DNS頭部報文標識字段的具體細節如下圖所示:

QRopcode
AA
TCRD
RAzero
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位查詢類
查詢名以一定的格式封裝了要查詢的主機域名。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工作原理講解