分類
教學 網域名稱

如何檢查 DNS 更新已生效

DNS 修改後都必須等待 TTL 的時間過去後才能確認生效。因此許多人在修改 DNS 記錄之後都會等待一段時間,但最後才發現設定錯誤,或是依舊沒有生效,再次修改之後又要再等待,浪費時間。我來教你怎麼確認 DNS 的修改已生效,不論您的 TTL 設定多長都沒關係。

什麼是 TTL?

TTL 就是 DNS 的暫存時間,當 DNS 紀錄被查詢過之後,就會存留在快取伺服器 (例如 168.95.1.1 或 8.8.8.8) 上,直到 TTL 的時間 (秒),過去後才會重新查詢,在時間內的重複查詢都會使用快取資料,詳細的說明可以參考我寫過的文章

權威伺服器

權威伺服器就是您的 DNS 伺服器 (或稱名稱伺服器),現在一般來說都是網域名稱註冊商的 DNS 代管服務,會自己架設 DNS 伺服器的已經很少了。

如果您要知道自己的 DNS 伺服器,您可以透過 G Suite 的 Dig 工具,輸入自己的網域名稱,並且選擇 “NS”,出現的 NameServer 就是該網域名稱的權威伺服器

如何檢查 DNS 更新

檢查 DNS 更新的地方有兩個,只要 DNS 更新之後,不論 TTL 是多少,名稱伺服器一定會更新,接者會逐步影響快取伺服器的更新,TTL 的影響是後者。當你修改完 DNS 紀錄之後,你只要對名稱伺服器做查詢,基本上就可以知道更新有沒有成功。

檢查名稱伺服器的更新

透過上方的 G Suite Dig 工具,就可以知道權威伺服器的位址,接下來你要使用 dig 工具 (學習 dig 指令) 直接對權威伺服器查詢:

dig 指令:

dig @(nameserver) (domain) (type)

# 實際範例
dig @ns-195-b.gandi.net. www.30cm.gg a
  • nameserver 請換成實際的名稱伺服器
  • domain 請換成你修改的紀錄,例如 www.example.com 或 example.com
  • type 請換成 DNS 類型,例如 A 或 CNAME

nslookup 指令:

nslookup (type) (domain) (server)

#實際範例
nslookup -type=a www.30cm.gg ns-195-b.gandi.net

如果你使用的是 DNS 代管服務,不是自己架設的,那請隨便找一台進行查詢即可。如果是自己架的,請從主伺服器開始。


設定

上述 dig 指令就是針對名稱伺服器的查詢,會直接把 DNS 查詢送到名稱伺服器,所以名稱伺服器應該會回覆 “最新的資料”,不管 TTL 是多少。這個指令就是模擬快取伺服器的動作,但是資料並不會暫存在你自己的電腦,所以不論你查多少次,都應該會取得最新的 DNS 資料。

如果這時候取得的是舊資料,表示你的 DNS 代管伺服器沒有更新,有可能是壞掉,或是要等廠商更新,或是你設定錯誤。

在這個步驟重複查詢直到名稱伺服器出現最新的 DNS 紀錄為止。

多台名稱伺服器的同步

如果有多台名稱伺服器,譬如 DNS 代管提供了 3 台名稱伺服器,或是自己架設了 2 台名稱伺服器,請對每一台都做 dig 查詢。

這時候每一台都必須回覆最新的資料。如果不一致,那就是 DNS 同步沒有完成,這裡的同步指的是名稱伺服器之間的同步,不是 DNS 傳播同步。請等待大約一分鐘的時間,如果資料還是不一致,表示同步有問題,Slave 會持續提供舊的 DNS 紀錄,所以這時候要檢查名稱伺服器系統有沒有問題,或是自架 DNS 的話,序號有沒有更新。

當您每次修改 DNS 紀錄的時候,全部的權威伺服器 (名稱伺服器) 一定要立刻回應最新的資料,才表示 DNS 紀錄修改有成功。

