DNS 系列(一):為什麼更新了 DNS 記錄不生效?

2022-07-07 15:00:37

我們在上網時如果想要存取到另一臺機器上的內容,通常只需要直接輸入一串地址,例如:www.upyun.com,就能夠準確存取到自己想要存取的網站。但是實際上這只是方便我們記憶的字元形式網路標識,真正讓我們的機器和另一臺機器進行溝通的是 IP 地址。只不過 IP 地址無論是輸入還是記憶都非常麻煩,因此才誕生了域名系統。那麼域名是怎麼連線到那個伺服器的 IP 呢?這就和我們今天要說的域名系統 DNS 有關了。

DNS 是什麼?

因為有意義的名字可以表示主機的賬號、工作性質、所屬的地域和組織等,從而便於記憶和使用。所以使用者會更傾向於用名字來標識主機,DNS 就是為這種需要而開發的。DNS 代表域名系統(Domain Name System)。該系統會將域名(example.com)翻譯成實際的 IP 地址。

DNS 的邏輯結構是一個分層的域名樹,由 Internet 網路資訊中心(InterNIC)管理著域名樹的根,稱為「根域」,根域用句號「.」表示,不過這個通常是省略的。需要注意的是全世界一共只有 13 臺 IPv4 根域名伺服器。

根域下面是頂級域(TLD),分為國家頂級域(ccTLD)和通用頂級域(gTLD)。國家頂級域使用國家和地區縮寫程式碼,例如「cn」代表中國。通用頂級域就是我們常見的 com/net/org 等。

頂級域下面是二級域,這是正式註冊給組織和個人的唯一名稱,例如 www.upyun.com 中的 upyun 就是又拍雲註冊的域名。在二級域之下,組織機構還可以劃分子域,用於各分支部門使用。但是標準規定,一個域名的長度通常不超過 63 個字元,最多不能超過 255 個字元。

當然了,DNS 不僅僅能指向 IP 地址,同時還支援其他形式的記錄。常見的 DNS 記錄形式有:

  • A 記錄:域的 IPv4 地址的記錄。

  • AAAA 記錄:域的 IPv6 地址的記錄。

  • CNAME 記錄:別名,將一個域或子域轉發到另一個域,不提供 IP 地址。

  • MX 記錄:將郵件定向到電子郵件伺服器。

  • TXT 記錄:可使管理員在記錄中儲存文字註釋。

  • NS 記錄:儲存 DNS 條目的名稱伺服器。

一個有特色的域名,可以讓使用者將公司品牌「深深印在腦海裡」。儘管域名可能是永恆不變的,但記錄指向的地址及使用的 DNS 伺服器卻會因為需求經常變動。有時我們也會遇到修改了 DNS 記錄後,實際存取到的地址卻沒有更新的情況,這就涉及到了 DNS 傳播。

什麼是 DNS 傳播?

一般我們對網站的域名解析記錄或 DNS 服務提供商進行更改後,全球所有的伺服器都需要一段時間才能採用新的記錄值,這段時間可能是幾小時,也可能是幾天,這個過渡階段就是 DNS 傳播。

DNS 傳播因 DNS 伺服器的負載情況而異。伺服器越舊所需要更新時間就越長,因此在過渡期間,會出現其他提供商已經使用了新的地址,但一些舊伺服器的服務商可能還未更新的。這是因為持續查詢新的地址會導致負載過高,所以 DNS 伺服器不會將更新資訊臨時儲存在快取中,只有當所有伺服器都更新了此快取,才會在所有地方同步上新新地址。

除了伺服器負載,還有一些因素也會影響 DNS 傳播。

影響 DNS 傳播的因素

DNS 區域和 TTL 值

DNS 被分成許多不同的區域,是 DNS 名稱空間的一部分,由特定組織或管理員加以管理。區域檔案是儲存在 DNS 伺服器中的純文字檔案,它包含區域的實際表示,和區域內每個域的所有記錄。

我們可以為域名區域檔案中的每個 DNS 設定 TTL。TTL 代表「生存時間」,是伺服器快取 DNS 資訊的時間段。它可以定義設定臨時快取、儲存多久以及何時進行更新。TTL 值對於 DNS 傳播是很關鍵的,如果 TTL 值為 24 小時,則更改後需要 1 天才能生效。當然,為了更新可以更快生效,我們可以調整 TTL 值。但是,此調整必須在更新之前進行,因為調整 TTL 也屬於 DNS 傳播,也需要一段時間才能生效。另外注意切勿將 DNS TTL 設定為 0,因為標準中沒有定義數位 0,它可能會導致 DNS 資訊被忽略或拒絕。

