防火墻ALG技術之DNS協議穿墻術
時光飛逝,轉眼間2021年已過大半,我們的“防火墻ALG技術”系列文章也已經更新到了第四期,之前推送的《防火墻ALG技術之安全策略》 《防火墻ALG技術之FTP協議穿墻術》 《防火墻ALG技術之TFTP協議穿墻術》 可點擊鏈接進行閱讀。本期介紹DNS協議穿越防火墻NAT,淺談個人理解與認知。
DNS協議學習
DNS協議簡介
DNS(Domain Name System,域名系統)是一個應用層協議,DNS 的作用是將人類可讀的域名(如:www.winicssec.com) 轉換為機器可讀的 IP 地址(如:123.56.238.105)。當前,對于每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符。DNS協議建立在UDP或TCP協議之上,默認使用 53號端口。客戶端默認通過 UDP 協議進行通信,但是由于廣域網中不適合傳輸過大的 UDP 數據包,因此規定當報文長度超過了512字節時,應轉換為使用 TCP 協議進行數據傳輸。此時可能會出現如下的兩種情況:
- 客戶端認為UDP響應包長度可能超過512字節,主動使用TCP協議;
- 客戶端使用UDP協議發送DNS請求,服務端發現響應報文超過了 512 字節, 在截斷的 U DP響應報文中將TC設置為1,以通知客戶端該報文已經被截斷,客戶端收到之后再發起一次 TC P 請 求( 該特性通常也被安全廠商作為 一種有效防御DNS Query Flood攻擊的手段)。
DNS服務類型
DNS服務器按照配置和實現功能的不同,包括多種不同的類型。
(1)授權型 DNS
一種授權型DNS服務提供一種更新機制,供開發人員用于管理其公用 DNS 名稱。然后,它響應DNS查詢,將域名轉換為IP地址,以便計算機可以相互通信。授權型DNS對域有最終授權且負責提供遞歸型DNS服務器對IP地址信息的響應。
(2)遞歸型 DNS
客戶端通常不會對授權型DNS服務直接進行查詢。而是通常連接到稱為解析程序的其他類型DNS服務,或遞歸型DNS服務。遞歸型DNS服務就像是旅館的門童:盡管沒有任何自身的DNS記錄,但是可充當您獲得DNS信息的中間程序。如果遞歸型DNS擁有已緩存或存儲一段時間的DNS參考,那么它會通過提供源或IP信息來響應DNS查詢。如果沒有,則它會將查詢傳遞到一個或多個授權型 DNS 服務器以查找信息。
DNS記錄類型
DNS中,常見的資源記錄類型有:
- A記錄(地址) ─ 指定域名對應的 IPv4 地址記錄。
- AAAA記錄(地址) ─ 指定域名對應的 IPv6 地址記錄。
- NS記錄(域名服務) ─ 指定解析域名或子域名的DNS服務器。
- MX記錄(郵件交換) ─ 指定接收信息的郵件服務器。
- CNAME(規范)─ 一個域名映射到另一個域名或 CNAME 記錄(www.winicssec.com指向 www.wnt.com )或映射到一個 A記錄。
- PTR記錄(反向記錄) ─ PTR 記錄用于定義與 IP 地址相關聯的名稱。PTR 記錄是 A 或 AAAA 記錄的逆。PTR 記錄是唯一的,因為它們以 .arpa 根開始并被委派給 IP 地址的所有者。
DNS工作流程
在瀏覽器中輸入www.winicssec.com域名,操作系統會先檢查自己本地的hosts文件是否有這個域名映射關系。如果有這個域名的映射,就先調用這個IP地址映射,完成域名解析;如果沒有這個域名的映射,則查找本地DNS緩存,是否有這個域名映射關系,如果有,直接返回,完成域名解析。
如果hosts與本地DNS緩存都沒有相應的域名映射關系,首先會找網絡配置參數中設置的首選DNS服務器(記為A-DNS服務器),此服務器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具有權威性。
如果要查詢的域名,不由A-DNS服務器區域解析,但該服務器已緩存了此網址映射關系,則調用這個IP地址映射,完成域名解析,此解析不具有權威性。
如果A-DNS服務器本地區域文件與緩存解析都失效,則根據A-DNS服務器的設置(是否設置轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至根DNS服務器(記為B-DNS服務器),B-DNS服務器收到請求后會判斷這個域名(.com)是誰來授權管理,并會返回一個負責該頂級域名服務器的一個IP。A-DNS服務器收到IP信息后,將會聯系負責.com域的這臺服務器(記為C-DNS服務器)。C-DNS服務器收到請求后,如果自己無法解析,它就會找一個管理.com域的下一級DNS服務器地址(記為D-DNS服務器)給A-DNS服務器。當A-DNS服務器收到這個地址后,就會找D-DNS服務器,重復上面的動作,進行查詢,直至找到www.winicssec.com主機。
如果用的是轉發模式,A-DNS服務器就會把請求轉發至上一級DNS服務器(記為E-DNS服務器),由E-DNS服務器進行解析;如果E-DNS服務器如果不能解析,那么會繼續找根DNS或把轉請求轉至上上級,以此循環。
DNS報文分析
DNS 分為查詢請求和查詢響應,請求和響應的報文結構基本相同。DNS 報文格式如表1-1所示:
表1-1 DNS報文格式

基礎結構部分:DNS 報文的基礎結構部分指的是報文首部,每個字段含義:上表中顯示了 DNS 的報文格式。其中,事務ID、標志、問題計數、回答資源記錄數、權威名稱服務器計數、附加資源記錄數這6個字段是DNS的報文首部,共12個字節。整個DNS 格式主要分為3部分內容,即基礎結構部分、問題部分、資源記錄部分,下面將詳細地介紹每部分的內容及含義:
- 事務 ID:DNS 報文的 ID 標識。對于請求報文和其對應的應答報文,該字段的值是相同的。通過它可以區分 DNS 應答報文是對哪個請求進行響應的。
- 標志:DNS 報文中的標志字段。
- 問題計數:DNS 查詢請求的數目。
- 回答資源記錄數:DNS 響應的數目。
- 權威名稱服務器計數:權威名稱服務器的數目。
- 附加資源記錄數:額外的記錄數目(權威名稱服務器對應 IP 地址的數目)。
問題部分:問題部分指的是報文格式中查詢問題區域(Queries)部分。該部分是用來顯示 DNS 查詢請求的問題,通常只有一個問題。該部分包含正在進行的查詢信息,包含查詢名(被查詢主機名字)、查詢類型、查詢類。
資源記錄部分:資源記錄部分是指 DNS 報文格式中的最后三個字段,包括回答問題區域字段、權威名稱服務器區域字段、附加信息區域字段。
如圖1-1所示,DNS請求報文,問題計數為1、域名為www.baidu.com。

圖1-1 DNS請求報文
如圖1-2-(a) 所示,DNS響應報文,可以看出問題計數為1、也就是對應的請求報文中的問題,而回答計數為3個。

圖1-2-(a) DNS響應報文
分析Answers字段,如圖1-2-(b)所示:其中type A記錄是在穿越防火墻NAT網關時需要重點關注內容。

1-2-(b) DNS響應報文-Answers
分析Authoritative nameservers字段,如圖1-2-(c)所示:

1-2-(c) DNS響應報文-Authoritative
分析Additional records字段,如圖1-2-(d)所示:

1-2-(d) DNS響應報文-Additional
DNS協議穿越SNAT
DNS協議穿越SNAT使用場景為私網的用戶訪問公網上的DNS服務器進行A查詢,根據DNS域名獲得內部服務器的私網IP地址。如圖2-1所示,Client A/B/C是DMZ區域內的主機,它們的域名在全網內是唯一的,但它們的地址是內部私有地址,其公網地址注冊到 Internet 上的DNS服務器上。如果trust區域內的User想用DNS域名訪問DMZ內部主機,它必須通過Internet 上的DNS服務器查詢內部服務器的域名以獲得其IP地址,但這個IP地址是公網地址,需要由DNS NAT應用級網關將其轉換為私網地址,這樣私網用戶就可以在私網內通過域名方式直接訪問內部服務器了。

圖2-1 DNS服務器位于公網外部
如圖2-2-(a)、2-2-(b)、2-2-(c)所示,為私網客戶端通過域名方式訪問私網WEB服務器過程中的抓包示例,其重點在于公網DNS服務器的響應報文中A記錄“123.56.238.105”在經過NAT后轉換為“192.168.13.2”。

圖2-2-(a) SNAT時DNS穿墻-Client

圖2-2-(b) SNAT時DNS穿墻-DNS-Server

圖2-2-(c) SNAT時DNS穿墻-WEB-Server
DNS協議穿越DNAT
DNS協議穿越DNAT使用場景為公網的用戶訪問私網上的DNS服務器進行A查詢,根據DNS名獲得內部服務器的公網IP地址。如圖3-1所示,Client A/B/C是DMZ區域內的主機,它們的域名在全網內是唯一的,但它們的地址是內部私有地址,只有在內部的DNS服務器上才有其域名和IP地址對應的信息。如果外部主機想訪問DMZ區內的服務器,它必須通過內部DNS服務器查詢內部主機域名以獲得其IP地址,但這個IP地址是私有地址,需要由DNS NAT應用級網關將其轉換為公有地址,這樣外部主機可以通過域名訪問到內部服務器。DNS NAT應用級網關僅對DMZ區域內的內部服務器的進行地址轉換。

圖3-1 DNS服務器位于私網內部
附件—DNS協議穿墻抓包
- 01_SNAT時DNS穿墻-WEB.pcap
- 02_SNAT時DNS穿墻-DNS-Server.pcap
- 03_SNAT時DNS穿墻-WEB-Server.pcap