DNS協議
- 一、DNS協議介紹
- 二、DNS協議基礎
- 1. DNS樹狀結構層次
- 2. DNS的報文格式
- 三、高速快取
- 四、DNS工具:host
- 五、DNS PTR記錄
- 六、遞回查詢與迭代查詢
- 七、Wireshark抓DNS包驗證報文結構
一、DNS協議介紹
域名系統(DNS)是一種用于TCP/IP應用程式的分布式資料庫,該資料庫提供主機名字 - IP地址之間的映射關系
- 分布式含義:單個站點不能擁有所有的資訊,每個站點保留它自己的資訊資料庫,并運行一個服務器程式以提供 Internet 上的其他系統查詢
對DNS的訪問是通過一個地址決議器(resolver)來完成的,在Unix主機中,該決議器主要通過兩個庫函式來訪問的,分別是gethostbyname和gethostbyaddr
- gethostbyname:通過主機名字來獲取IP地址
- gethostbyaddr:通過IP地址來獲取主機名字
DNS的決議器是應用程式的一部分,而TCP/IP協議是作業系統的內核的一部分,所以TCP/IP對應DNS的存在是不知曉的
二、DNS協議基礎
1. DNS樹狀結構層次
DNS的命名空間類似一顆樹,樹中的每個結點有一個最長63字符長的標識,樹根是沒有任何標識的特殊結點,命名不區分大小寫

