DNS域名工作原理及解析
0x00 定義
DNS( Domain Name System)是“域名系統”的英文縮寫,它作為將域名和IP地址相互映射的一個分布式數據庫,能夠使人更方便地訪問互聯網。DNS使用TCP和UDP端口53[1]。當前,對於每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符。
總結以下幾點:
1)映射域名與IP
2)使用TCP/UDP:53端口
3)每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符
4)早期的DNS是只支持英文域名解析。在IDNs(國際化域名Internationalized Domain Names)推出以后,為了保證兼容以前的DNS,所以,對IDNs進行punycode轉碼,轉碼后的punycode就由26個字母+10個數字,還有“-”組成。
中國.cn,用Punycode轉換后為:xn--fiqs8s. cn
0x01 域名結構
DNS 系統采用的是分布式的解析方案,整個 DNS 架構是一種層次樹狀結構,這個樹狀結構稱為 DNS 域名空間,如圖:
樹狀結構最頂層稱為根域,用 “.” 表示,相應服務器稱為根服務器,整個域名空間解析權都歸跟服務器所有,但根服務器無法承擔龐大的負載,采用“委派”機制,在根域下設置了一些頂級域,然后將不同頂級域解析權分別委派給相應的頂級域服務器,如將 com 域 的解析全委派給 com 域服務器,以后但凡跟服務器收到以 com 結尾的域名解析請求,都會轉發給com 域服務器,同樣道理,為了減輕頂級域的壓力,又下設了若干二級域,二級域又下設三級域或主機
根域
位於域名空間最頂層,一般用一個 “.” 表示
頂級域
一般代表一種類型的組織機構或國家地區,如 net、com、org、edu、gov、mil、cn、jp、hk
二級域
用來標明頂級域內的一個特定的組織,國家頂級域下面的二級域名由國家網絡部門統一管理,如 .cn 頂級域名下面設置的二級域名:.com.cn、.net.cn、.edu.cn …
子域
二級域下所創建的各級域統稱為子域,各個組織或用戶可以自由申請注冊自己的域名
主機
主機位於域名空間最下層,就是一台具體的計算機,如 www、mail、都是具體的計算機名字,可用www.sina.com.cn.、mail.sina.com.cn. 來表示,這種表示方式稱為 FQDN (完全合格域名),也是這台主機在域名中的全名
0x02 DNS記錄
轉載了一篇比較全的DNS記錄說明,可以看一下
下面說一下比較常見一些記錄信息
A/AAAA、CNAME、MX、NS、TXT、SPF
下面挨個介紹一下。
A記錄/AAAA記錄
IPv4:
- 示例:ns1.exmaple.com. IN A 198.51.100.2
- 解釋:【domain】 IN A 【IP地址】
IPv6:
- 示例:ns1.exmaple.com. IN AAAA 8fe0::8f61:ac8:30cd:a16e
- 解釋:【domain】 IN AAAA 【IP地址】
※IN的意思是「Internet」,不是IN/OUT的「IN」。
干什么用呢?
我們在瀏覽器輸入域名后,需要向DNS服務器請求,找到這個域名對應的服務器IP。上面示例就是這么一條記錄。
雖然域名和IP都可以變更,但是相比來說域名變更更加簡單和隨意。所以當網站更換自己域名的時候,就需要修改這條記錄。
CNAME
- 示例:sub.example.com. IN CNAME hoge.example.com.
- 解釋:【別名】 IN CNAME 【原名】
干什么用呢?
給某一個domain起多個名字。
類似於,jd.com,jd360.com,jingdong.com雖然是不同名字的域名,但是可以指向同一個原名jd.com。可以讓企業的對外展示更加靈活。
舉例:
jd360.com IN CNAME jd.com
jingdong.com IN CNAME jd.com
jd.com IN A 123.123.123.123 (這條是A記錄例子)
MX記錄
- MX記錄(Mail Exchange):郵件路由記錄
在DNS上設定,用於將郵箱地址@符號后的域名指向郵件服務器。 - 示例:example.com. IN MX 10 mail.example.com.
- 解釋:【domain】 IN MX 【優先度】 【郵件服務器】
干什么用呢?
當發信側服務器給受信側發郵件時,首先會要求DNS服務器解析受信側郵箱地址中@后面部分的域名對應的MX記錄(DNS的寫法可以理解成example.com 的A記錄下面,有一行上面示例的MX記錄,當然郵箱服務器也有對應的A記錄)。
這樣,郵件就直接發到對應的MX記錄的A記錄里的IP了。
例子:給test@exmaple.com發郵件的話,
DNS會返回給發信側198.51.100.3這個IP
exmaple.com. IN A 198.51.100.2
example.com. IN MX 10 mail.example.com.
mail.example.com. IN A 198.51.100.3
※如果是普通用戶通過【exmaple.com】瀏覽主頁,那么DNS繼續返回 198.51.100.2 。這個其實也需要DNS判斷請求服務器是郵件服務器還是普通的訪問。
NS記錄
- 指定域名解析服務器。
- 示例:example.com. IN NS ns1.example.com.
- 解釋:【domain】 IN NS 【DNS服務器】
干什么用呢?
指定該域名由哪個DNS服務器來進行解析。
TXT記錄
- 示例:ns1.exmaple.com. IN TXT "聯系電話:XXXX"
- 解釋:【domain】 IN TXT 【任意字符串】
干什么用呢?
一般指某個主機名或域名的說明,或者聯系方式,或者標注提醒等等。
SPF記錄
SPF記錄是TXT記錄的一個運用。后面的備注需要按照指定的格式才能有效。
- 示例:exmaple.com. IN TXT "v=spf1 ip4:198.51.100.1 ~all"
- 解釋:【domain】 IN TXT 【送信側郵件服務器確認規則】
干什么用呢?
從發信側服務器設定到DNS上的這條記錄中,讀取信息,判斷發信側是否合法。
如果不符合規則,那么按照約定的規則處理掉。
跟MX記錄正好相反。
MX:我是收件服務器,你找我時,請參考我設定到DNS服務器上的MX記錄。
SPF:我是發信服務器,你接受郵件時,請參考我設定到DNS服務器上SPF規則。如果不是我發的信,你可以刪掉或者接收。
SPF記錄規則
-
格式:
版本 空格 定義 空格 定義 (空格 定義的循環)
跟着例子看的話,比較好理解。
example.com. IN SPF "v=spf1 ip4:192.0.2.1 -all"- v=spf1 是版本。只出現一次。
- ip4:192.0.2.1 第一個定義
- -all 第二個定義
-
定義的格式。
- 種類
| all | ip4 | ip6 | a | mx | ptr | exists | include| - 前綴
"+" Pass(通過)
"-" Fail(拒絕)
"~" Soft Fail(軟拒絕)
"?" Neutral(中立)
- 種類
-
定義測試
測試時,將從前往后依次測試每個定義。
如果一個定義命中了要查詢的 IP 地址,則由相應定義的前綴決定怎么處理。默認的前綴為+。
如果測試完所有的 定義也沒有命中,則結果為 Neutral。
結果及處理方法一覽
結果 | 說明 | 服務器處理辦法 |
---|---|---|
Pass | 發件IP是合法的 | 接受來信 |
Fail | 發件 IP 是非法的 | 退信 |
Soft Fail | 發件 IP 非法,但是不采取強硬措施 | 接受來信,但是做標記 |
Neutral | SPF 記錄中沒有關於發件 IP 是否合法的信息 | 接受來信 |
None | 服務器沒有設定 SPF 記錄 | 接受來信 |
PermError | 發生了嚴重錯誤(例如 SPF 記錄語法錯誤) | 沒有規定 |
TempError | 發生了臨時錯誤(例如 DNS 查詢失敗) | 接受或拒絕 |
域名解析總體可分為一下過程:
(1) 輸入域名后, 先查找自己主機對應的域名服務器,域名服務器先查找自己的數據庫中的數據.
(2) 如果沒有, 就向上級域名服務器進行查找, 依次類推
(3) 最多回溯到根域名服務器, 肯定能找到這個域名的IP地址
(4) 域名服務器自身也會進行一些緩存, 把曾經訪問過的域名和對應的IP地址緩存起來, 可以加速查找過程
具體過程可描述如下:
1. 主機先向本地域名服務器進行遞歸查詢
2. 本地域名服務器采用迭代查詢,向一個根域名服務器進行查詢
3. 根域名服務器告訴本地域名服務器,下一次應該查詢的頂級域名服務器的IP地址
4. 本地域名服務器向頂級域名服務器進行查詢
5. 頂級域名服務器告訴本地域名服務器,下一步查詢權限服務器的IP地址
6. 本地域名服務器向權限服務器進行查詢
7. 權限服務器告訴本地域名服務器所查詢的主機的IP地址
8. 本地域名服務器最后把查詢結果告訴主機
上文我們提出了兩個概念:遞歸查詢和迭代查詢
(1)遞歸查詢:本機向本地域名服務器發出一次查詢請求,就靜待最終的結果。如果本地域名服務器無法解析,自己會以DNS客戶機的身份向其它域名服務器查詢,直到得到最終的IP地址告訴本機
(2)迭代查詢:本地域名服務器向根域名服務器查詢,根域名服務器告訴它下一步到哪里去查詢,然后它再去查,每次它都是以客戶機的身份去各個服務器查詢。
通俗地說,遞歸就是把一件事情交給別人,如果事情沒有辦完,哪怕已經辦了很多,都不要把結果告訴我,我要的是你的最終結果,而不是中間結果;如果你沒辦完,請你找別人辦完。
迭代則是我交給你一件事,你能辦多少就告訴我你辦了多少,然后剩下的事情就由我來辦。
下面采用了Amazon的例子
- 用戶打開 Web 瀏覽器,在地址欄中輸入 www.example.com,然后按 Enter 鍵。
- www.example.com 的請求被路由到 DNS 解析程序(即本地DNS服務器),這一般由用戶的 Internet 服務提供商 (ISP) 進行管理,例如有線 Internet 服務提供商、DSL 寬帶提供商或公司網絡。
- ISP 的 DNS 解析程序將 www.example.com 的請求轉發到 DNS 根名稱服務器。
- ISP 的 DNS 解析程序再次轉發 www.example.com 的請求,這次轉發到 .com 域的一個 TLD 名稱服務器。.com 域的名稱服務器使用與 example.com 域相關的四個 Amazon Route 53 名稱服務器的名稱來響應該請求。
- ISP 的 DNS 解析程序選擇一個 Amazon Route 53 名稱服務器,並將 www.example.com 的請求轉發到該名稱服務器。
- Amazon Route 53 名稱服務器在 example.com 托管區域中查找 www.example.com 記錄,獲得相關值,例如,Web 服務器的 IP 地址 (192.0.2.44),並將 IP 地址返回至 DNS 解析程序。
- ISP 的 DNS 解析程序最終獲得用戶需要的 IP 地址。解析程序將此值返回至 Web 瀏覽器。DNS 解析程序還會將 example.com 的 IP 地址緩存 (存儲) 您指定的時長,以便它能夠在下次有人瀏覽 example.com 時更快地作出響應。有關更多信息,請參閱存活期 (TTL)。
- Web 瀏覽器將 www.example.com 的請求發送到從 DNS 解析程序中獲得的 IP 地址。這是您的內容所處位置,例如,在 Amazon EC2 實例中或配置為網站終端節點的 Amazon S3 存儲桶中運行的 Web 服務器。
- 192.0.2.44 上的 Web 服務器或其他資源將 www.example.com 的 Web 頁面返回到 Web 瀏覽器,且 Web 瀏覽器會顯示該頁面。