6. 什麽是 DNS
由於 IP 位址並不容易記憶,所以我們偏好讓用戶使用域名(Domain Name)來訪問伺服器,但是封包要傳遞必須使用 IP 地址。因此我們會用 域名系統來做 Domain Name 和 IP 地址的轉換。
除了好記憶的原因之外,使用域名也比較有彈性,伺服器的 IP 位置可能會變動(例如換不同服務商的機房就一定會變動IP地址),但是透過 DNS 就可以保持域名不變。
這個 DNS 機制基本上就是一個對照表,對照某某域名的 IP 地址是什麽。
在我們本機電腦上就有一個對照表的檔案,也就是 /etc/hosts
,你可以編輯這個檔案,寫下域名和 IP 地址的對應。
但是,本機不可能預先存好全世界網域名稱的對照表,因此我們會用 DNS 協議來做即時的線上查詢。
認識網域名稱(Domain Name)
我們先深入認識一下域名的組成:
一個網域名稱組成是 sub-domain.second-level-domain(your-domain).top-level-domain
,例如 www.jarll.com
其中 .com
就是 top-level、jarll
是 second-level,而 www
是 sub-domain。這個 sub-domain 可以是空的,因此 jarll.com
也是合法的網域名稱。
全世界的 top-level-domain 是由 互聯網號碼分配局 IANA 機構所管理的,所有的 top-level-domain 的列表請參考 Root Zone Database,每個 top-level-domain 會分配給不同國家的非營利組織進行管理,例如管理 .tw
的單位是 財團法人台灣網路資訊中心(TWNIC)、管理 .cn
的單位是 中國互聯網路信息中心(CNNIC)。
一般個人或公司組織會向這些非營利組織進行網域購買和登記,例如 jarll.com 是登記在負責管理 .com 網域的 VeriSign Global Registry Services 組織。不過實務上我們不會直接跟 VeriSign Global Registry Services 購買,而是透過域名註冊商進行購買,在這些域名註冊商的網站上,你可以一次選購各種不同的網域。例如 Namecheap、Godaddy 或 阿里雲-萬網 等等。
買到你自己的 second-level-domain 後,你就可以自行設定管理你的 sub-domain,例如 tw.jarll.com 和 www.jarll.com 指向不同的 IP 地址,是不同的網站伺服器。
DNS 是如何查詢的?
一般用戶是如何進行 DNS 查詢的呢?在作業系統中可以設置偏好的 DNS 伺服器,通常會使用 ISP 預設提供的 DNS 伺服器,也可以自己指定,例如:
- Google 提供的 8.8.8.8
- Cloudflare 提供的 1.1.1.1
- 中華電信 168.95.1.1
- 阿里云公共DNS http://www.alidns.com
- 中國大陸 114dns 的 114.114.114.114
在 Mac 中的設定:
查詢的流程會是先從客戶端偏好的 DNS 開始查詢。如果 DNS 找不到紀錄,則該 DNS 會從根網域名稱伺服器(root nameserver)開始查詢,直到找到負責該網域的 DNS 伺服器為止。在第一次查詢後,那台客戶端偏好的 DNS 就會快取起來。
舉例來說:查詢 www.jarll.com 時,如果客戶端偏好的 DNS 沒有紀錄,就會去問 根網域名稱伺服器(root nameserver) 說 .com 網域是誰管理的,它會回答負責 .com 的 nameserver,然後該 DNS 再去問 .com 的 nameserver 說 jarll.com 是哪一臺 DNS 負責的,然後再去問那一臺 www.jarll.com 對應的 IP 是什麽。
whois 指令
whois
指令可以查詢是誰註冊了這個網域。不過,註冊者可以選擇關閉聯絡信息,所以不一定可以查到。
nslookup 指令
nslookup
指令可以簡單查詢 DNS
Non-authoritative answer 的意思是這個答案並不是從負責 jarll.com 網域的主機回傳,而是直接從客戶端偏好的 DNS 伺服器 8.8.8.8 的快取紀錄回答的。而 Authoritative 的意思就是這個答案是從負責 jarll.com 網域的 DNS 主機回傳的。
dig 指令
dig
指令也可以查詢 DNS,提供更詳細的數據:
dig www.jarll.com
; <<>> DiG 9.10.6 <<>> www.jarll.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58797
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.jarll.com. IN A
;; ANSWER SECTION:
www.jarll.com. 599 IN A 106.15.203.249
;; Query time: 60 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu Jun 17 21:26:55 CST 2021
;; MSG SIZE rcvd: 58
得到答案是 www.jarll.com. 600 IN A 106.15.203.249
。
其中 600 秒是指快取有效時間,A
表示這一筆紀錄是 IPv4 的紀錄。
假設從根網域伺服器開始查詢:
dig @a.root-servers.net. www.jarll.com
其中一行 com. 172800 IN NS a.gtld-servers.net.
告訴們 .com 網域請去問 a.gtld-servers.net
這一臺。NS 表示這一筆紀錄是 Name Server 用途。
dig @a.gtld-servers.net. www.jarll.com
繼續
dig @vip1.alidns.com. www.jarll.com
這台 vip1.alidns.com 伺服器是 jarll.com 網域的 Authoritative 伺服器。
其中一行 www.jarll.com. 600 IN A 106.15.203.249
我們得到答案是 106.15.203.249
了。
DNS 紀錄有分不同類型,例如:
A
一筆 IPv4 紀錄,某個 subdomain 指向某一個 IPv4 地址AAAA
一筆 IPv6 紀錄MX
郵件伺服器CNAME
別名,可以設定某個 subdomain 指向另一個地址(不一定是同一個主網域)
例如 jarll.com 的郵件伺服器和網站不是同一臺伺服器,很多公司會把郵件伺服器改用 Google Apps,這在 DNS 設定中就可以指定 MX 紀錄:
dig -t mx jarll.com
回答
jarll.com. 599 IN MX 10 mxbiz2.qq.com.
jarll.com. 599 IN MX 5 mxbiz1.qq.com.
改指向到 qq 的伺服器了,也就是寄信給 [email protected]
時,該郵件是去 qq 的伺服器,而不是 106.15.203.249
。
7. DNS 現象
瞭解 DNS 機制的話,就可以理解以下的現象:
標售哄抬現象
因為購買一個網域一年並不貴,所以一些熱門的網址組合,很多網路蟑螂會預先註冊保留起來,如果你要買則需要花更貴的價錢才能買到。當然,你也可以根據商標走法律程序,不過很多網域是跨國的,所以並不容易處理。
故障排除
有時候網路好像故障了,瀏覽器無法連線,但是可以 ping ip address。這時候可以優先檢查是否是 DNS 壞了,換一臺試試看。
釣魚網站
所謂的釣魚網站,就是利用網址很像,然後畫面弄成一樣騙你輸入帳號密碼。
例如收到重新設定密碼的郵件,然後超連結前往 g00gle.com/forget_password,畫面長的跟 google 一模一樣。沒有註意網址的話,很可能就不小心輸入自己的帳號密碼了。
網域忘記續約
購買網域是需要定期續約了,一年、三年、五年等等。在大公司可能因為交接失敗,造成網域失效的現象層出不窮,例如:
Geo-based 或 Round-Robin
查詢 DNS 時,不一定總是回答同一個 IP 答案。有些網站會在不同國家有伺服器,但是希望網址是一樣的,這時候有可以根據用戶不同的地理位置,回答不同的 IP 答案。
或是在超高流量的網站,則可以回答不同台伺服器的 IP 位址來分散流量到不同伺服器。
DNS 污染
身為網站主,是無法控制用戶偏好使用的 DNS 伺服器。在一個理想信任的網路環境中,如果用戶的 DNS 不知道答案,它會一層一層去詢問。但是在一個受管制的網路環境,DNS 可以被控制回答不正確的 IP 位址,進而限制一般用戶無法順利瀏覽,甚至回答釣魚網站的 IP。這種行為就叫做 DNS 污染。
如何購買 Domain Name 和設定 DNS?
- 例如,我們去 NameCheap 買網域,請前往 https://www.namecheap.com/?aff=91800 註冊
- 假設購買 example.com,可以讓 1. NameCheap 代管 DNS,或改用別家 2. 我們自己設定的 DNS,例如之後購買虛擬主機 Linode 會有 DNS 可以用,或是用免費的 Cloudflare
- 如果要讓 NameCheap 代管 DNS 的話:
- Advanced DNS -> Domain Nameserver Type 選 Namecheap Default
- Advanced DNS -> Host Records -> Manage -> ADD RECORDS
- 新增 A Record,設定 host 是 @ 指向你的 server ip (這表示 example.com )
- 新增 A Record,設定 host 是 www 指向你的 server ip (這表示 www. example.com