重點小結

檢查快取伺服器是否更新成功

你一定會覺得我在唬爛,不是有 TTL 時間嗎?怎麼檢查?

好!不需要使用肝膽排毒法…. 哦!我是說不需要等待啦。基本上網路世界是很大的,不論你的站有多大,流量有多高,在網路裡面都是毛。並且網路是全世界都連結在一起的,所以任何地方理論上來說都可以連結到您的名稱伺服器才對,好了,不賣關子了,簡單的說 “總會有世界某個角落的快取伺服器沒有查詢過你的網域名稱“,要查詢過你的 DNS 紀錄,才會暫存你的資料。所以 …. 例如 “俄羅斯” 的 DNS 快取伺服器肯定不會有你 DNS 的紀錄、非洲、南美洲、北極… 等等都一樣,所以只要找一台不是你區域的 DNS 快取伺服器,對他做查詢就可以了。這世界不是只有 8.8.8.8,Public DNS Server 列表:請享用

隨便挑一台離你遠一點的,例如我選 109.228.0.238。

dig 指令:

dig @109.228.0.238 www.30cm.gg a

nslookup 指令:

# 單行指令
$ nslookup www.30cm.gg a 109.228.0.238

# nslookup 互動模式
$ nslookup
> server 109.228.0.238
Default server: 109.228.0.238
Address: 109.228.0.238#53
> set type=a
> www.30cm.gg
Server:         109.228.0.238
Address:        109.228.0.238#53

Non-authoritative answer:
www.30cm.gg     canonical name = webredir.vip.gandi.net.
Name:   webredir.vip.gandi.net
Address: 217.70.184.50

這指令會發送一個 DNS 查詢給 109 這台快取伺服器,理論上來說這台伺服器不會有你的 DNS 紀錄,所以它會發起新的查詢,連線到你的名稱伺服器取得最新的資料 (也就是我們上面模擬的動作)。但有可能會有網路連線問題會造成沒有回應,多挑幾台查詢一下就知道了。

如何檢查快取伺服器內是舊的 DNS 資料

即使 DNS 有傳播更新,你還是可以確認快取伺服器內是不是舊的 資料,你可以很專業的跟老闆講,請再等 XXX 秒就可以了,連幾秒都講得出來才專業。怎麼檢查呢?譬如現在你在 8.8.8.8 看到你的 DNS 舊資料,這時候請你約每 5 秒做一次查詢:

dig 指令

$ dig @8.8.8.8 30cm.gg a

;; ANSWER SECTION:
30cm.gg.                299     IN      A       217.70.184.55

nslookup 指令

# nslookup 必須進入互動模式設定 type=any 才能看到 TTL
$ nslookup
> server 8.8.8.8
Default server: 8.8.8.8
Address: 8.8.8.8#53
> set type=any
> 30cm.gg
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   30cm.gg
Address: 217.70.184.55
30cm.gg nameserver = ns-40-a.gandi.net.
30cm.gg nameserver = ns-195-b.gandi.net.
30cm.gg nameserver = ns-0-c.gandi.net.
30cm.gg
        origin = ns1.gandi.net
        mail addr = hostmaster.gandi.net
        serial = 1613606400
        refresh = 10800
        retry = 3600
        expire = 604800
        minimum = 10800
30cm.gg mail exchanger = 10 spool.mail.gandi.net.
30cm.gg mail exchanger = 50 fb.mail.gandi.net.
30cm.gg text = "v=spf1 include:_mailcust.gandi.net ?all"

這筆資料的 TTL 就是 300 秒,當你查詢之後花掉一秒,所以你會看到 299,請注意這個 299。每 5 秒做一次查詢,如果 299 持續變少,沒有變多,那就表示是舊資料,如果你多次查詢之後會跳回 299,那就表示名稱伺服器更新有問題,還是會查詢到舊的資料。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *