Link Search Menu Expand Document

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 購買,而是透過域名註冊商進行購買,在這些域名註冊商的網站上,你可以一次選購各種不同的網域。例如 NamecheapGodaddy阿里雲-萬網 等等。

買到你自己的 second-level-domain 後,你就可以自行設定管理你的 sub-domain,例如 tw.jarll.com 和 www.jarll.com 指向不同的 IP 地址,是不同的網站伺服器。

DNS 是如何查詢的?

一般用戶是如何進行 DNS 查詢的呢?在作業系統中可以設置偏好的 DNS 伺服器,通常會使用 ISP 預設提供的 DNS 伺服器,也可以自己指定,例如:

在 Mac 中的設定:

image

查詢的流程會是先從客戶端偏好的 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

image

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

image

其中一行 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 的伺服器了,也就是寄信給 example@jarll.com 時,該郵件是去 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

補充資料


Copyright © 2010-2021 Wen-Tien Chang All Rights Reserved.