互聯網核心協議 DNS 原理入門指南,看這一篇就夠了

DNS 是互聯網核心協議之一。不管是上網瀏覽,還是編程開發,都需要了解一點它的知識。

本文詳細介紹 DNS 的原理,以及如何運用工具軟件觀察它的運作。我的目標是,讀完此文後,你就能完全理解 DNS。

一、DNS 是什麼?

DNS (Domain Name System 的縮寫)的作用非常簡單,就是根據域名查出 IP 地址。你可以把它想象成一本巨大的電話本。

舉例來說,如果你要訪問域名 math.stackexchange.com,首先要通過 DNS 查出它的 IP 地址是 151.101.129.69。

二、查詢過程

雖然只需要返回一個 IP 地址,但是 DNS 的查詢過程非常複雜,分成多個步驟。

工具軟件 dig 可以顯示整個查詢過程。

$ dig math.stackexchange.com

上面的命令會輸出六段信息。

第一段是查詢參數和統計。

第二段是查詢內容。

上面結果表示,查詢域名 math.stackexchange.com 的 A 記錄,A 是 address 的縮寫。

第三段是 DNS 服務器的答覆。

上面結果顯示,math.stackexchange.com 有四個 A 記錄,即四個 IP 地址。600 是 TTL 值(Time to live 的縮寫),表示緩存時間,即 600 秒之內不用重新查詢。

第四段顯示 stackexchange.com 的 NS 記錄(Name Server 的縮寫),即哪些服務器負責管理 stackexchange.com 的 DNS 記錄。

上面結果顯示 stackexchange.com 共有四條 NS 記錄,即四個域名服務器,向其中任一臺查詢就能知道 math.stackexchange.com 的 IP 地址是什麼。

第五段是上面四個域名服務器的 IP 地址,這是隨着前一段一起返回的。

第六段是 DNS 服務器的一些傳輸信息。

上面結果顯示,本機的 DNS 服務器是 192.168.1.253,查詢端口是 53(DNS 服務器的默認端口),以及迴應長度是 305 字節。

如果不想看到這麼多內容,可以使用 + short 參數。

$ dig +short math.stackexchange.com

151.101.129.69
151.101.65.69
151.101.193.69
151.101.1.69

上面命令只返回 math.stackexchange.com 對應的 4 個 IP 地址(即 A 記錄)。

三、DNS 服務器

下面我們根據前面這個例子,一步步還原,本機到底怎麼得到域名 math.stackexchange.com 的 IP 地址。

首先,本機一定要知道 DNS 服務器的 IP 地址,否則上不了網。通過 DNS 服務器,才能知道某個域名的 IP 地址到底是什麼。

DNS 服務器的 IP 地址,有可能是動態的,每次上網時由網關分配,這叫做 DHCP 機制;也有可能是事先指定的固定地址。Linux 系統裏面,DNS 服務器的 IP 地址保存在 / etc/resolv.conf 文件。

上例的 DNS 服務器是 192.168.1.253,這是一個內網地址。有一些公網的 DNS 服務器,也可以使用,其中最有名的就是 Google 的 8.8.8.8 和 Level 3 的 4.2.2.2。

本機只向自己的 DNS 服務器查詢,dig 命令有一個 @參數,顯示向其他 DNS 服務器查詢的結果。

$ dig @4.2.2.2 math.stackexchange.com

上面命令指定向 DNS 服務器 4.2.2.2 查詢。

四、域名的層級

DNS 服務器怎麼會知道每個域名的 IP 地址呢?答案是分級查詢。

請仔細看前面的例子,每個域名的尾部都多了一個點。

比如,域名 math.stackexchange.com 顯示爲 math.stackexchange.com.。這不是疏忽,而是所有域名的尾部,實際上都有一個根域名。

舉例來說,www.example.com 真正的域名是 www.example.com.root,簡寫爲 www.example.com.。因爲,根域名. root 對於所有域名都是一樣的,所以平時是省略的。

根域名的下一級,叫做” 頂級域名”(top-level domain,縮寫爲 TLD),比如. com、.net;再下一級叫做” 次級域名”(second-level domain,縮寫爲 SLD),比如 www.example.com 裏面的. example,這一級域名是用戶可以註冊的;再下一級是主機名(host),比如 www.example.com 裏面的 www,又稱爲” 三級域名”,這是用戶在自己的域裏面爲服務器分配的名稱,是用戶可以任意分配的。

總結一下,域名的層級結構如下。

主機名.次級域名.頂級域名.根域名
# 即
host.sld.tld.root

五、根域名服務器

DNS 服務器根據域名的層級,進行分級查詢。

需要明確的是,每一級域名都有自己的 NS 記錄,NS 記錄指向該級域名的域名服務器。這些服務器知道下一級域名的各種記錄。

