DNS 是網際網路 核心協議之一。不管是 上網瀏覽,還是 程式設計開發,都需要了解一點它的知識。
DNS是什麼
DNS (Domain Name System
的縮寫)的作用非常簡單,就是根據 域名 查出IP
地址。你可以把它想象成一本 巨大的電話本。
舉例來說,如果你要訪問域名www.baidu.com
,首先要通過DNS
查出它的IP
地址是220.181.57.216
和123.125.115.110
。
查詢過程
雖然 只需要返回一個IP
地址,但是DNS
的查詢過程非常複雜,分成 多個步驟。
工具軟體dig
可以顯示 整個查詢過程。
$ dig www.baidu.com
複製程式碼
上面的命令會輸出 六段 資訊。
-
第一段是查詢引數和統計
-
第二段是查詢內容
上面結果表示,查詢域名www.baidu.com
的A
記錄,A
是address
的縮寫。
- 第三段是DNS伺服器的答覆
上面結果顯示,www.baidu.com
有 三個A記錄,即 三個IP地址。294 是TTL
值(Time to live
的縮寫),表示 快取時間,即 600 秒之內 不用重新查詢。
- 第四段顯示
www.baidu.com
的NS
記錄(Name Server
的縮寫),即 哪些伺服器 負責管理www.baidu.com
的DNS
記錄。
上面結果顯示www.baidu.com
共有五條NS
記錄,即 五個域名伺服器,向其中任一臺查詢就能知道www.baidu.com
的IP
地址是什麼。
-
第五段是上面四個域名伺服器的
IP
地址 -
第六段是
DNS
伺服器的一些傳輸資訊。
上面結果顯示,本機的DNS
伺服器是192.168.3.1
,查詢埠是53
(DNS
伺服器的預設埠),以及回應長度是271
位元組。
如果不想看到這麼多內容,可以使用+short引數。
$ dig +short www.baidu.com
www.a.shifen.com.
115.239.211.112
115.239.210.27
複製程式碼
上面命令只返回www.baidu.com
對應的 2 個IP
地址(即A
記錄)和一個CNAME
(Canonical Name
,後文有介紹)。
DNS伺服器
下面我們根據前面這個例子,一步步還原,本機到底怎麼得到域名www.baidu.com
的IP
地址。
首先,本機一定要知道DNS
伺服器的IP
地址,否則上不了網。通過DNS
伺服器,才能知道某個域名的IP
地址到底是什麼。
DNS 伺服器的IP
地址,有可能是 動態的,每次上網時由 閘道器分配,這叫做DHCP
機制;也有可能是事先指定的 固定地址。MacOS
系統裡面,DNS
伺服器的IP
地址儲存在/etc/resolv.conf
檔案。
上例的DNS伺服器是192.168.3.1
,這是一個內網地址。有一些 公網 的DNS
伺服器,也可以使用,其中最有名的就是Google
的8.8.8.8
和Level 3
的4.2.2.2
。
本機只向自己的DNS
伺服器查詢,dig命令有一個@
引數,顯示向其他DNS
伺服器查詢的結果。
$ dig @8.8.8.8 www.baidu.com
複製程式碼
上面命令指定向DNS
伺服器8.8.8.8
查詢。
域名的層級
DNS 伺服器怎麼會知道每個域名的IP
地址呢?答案是分級查詢。
請仔細看前面的例子,每個域名的尾部都多了一個點。
比如,域名www.baidu.com
顯示為www.baidu.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的記錄型別
域名 與IP
之間的對應關係,稱為 記錄(record
)。根據使用場景,記錄 可以分成不同的 型別(type
),前面已經看到了有 A記錄。
常見的DNS
記錄型別如下:
-
A:地址記錄(
Address
),返回域名指向的IP
地址 -
NS:域名伺服器記錄(
Name Server
),返回儲存 下一級域名資訊的伺服器地址。該記錄只能設定為 域名,不能設定為IP
地址。 -
MX:郵件記錄(
Mail eXchange
),返回接收電子郵件的伺服器地址。 -
CNAME:規範名稱記錄(
Canonical Name
),返回另一個域名,即當前查詢的域名是另一個域名的跳轉,詳見下文。 -
PTR:逆向查詢記錄(
Pointer Record
),只用於從IP
地址查詢域名
一般來說,為了服務的安全可靠,至少應該有 兩條NS記錄,而A
記錄和MX
記錄也可以有多條,這樣就提供了服務的 冗餘性,防止出現單點失敗。
CNAME 記錄主要用於域名的內部跳轉,為伺服器配置提供靈活性,使用者感知不到。舉例來說,www.baidu.com
這個域名就是一個CNAME記錄。
$ dig www.baidu.com
...
;; ANSWER SECTION:
www.baidu.com. 1091 IN CNAME www.a.shifen.com.
www.a.shifen.com. 200 IN A 115.239.211.112
www.a.shifen.com. 200 IN A 115.239.210.27
複製程式碼
上面結果顯示,www.baidu.com
的CNAME
記錄指向www.a.shifen.com
。也就是說,使用者查詢www.baidu.com
的時候,實際上返回的是www.a.shifen.com
的IP
地址。
這樣的 好處 是,變更伺服器IP
地址的時候,只要修改www.a.shifen.com
這個域名就可以了,使用者的www.baidu.com
域名不用修改。
由於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
,還有一些 其他小工具 也可以使用。
- host 命令
host 命令可以看作dig
命令的簡化版本,返回當前請求域名的各種記錄。
$ host baidu.com
baidu.com has address 123.125.115.110
baidu.com has address 220.181.57.216
baidu.com mail is handled by 20 mx1.baidu.com.
baidu.com mail is handled by 20 jpmx.baidu.com.
baidu.com mail is handled by 20 mx50.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
baidu.com mail is handled by 15 mx.n.shifen.com.
複製程式碼
host 命令也可以用於 逆向查詢,即從IP
地址查詢域名,等同於dig -x <ip>
。
$ host 192.30.252.153
153.252.30.192.in-addr.arpa domain name pointer pages.github.com.
複製程式碼
- nslookup 命令
nslookup 命令用於 互動式地查詢域名記錄。
$ nslookup
> www.baidu.com
Server: 192.168.3.1
Address: 192.168.3.1#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 115.239.211.112
Name: www.a.shifen.com
Address: 115.239.210.27
複製程式碼
- whois 命令
whois 命令用來檢視 域名的註冊情況。
$ whois baidu.com
複製程式碼