頂級域名分為三部分:
- arpa是一個4字符長的用于
IP地址到主機名稱轉換的特殊域名 - 7個3字符長的普通域名(組織域名)
- 所有2字符長的均是國家域名
普通域及其解釋
| 域名 | 描述 |
|---|---|
| com | 商業組織(commercial) |
| edu | 教育機構(education) |
| gov | 其他美國政府部門(government) |
| int | 國際組織(international) |
| mil | 美國軍事網點(military) |
| net | 網路(network) |
| org | 其他組織(organization) |
2. DNS的報文格式
DNS定義了一個用于查詢和回應的報文格式,如下圖所示:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-23fEPFQe-1628419061465)(https://raw.githubusercontent.com/gongruiyang/BlogImage/main/image-20210808141125559.png)]
這個報文由12個位元組的首部和4個長度可變的欄位組成
標識欄位由客戶程式設定并由服務器回傳結果,客戶程式通過該欄位來確定回應與查詢是否匹配
標識欄位具體組成及解釋如下:

標識欄位共 16 位(2位元組),從左向右依次介紹如下
QR:占1位,該位為0表示是查詢報文,該位為1表示是回應報文opcode:占4位,全是0表示標準查詢,全是1表示反向查詢,全是2表示服務器狀態請求AA:占1位,如果是1表示授權回答,表示該應答是否來自該域的權威服務器TC:占1位,如果是1表示可截斷的,即使用UDP時,它表示當應答總長度超過512位元組時,只回傳前512位元組資料RD:占1位,如果是1表示期望遞回,可在查詢中設定,并在回應中回傳,該位設定為1表示使用遞回查詢,該位設定為0表示使用迭代查詢RA:占1位,如果是1表示可用遞回,如果名字服務器支持遞回查詢,可在回應中將該位元位置為1zero:占3位,全部必須設定為0,作為保留位rcode:占4位,表示回傳碼欄位,值為0表示查詢的名字沒有差錯,值為3表示查詢的結果有名字差錯(域名不存在)
對于查詢報文,查詢問題欄位中的條目至少是1條,其他三個可變長度欄位均為0
對于應答報文,回答欄位中的條目至少是1條,剩下兩個可變長度欄位均為0或非0
DNS查詢報文中查詢問題欄位部分圖解:

查詢名:待轉換的域名,由一個或多個識別符號組成的序列,每個識別符號以首位元組的計數值來說明隨后的識別符號的位元組長度,每個名字最后位元組以0結束,舉例如圖所示:

查詢型別:每個問題有一個查詢型別,每個回應也有一個查詢型別,約有20個不同的型別值,最常用的查詢型別為A型別,其數值為1,表示期望獲得查詢名字的IP地址,即域名到IP之間的轉換
查詢類:通常是1,指互聯網地址
DNS回應報文中最后三個欄位(回答欄位、授權欄位、附加資訊欄位)均采用一種稱為資源記錄RR(Resource Record)的相同格式,如圖所示:

域名:記錄資源資料對應的名字,其格式與查詢名欄位格式相同
型別:與前面的查詢型別欄位值一致
類:通常為1,表示Internet資料
生存時間:客戶程式保留該資源記錄的秒數,資源記錄通常的生存時間為2天
資源資料長度:表示資源記錄資料的長度,對于型別為A的記錄的資源資料是4位元組的IP地址
資源資料:記錄的回應主體內容
三、高速快取
為了減少Internet上DNS的通信量,所有的名字服務器均使用高速快取,
在標準的Unix實作中,高速快取是由名字服務器維護的而不是名字決議器維護的,
名字決議器位于應用程式中,并不是總處于作業狀態,而高速快取放在只要系統處于作業狀態就能起作用的程式中顯得很重要,所以放置在名字服務器中,這樣任何一個使用相同的名字服務器的應用程式或任何主機均可獲得共享的高速快取
通常情況下,在Linux中的/etc/resolv.conf檔案中配置了名字服務器的IP地址:
[gongruiyang@localhost ~]$ cat /etc/resolv.conf
search localdomain
nameserver 192.168.14.2 # 名字服務器
現代Web瀏覽器設計為默認將DNS記錄快取一段時間,越靠近web瀏覽器進行DNS快取,越能快速獲得域名-IP 映射
作業系統中也有一份DNS快取,位于\etc\hosts中
一次完整的 DNS 查詢程序需要訪問多臺 DNS 服務器才能獲得最終的結果,這必定會帶來一定的時間延遲,
為了改善時間延遲,在進行 DNS 查詢前有多級快取來提供查詢

快取記錄的存活并不是永久的,在回應報文中answers欄位中的TTL欄位表示存活時間(見后文Wireshark抓包)
四、DNS工具:host
在Linux中,使用host命令可以將待查詢的域名傳遞給名字服務器,并顯示回傳的結果
[root@localhost gongruiyang]# host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 182.61.200.6
www.a.shifen.com has address 182.61.200.7
由此我們可以看出:域名www.baidu.com這個域名先被轉換成www.a.shifen.com.這個域名,然后再進行DNS決議出來兩個地址,說明:www.baidu.com域名對應兩個IP地址182.61.200.6和182.61.200.7
五、DNS PTR記錄
指標查詢方式(反向DNS查找):給定一個IP地址,回傳該地址對應的域名
[root@localhost gongruiyang]# host 140.252.13.34
34.13.252.140.in-addr.arpa domain name pointer pipen14.tuc.noao.edu.
[root@localhost gongruiyang]# host pipen14.tuc.noao.edu.
pipen14.tuc.noao.edu has address 140.252.13.34
該種方式常用于日志記錄,由于系統日志只記錄IP地址,反向DNS查找可以將這些IP地址轉換為域名,以便日志更加易讀

六、遞回查詢與迭代查詢
先對以下兩個名詞做出區分
遞回DNS查詢:是指向需要決議該查詢的 DNS 決議器發出的
請求遞回DNS決議器:DNS 決議器是 DNS 查找的第一站,是一種
計算機,其負責與發出初始請求的客戶端打交道,決議器啟動查詢序列,最終使 URL 轉換為必要的 IP 地址,
DNS決議分為遞回查詢和迭代查詢兩種方式,其中,客戶端與本地DNS服務器之間一般采用遞回查詢,而DNS服務器之間一般采用迭代查詢
- 遞回查詢:即如果本地DNS服務器在本服務器上沒有查詢到該域名,則會代替客戶端的身份去向其他DNS服務器發送查詢請求報文,客戶端只需等待最終的結果即可
- 迭代查詢:其他DNS服務器如果在本機上面未查到該域名,就會對本地DNS服務器說,下一步應該向哪一個DNS服務器發送請求報文

七、Wireshark抓DNS包驗證報文結構
- 步驟一:設定Wireshark過濾條件:
icmp || DNS,如下圖
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jXBgScRw-1628419061476)(https://raw.githubusercontent.com/gongruiyang/BlogImage/main/image-20210808173810681.png)]
- 步驟二:cmd中輸入
ping www.baidu.com,如下圖

- 步驟三:查看DNS
查詢報文 & 回應報文

查詢報文決議如圖所示:

回應報文決議如圖所示:

三個answers記錄

參考資料:
掘金-計算機網路 - 圖解 DNS & HTTPDNS 原理
《TCP/IP 詳解卷 I :協議》
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292715.html
標籤:其他
上一篇:Linux 基礎開發工具