所謂” 分級查詢”,就是從根域名開始,依次查詢每一級域名的 NS 記錄,直到查到最終的 IP 地址,過程大致如下。

  1. 從” 根域名服務器” 查到” 頂級域名服務器” 的 NS 記錄和 A 記錄(IP 地址)

  2. 從” 頂級域名服務器” 查到” 次級域名服務器” 的 NS 記錄和 A 記錄(IP 地址)

  3. 從” 次級域名服務器” 查出” 主機名” 的 IP 地址

仔細看上面的過程,你可能發現了,沒有提到 DNS 服務器怎麼知道” 根域名服務器” 的 IP 地址。回答是” 根域名服務器” 的 NS 記錄和 IP 地址一般是不會變化的,所以內置在 DNS 服務器裏面。

下面是內置的根域名服務器 IP 地址的一個例子。

上面列表中,列出了根域名(.root)的三條 NS 記錄 A.ROOT-SERVERS.NET、B.ROOT-SERVERS.NET 和 C.ROOT-SERVERS.NET,以及它們的 IP 地址(即 A 記錄)198.41.0.4、192.228.79.201、192.33.4.12。

另外,可以看到所有記錄的 TTL 值是 3600000 秒,相當於 1000 小時。也就是說,每 1000 小時才查詢一次根域名服務器的列表。

目前,世界上一共有十三組根域名服務器,從 A.ROOT-SERVERS.NET 一直到 M.ROOT-SERVERS.NET。

六、分級查詢的實例

dig 命令的 + trace 參數可以顯示 DNS 的整個分級查詢過程。

$ dig +trace math.stackexchange.com

上面命令的第一段列出根域名. 的所有 NS 記錄,即所有根域名服務器。

根據內置的根域名服務器 IP 地址,DNS 服務器向所有這些 IP 地址發出查詢請求,詢問 math.stackexchange.com 的頂級域名服務器 com. 的 NS 記錄。最先回復的根域名服務器將被緩存,以後只向這臺服務器發請求。

接着是第二段。

上面結果顯示. com 域名的 13 條 NS 記錄,同時返回的還有每一條記錄對應的 IP 地址。

然後,DNS 服務器向這些頂級域名服務器發出查詢請求,詢問 math.stackexchange.com 的次級域名 stackexchange.com 的 NS 記錄。

上面結果顯示 stackexchange.com 有四條 NS 記錄,同時返回的還有每一條 NS 記錄對應的 IP 地址。

然後,DNS 服務器向上面這四臺 NS 服務器查詢 math.stackexchange.com 的主機名。

上面結果顯示,math.stackexchange.com 有 4 條 A 記錄,即這四個 IP 地址都可以訪問到網站。並且還顯示,最先返回結果的 NS 服務器是 ns-463.awsdns-57.com,IP 地址爲 205.251.193.207。

七、NS 記錄的查詢

dig 命令可以單獨查看每一級域名的 NS 記錄。

$ dig ns com
$ dig ns stackexchange.com

+short 參數可以顯示簡化的結果。

$ dig +short ns com
$ dig +short ns stackexchange.com

八、DNS 的記錄類型

域名與 IP 之間的對應關係,稱爲” 記錄”(record)。根據使用場景,” 記錄” 可以分成不同的類型(type),前面已經看到了有 A 記錄和 NS 記錄。

常見的 DNS 記錄類型如下。

(1) A:地址記錄(Address),返回域名指向的 IP 地址。

(2) NS:域名服務器記錄(Name Server),返回保存下一級域名信息的服務器地址。該記錄只能設置爲域名,不能設置爲 IP 地址。

(3)MX:郵件記錄(Mail eXchange),返回接收電子郵件的服務器地址。

(4)CNAME:規範名稱記錄(Canonical Name),返回另一個域名,即當前查詢的域名是另一個域名的跳轉,詳見下文。

(5)PTR:逆向查詢記錄(Pointer Record),只用於從 IP 地址查詢域名,詳見下文。

一般來說,爲了服務的安全可靠,至少應該有兩條 NS 記錄,而 A 記錄和 MX 記錄也可以有多條,這樣就提供了服務的冗餘性,防止出現單點失敗。

CNAME 記錄主要用於域名的內部跳轉,爲服務器配置提供靈活性,用戶感知不到。舉例來說,facebook.github.io 這個域名就是一個 CNAME 記錄。

$ dig facebook.github.io
...
;; ANSWER SECTION:
facebook.github.io. 3370    IN  CNAME   github.map.fastly.net.
github.map.fastly.net.  600 IN  A   103.245.222.133

