DNS 是互聯網 核心協議之一。不論是 上網瀏覽,仍是 編程開發,都須要瞭解一點它的知識。git
DNS (Domain Name System
的縮寫)的做用很是簡單,就是根據 域名 查出IP
地址。你能夠把它想象成一本 巨大的電話本。github
舉例來講,若是你要訪問域名www.baidu.com
,首先要經過DNS
查出它的IP
地址是220.181.57.216
和123.125.115.110
。shell
雖然 只須要返回一個IP
地址,可是DNS
的查詢過程很是複雜,分紅 多個步驟。編程
工具軟件dig
能夠顯示 整個查詢過程。緩存
$ dig www.baidu.com
複製代碼
上面的命令會輸出 六段 信息。安全
第一段是查詢參數和統計 bash
第二段是查詢內容 服務器
上面結果表示,查詢域名www.baidu.com
的A
記錄,A
是address
的縮寫。dom
上面結果顯示,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
,後文有介紹)。
下面咱們根據前面這個例子,一步步還原,本機到底怎麼獲得域名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
複製代碼
域名 與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
複製代碼
除了dig
,還有一些 其餘小工具 也可使用。
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
> 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 baidu.com
複製代碼