如果使用雲解析修改域名的解析記錄,最終生效時間取決於各地運營商的 DNS 伺服器快取重新整理時間,一般情況下等同於設定解析時的 TTL 時間。例如解析設定中 TTL 值為 10 分鐘,修改解析後將在 10 分鐘內實現全球生效。

如果是修改 DNS 伺服器,那麼生效時間取決於本地 DNS 快取的域名 DNS 伺服器名稱的 TTL 時間,例如「.com」頂級域是 48 小時,「.cn」是 24 小時。因為不同頂級域 DNS 伺服器的 TTL 時間是不同的,所以理論上修改域名 DNS 伺服器全球解析生效時間最長需要 48 小時。

ISP(Internet 服務提供商)

另一個影響 DNS 傳播持續時間的因素是使用的 Internet 服務提供商(ISP)。ISP 會將 DNS 資料快取在本地,每次請求是在快取檢索資料而非 DNS 伺服器。這種做法的好處是響應更快,同時也減少了資料流量的產生。但是,這可能會對 DNS 傳播產生影響。此外,一些 ISP 會直接忽略 TTL 設定,並且固定每兩到三天才更新一次快取記錄。

伺服器的位置

伺服器的位置也會對 DNS 傳播產生影響。記錄的更改短時間內可以在就近的 DNS 伺服器生效,但到世界另一端的伺服器通常需要更久。因為不同的伺服器需要一個接一個地通知對方記錄有更改。而且就像第二條裡提到的,由於一些伺服器可能僅在特定的時間間隔內更新,這就導致全部更新會需要很長時間。

DNS 傳播的時間

那實際的 DNS 傳播需要多長時間?本地伺服器通常會在幾分鐘或幾小時內更新。但是,要讓全球所有伺服器都知曉這些更改,並使其生效可能需要相當長的時間,通常 1 至 2 天內才生效都是可能的。而且根據服務提供商的設定,還可能出現 72 小時之後才全部更新的情況。因此,當需要更改或切換記錄時,提前安排 DNS 傳播非常重要。

在某些情況下,DNS 傳播會對網站的存取產生影響,這是沒辦法完全避免的,不過可以通過一些方法最小化持續時間。比如在更改 DNS 伺服器之前,我們可以修改解析記錄中的 TTL 值,將其設定得小一點。等TTL值更新後,再修改 DNS 伺服器。不過就算未傳播完,也不影響域名解析記錄的修改。即便 DNS 伺服器仍然是舊的,但是解析記錄會實時更新,網站內容也會是最新的。

當然了,若解析記錄修改之後,過了 TTL 時間發現還是存取到舊的記錄,可以嘗試清除一下本地 DNS 快取。或本地修改為公共 DNS (114.114.114.114/8.8.8.8)後再試一下。

DNS 傳播檢查

如果沒有工具來確定網站的 DNS 傳播是否已完成。可以通過幾種對原生的 DNS 進行 DNS 傳播檢查的方法來確認。例如,Windows、macOS 和 Linux 預設安裝了 nslookup,它可以顯示當前 DNS 伺服器的解析狀態。Dig 工具也是一個不錯的選擇。

除了本地查詢,其他外部 DNS 檢查需要通過選擇隨機伺服器並在那裡查詢 DNS 資訊來測試。由於伺服器分佈在世界各地,因此不能 100% 確定 DNS 傳播已在所有地方完成,但至少可以確認大致的傳播情況。例如,使用 Myssl 的 DNS 檢測工具(https://myssl.com/dns_check.html#dns_check),可以快速查出不同地區不同網路下域名解析的速度,及域名 DNS 資訊。

讀到這裡,大家是不是對 DNS 修改後不生效的問題有了答案呢?進行 DNS 伺服器或與域名系統相關的更改時,還是要優先考慮到 DNS 傳播。儘管可以通過 TTL 縮短傳播時間,但由於一些不穩定因素,仍然需要一些時間才能使全球的每臺伺服器都更改為最新狀態。

推薦閱讀

什麼是走索引?

關於 GIN 的路由樹