上面結果顯示,facebook.github.io 的 CNAME 記錄指向 github.map.fastly.net。也就是說,用戶查詢 facebook.github.io 的時候,實際上返回的是 github.map.fastly.net 的 IP 地址。這樣的好處是,變更服務器 IP 地址的時候,只要修改 github.map.fastly.net 這個域名就可以了,用戶的 facebook.github.io 域名不用修改。

由於 CNAME 記錄就是一個替換,所以域名一旦設置 CNAME 記錄以後,就不能再設置其他記錄了(比如 A 記錄和 MX 記錄),這是爲了防止產生衝突。舉例來說,foo.com 指向 bar.com,而兩個域名各有自己的 MX 記錄,如果兩者不一致,就會產生問題。由於頂級域名通常要設置 MX 記錄,所以一般不允許用戶對頂級域名設置 CNAME 記錄。

PTR 記錄用於從 IP 地址反查域名。dig 命令的 - x 參數用於查詢 PTR 記錄。

$ dig -x 192.30.252.153
...
;; ANSWER SECTION:
153.252.30.192.in-addr.arpa. 3600 IN    PTR pages.github.com.

上面結果顯示,192.30.252.153 這臺服務器的域名是 pages.github.com。

逆向查詢的一個應用,是可以防止垃圾郵件,即驗證發送郵件的 IP 地址,是否真的有它所聲稱的域名。

dig 命令可以查看指定的記錄類型。

$ dig a github.com
$ dig ns github.com
$ dig mx github.com

九、其他 DNS 工具

除了 dig,還有一些其他小工具也可以使用。

(1)host 命令

host 命令可以看作 dig 命令的簡化版本,返回當前請求域名的各種記錄。

$ host github.com

github.com has address 192.30.252.121
github.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM.
github.com mail is handled by 1 ASPMX.L.GOOGLE.COM.

$ host facebook.github.com

facebook.github.com is an alias for github.map.fastly.net.
github.map.fastly.net has address 103.245.222.133

host 命令也可以用於逆向查詢,即從 IP 地址查詢域名,等同於 dig -x 。

$ host 192.30.252.153
153.252.30.192.in-addr.arpa domain name pointer pages.github.com.

**(2)nslookup 命令
**

nslookup 命令用於互動式地查詢域名記錄。

$ nslookup

> facebook.github.io
Server:     192.168.1.253
Address:    192.168.1.253#53

Non-authoritative answer:
facebook.github.io  canonical name = github.map.fastly.net.
Name:   github.map.fastly.net
Address: 103.245.222.133
>

(3)whois 命令

whois 命令用來查看域名的註冊情況。

$ whois github.com

十、參考文章

附:DNS 百科

DNS(Domain Name System,域名系統),因特網上作爲域名和 IP 地址相互映射的一個分佈式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的 IP 數串。通過主機名,最終得到該主機名對應的 IP 地址的過程叫做域名解析(或主機名解析)。DNS 協議運行在 UDP 協議之上,使用端口號 53。在 RFC 文檔中 RFC 2181 對 DNS 有規範說明,RFC 2136 對 DNS 的動態更新進行說明,RFC 2308 對 DNS 查詢的反向緩存進行說明。

**DNS 功能
**

每個 IP 地址都可以有一個主機名,主機名由一個或多個字符串組成,字符串之間用小數點隔開。有了主機名,就不要死記硬背每臺 IP 設備的 IP 地址,只要記住相對直觀有意義的主機名就行了。這就是 DNS 協議所要完成的功能。

主機名到 IP 地址的映射有兩種方式:

1)靜態映射,每臺設備上都配置主機到 IP 地址的映射,各設備獨立維護自己的映射表,而且只供本設備使用;

2)動態映射,建立一套域名解析系統(DNS),只在專門的 DNS 服務器上配置主機到 IP 地址的映射,網絡上需要使用主機名通信的設備,首先需要到 DNS 服務器查詢主機所對應的 IP 地址。

通過主機名,最終得到該主機名對應的 IP 地址的過程叫做域名解析(或主機名解析)。在解析域名時,可以首先採用靜態域名解析的方法,如果靜態域名解析不成功,再採用動態域名解析的方法。可以將一些常用的域名放入靜態域名解析表中,這樣可以大大提高域名解析效率。

DNS 安全問題

1. 針對域名系統的惡意攻擊:DDOS 攻擊造成域名解析癱瘓。

2. 域名劫持:修改註冊信息、劫持解析結果。

3. 國家性質的域名系統安全事件:“.ly” 域名癱瘓、“.af” 域名的域名管理權變更。

4. 系統上運行的 DNS 服務存在漏洞,導致被黑客獲取權限,從而篡改 DNS 信息。

5.DNS 設置不當,導致泄漏一些敏感信息。提供給黑客進一步攻擊提供有力信息。

來源:阮一峯

www.ruanyifeng.com/blog/2016/06/dns.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。