1. 程式人生 > >DNS資料包格式及內容詳解

DNS資料包格式及內容詳解

1 域名解析過程

域名解析總體可分為兩大步驟,第一個步驟是本機向本地域名伺服器發出一個DNS請求報文,報文裡攜帶需要查詢的域名;第二個步驟是本地域名伺服器向本機迴應一個DNS響應報文,裡面包含域名對應的IP地址或者別名等。從下面對jocent.me進行域名解析的報文中可明顯看出這兩大步驟。注意:第一個步驟從主機到本地域名伺服器是遞迴查詢;第二大步驟中採用的是迭代查詢,其實是包含了很多小步驟的,詳情見下面的流程分析(本地伺服器向根域名伺服器,頂級域名伺服器,二級域名伺服器,許可權域名伺服器(一般由公司企業提供解析)等DNS迭代查詢)。

其具體的流程可描述如下:

  1. 主機10.74.36.90先向本地域名伺服器10.74.1.11進行遞迴查詢
  2. 本地域名伺服器採用迭代查詢,向一個根域名伺服器進行查詢
  3. 根域名伺服器告訴本地域名伺服器,下一次應該查詢的頂級域名伺服器 dns.me的IP地址
  4. 本地域名伺服器向頂級域名伺服器 dns.me進行查詢
  5. 頂級域名伺服器me告訴本地域名伺服器,下一步查詢許可權伺服器dns.jocent.me 的IP地址
  6. 本地域名伺服器向許可權伺服器 dns.jocent.me進行查詢
  7. 許可權伺服器 dns.jocent.me告訴本地域名伺服器所查詢的主機的IP地址
  8. 本地域名伺服器最後把查詢結果告訴 10.74.36.90

其中有兩個概念遞迴查詢和迭代查詢,其實在整個描述的過程中已經體現的很明顯,這裡再說明一下:

  • 遞迴查詢:本機向本地域名伺服器發出一次查詢請求,就靜待最終的結果。如果本地域名伺服器無法解析,自己會以DNS客戶機的身份向其它域名伺服器查詢,直到得到最終的IP地址告訴本機
  • 迭代查詢:本地域名伺服器向根域名伺服器查詢,根域名伺服器告訴它下一步到哪裡去查詢,然後它再去查,每次它都是以客戶機的身份去各個伺服器查詢

2 DNS資料包格式

è¿éåå¾çæè¿°

2.1 頭部

  1. 會話標識ID(2位元組):是DNS報文的ID標識,對於請求報文和其對應的應答報文,這個欄位是相同的,通過它可以區分DNS應答報文是哪個請求的響應。用於劃分DNS流(一個請求對應一個響應)。
  2. 標誌(2位元組):
    QR(1bit) 查詢/響應標誌,0為查詢,1為響應 Response: Message is a response
    opcode(4bit)

    4個位元位用來設定查詢的種類,應答的時候會帶相同值,

    0 標準查詢 (QUERY)

    1 反向查詢 (IQUERY)

    2 伺服器狀態查詢 (STATUS)

    3-15 保留值,暫時未使用

    Opcode: Standard query (0)
    AA(1bit)

    表示授權應答 Authoritative Answer 

    應答的時候有意義,指出給出應答的伺服器是查詢域名的授權解析伺服器。注意因為別名的存在,應答可能存在多個主域名,這個AA位對應請求名,或者應答中的第一個主域名。

    1標識域名伺服器是授權伺服器。

    Authoritative: Server is not an authority for domain
    TC(1bit)

    表示截斷 TrunCation

    用來指出報文比允許的長度還要長,導致被截斷。僅當DNS報文使用UDP服務時使用。因為UDP資料包有長度限制,當長度過長時會被截斷。

    1標識DNS報文長度超過512位元組,並被截斷。

    Truncated: Message is not truncated
    RD(1bit)

    表示期望遞迴 Recursion Desired

    這個位元位被請求設定,應答的時候使用的相同的值返回。如果設定了RD,就建議域名伺服器進行遞迴解析,遞迴查詢的支援是可選的。

    1標識執行遞迴查詢,即DNS伺服器無法解析某一個主機名,則它向其它DNS伺服器繼續查詢,如此反覆,直到它解析到目標主機名並返回給客戶端。0標識迭代查詢,即DNS伺服器無法解析目標主機時,它將查詢到的其它DNS伺服器的IP地址返回給客戶端,供客戶端進行參考。

    Recursion desired: Don't do query recursively
    RA(1bit)

    表示支援遞迴 Recursion Available

    這個位元位在應答中設定或取消,用來代表伺服器是否支援遞迴查詢。允許遞迴標識。此欄位在應答欄位中使用,1標識DNS伺服器支援遞迴查詢。

    Recursion available: Server can't do recursive queries
      保留欄位,暫時未使用。在所有的請求和應答報文中必須置為0。 Z: reserved (0)
      應答認證:應答/許可權部分未由伺服器進行認證 Answer authenticated: Answer/authority portion was not authenticated by the server
      未經認證的資料:不可接受 Non-authenticated data: Unacceptable
    rcode(4bit)

    應答碼(Response code) - 這4個位元位在應答報文中設定,代表的含義如下:

    0 沒有差錯。

    1 報文格式錯誤(Format error) - 伺服器不能理解請求的報文。

    2 伺服器失敗(Server failure) - 因為伺服器的原因導致沒辦法處理這個請求。

    3 名字差錯(Name Error) - 只有對授權域名解析伺服器有意義,指出解析的域名不存在。

    4 沒有實現(Not Implemented) - 域名伺服器不支援查詢型別。

    5 拒絕(Refused) - 伺服器由於設定的策略拒絕給出應答。比如,伺服器不希望對某些請求者給出應答,或者伺服器不希望進行某些操作(比如區域傳送zone transfer)。

    6-15 保留值,暫時未使用。

    Reply code: No error (0)
  3. 數量欄位(總共8位元組):Questions、Answer RRs、Authority RRs、Additional RRs 各自表示後面的四個區域的數目。Questions表示查詢問題區域節的數量,Answers表示回答區域的數量,Authoritative namesversers表示授權區域的數量,Additional recoreds表示附加區域的數量。

問題數QDCOUNT 無符號16位整數表示報文請求段中的問題記錄數。

資源記錄數ANCOUNT 無符號16位整數表示報文回答段中的回答記錄數。

授權資源記錄數NSCOUNT 無符號16位整數表示報文授權段中的授權記錄數。

額外資源記錄數ARCOUNT 無符號16位整數表示報文附加段中的附加記錄數。
 

2.2 正文

2.2.1 Queries區域

(1)查詢名 QNAME 要查詢的名字,是一個或多個識別符號的序列,長度不固定,且不使用填充位元組,一般該欄位表示的就是需要查詢的域名(如果是反向查詢,則為IP,反向查詢即由IP地址反查域名)。每個識別符號以首位元組的計數值來說明隨後識別符號的位元組長度,每個名字以最後位元組為0結束,長度為0的識別符號是根識別符號。單個識別符號最大長度為63位元組。一般的格式如下圖所示。

(2)查詢型別 QTYPE 每個問題有一個查詢型別。2個位元組表示查詢型別,取值可以為任何可用的型別值,以及通配碼*來表示所有的資源記錄。

型別 助記符 說明
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 對所有記錄的請求

其他QTYPE型別有

MD 3 a mail destination (Obsolete - use MX)

MF 4 a mail forwarder (Obsolete - use MX)

SOA 6 marks the start of a zone of authority

MB 7 a mailbox domain name (EXPERIMENTAL)

MG 8 a mail group member (EXPERIMENTAL)

MR 9 a mail rename domain name (EXPERIMENTAL)

NULL 10 a null RR (EXPERIMENTAL)

WKS 11 a well known service description

MINFO 14 mailbox or mail list information

TXT 16 text strings (常用夾帶其他資料比如C&C和檔案,用於建立隧道)

查詢型別出現在問題欄位中,查詢型別是型別的一個超集,所有的型別都是可用的查詢型別

AXFR 252 A request for a transfer of an entire zone

MAILB 253 A request for mailbox-related records (MB, MG or MR)

MAILA 254 A request for mail agent RRs (Obsolete - see MX)

255 A request for all records

這裡給一個域名,可用來模擬DNS的查詢型別,可以選擇不同的型別,比如A,PTR等玩一下, https://www.nslookuptool.com/chs/       
(3)查詢類:通常為1,表示IN,表明是Internet資料。

IN (1) 指網際網路地址。

CS 2 the CSNET class (Obsolete - used only for examples in some obsolete RFCs)

CH 3 the CHAOS class

HS 4 Hesiod [Dyer 87]

查詢類是類的一個超集

* 255 any class

2.2.2 資源記錄(RR)區域(包括回答區域,授權區域和附加區域)

該區域有三個,但格式都是一樣的。這三個區域分別是:回答區域,授權區域和附加區域

(1) 域名NAME(2位元組或不定長):它的格式和Queries區域的查詢名字欄位是一樣的。有一點不同就是,當報文中域名重複出現的時候,該欄位使用2個位元組的偏移指標來表示。比如,在資源記錄中,域名通常是查詢問題部分的域名的重複,因此用2位元組的指標來表示,具體格式是最前面的兩個高位是 11,用於識別指標。其餘的14位從DNS報文的開始處計數(從0開始),指出該報文中的相應位元組數。一個典型的例子,C00C(1100000000001100,12正好是頭部的長度,其正好指向Queries區域的查詢名字欄位)。

(2) 查詢型別TYPE 表明資源紀錄的型別,見2.2.1節的查詢型別表格所示指出RDATA資料的含義

(3)查詢類CLASS 對於Internet資訊,總是1,代表IN。表示RDATA的類

(4)生存時間(TTL):4位元組無符號整數表示資源記錄可以快取的時間。以秒為單位,表示的是資源記錄的生命週期,一般用於當地址解析程式取出資源記錄後決定儲存及使用快取資料的時間,它同時也可以表明該資源記錄的穩定程度,極為穩定的資訊會被分配一個很大的值(比如86400,這是一天的秒數)。0代表只能被傳輸,但是不能被快取。

(5) 資源資料長度:URDLENGT**H 2個位元組無符號整數表示RDATA的長度

(6)資源資料 RDATA  該欄位是一個可變長欄位,不定長字串來表示記錄,格式與TYPE和CLASS有關。比如,TYPE是A,CLASS 是 IN,那麼RDATA就是一個4個位元組的ARPA網路地址。表示按照查詢段的要求返回的相關資源記錄的資料。可以是Address(表明查詢報文想要的迴應是一個IP地址)或者CNAME(表明查詢報文想要的迴應是一個規範主機名)等。

 

注意:

為了減小報文,域名系統使用一種壓縮方法來消除報文中域名的重複。使用這種方法,後面重複出現的域名或者labels被替換為指向之前出現位置的指標。優點:節約了空間,降低報文的容量;避免資料包截斷;保證了資料的一致性。缺點:但是需要所有的程式都應該能夠理解收到的報文中包含的指標。

以上截斷概念重申:

僅當DNS報文使用UDP服務時使用截斷標識和功能。因為UDP資料報有長度限制,所以過長的DNS報文將被截斷。1表示DNS報文超過512位元組,並被截斷。當然基於TCP的DNS資料包不存在此問題。