網頁設計

DNS 紀錄怎麼填寫?A、CNAME、MX、TXT 與生效時間一次看懂

多數人聽到 DNS設定,第一個想到的是手機或電腦網路設定裡那串 8.8.8.8。但網站換主機、信箱換服務時要動的 DNS,其實是另一份東西,一份放在網域那一側、記錄著「這個名稱要指到哪裡」的紀錄清單。

兩件事共用同一個縮寫,位置卻完全不同。裝置上的設定改了,網站不會因此換到新主機;在註冊商後台加了紀錄,如果網域早已交給別處管理,也沒有任何一台伺服器會讀到它。「明明填了,網站卻沒變」是很常見的求助說法,原因多半就在這裡。

而紀錄存在哪裡、由誰負責回答,正是動手改任何一筆紀錄之前最該先弄清楚的事。

DNS設定改的是網域紀錄,不是電腦上的 DNS 伺服器

「DNS設定」這個詞同時指兩件事。第一件在裝置上,電腦、手機或分享器的網路設定裡可以填入 DNS 伺服器的位址(例如公共 DNS 常見的 8.8.8.8),決定這台裝置遇到網址時要向誰詢問。第二件在網域上,替自己的網域設定紀錄,讓網站連到主機、讓信箱收得到信。網站換主機、信箱換服務時要動的是第二件,裝置上的設定不必碰。

網域這一側,管理者編輯的是一份存在名稱伺服器上的紀錄清單。每一筆紀錄都在回答同一個問題,也就是某個名稱的某種類型,答案是什麼。以龐果設計的官網為例,example.com 的 A 紀錄是 192.0.2.10,代表訪客問「example.com 在哪台主機」時,得到的是這個位址;example.com 的 MX 紀錄指向某台郵件伺服器,代表寄信的人問「這個網域的信要送去哪」時,得到的是那個主機名稱。

存放紀錄的一方和替使用者查詢的一方,是兩個不同的角色。RFC 1034 把 DNS 拆成三個主要元件:網域名稱空間與資源紀錄(也就是資料本身)、名稱伺服器(保存網域樹的結構與資料,對自己負責的那一段握有完整資訊,稱為該段的 authority),以及解析器(代使用者向名稱伺服器取資料的程式)。Cloudflare 的說明文件也這樣描述名稱伺服器的工作,它替自己負責的網域回答查詢,保存該網域的權威紀錄,並在解析過程中給出最終的答案。換句話說,名稱伺服器是握有答案的一方,解析器只是替使用者跑腿去問的一方。

裝置上填的 DNS 位址,指定的是跑腿的解析器,不是存放答案的名稱伺服器,兩邊各改各的,互不影響。Google Workspace 的說明文件提到,使用 Google 服務時,要依各服務的要求修改網域的 DNS 紀錄,例如改 MX 紀錄,把網域的信件導向 Google 的郵件伺服器,指的就是網域這一側的修改。

解析器遇到不認識的名稱時,會從根開始往下問,經過頂級網域(TLD)的名稱伺服器,一路問到負責該網域的那一組。逐層查詢的細節屬於基本概念,對設定紀錄來說,最後負責回答的,永遠是網域目前登記的那一組名稱伺服器。

DNS 查詢由解析器逐層詢問根、TLD 與網域的名稱伺服器,最終答案來自網域登記的 NS
裝置上填的 DNS 位址只決定由哪個解析器跑腿,網域紀錄要改在 NS 指向的名稱伺服器上。

DNS 代管的位置由網域目前指向的名稱伺服器決定

「後台明明加了紀錄,為什麼沒用」,最常見的原因是網域在哪裡買,和 DNS 紀錄在哪裡管,其實是兩個不同的地方。

根據 ICANN 的說明,網域是向 ICANN 認證的註冊商(或其經銷商)註冊的;註冊商負責辦理註冊,registry 則負責維護各 TLD 的註冊資料,並提供名稱伺服器來發布 zone 資料。費用、轉移、續約這些條款,由你與註冊商之間的合約規範。「買網域的地方」與「管 DNS 的地方」本來就是兩個角色,只是經常由同一家提供,才讓人以為是同一件事。

真正算數的,是網域目前登記的名稱伺服器(NS)。NS 指向哪裡,世界各地的查詢就會被送到哪裡,其他地方加的紀錄不會被採用。舉個典型情境,龐果設計在註冊商後台新增了 example.com 的 A 紀錄,卻忘了網域的 NS 早已改指到 Cloudflare。於是查詢全被送到 Cloudflare,註冊商那份清單沒有人來讀,新增的紀錄自然沒有任何效果。

註冊商、主機商與 Cloudflare 三種常見的代管形式

紀錄可能放在三種地方,沒有哪一種天生比較好,差別只在紀錄要到哪裡改。表中 NS 的值用 RFC 2606 保留的示範網域代替,實際值由各平台指定,不能照抄。

代管形式什麼情況下是這種形式NS 的樣子(示範值)紀錄要到哪裡改更換時要留意
註冊商提供的 DNS網域註冊後沒改過 NSns1.example.com註冊商的 DNS 管理介面換註冊商時,先確認紀錄一併帶走
主機商提供的 DNSNS 改成主機商給的那一組ns1.example.net主機商後台換主機時,先確認紀錄一併帶走
第三方 DNS 代管(如 Cloudflare)NS 改成該平台給的那一組ns1.example.org該平台的 DNS 頁面換 NS 前先抄齊紀錄並處理 DNSSEC

DNS 放在主機商的人要特別注意,那份紀錄清單不會自動跟著網域走,換主機之前得先確認所有紀錄都已經抄出來,否則換完 NS 就等於把原本的紀錄丟掉。

Cloudflare 把這件事分成不同的設定方式。Primary(Full)setup 是把 Cloudflare 當成主要的 DNS 提供者,紀錄全部在 Cloudflare 管理;CNAME(partial)setup 則是保留原本的 DNS 提供者,只讓個別子網域走 Cloudflare 的代理,這種方式要 Business 以上的方案才有,Free 與 Pro 方案只有 Full setup。另外,向 Cloudflare Registrar 註冊的網域,會自動使用 Cloudflare 的權威 DNS,這正是「註冊商與 DNS 代管可以是同一家」的一個實例。

先查 NS 紀錄,確認該登入的後台

不確定自己現在是哪一種形式,用一行指令就能查出來:

nslookup -type=NS example.com
dig example.com NS +shortCode language: plaintext (plaintext)

兩條指令擇一即可,example.com 換成自己的網域。看到的名稱伺服器屬於誰,就到誰的後台改紀錄。

如果連註冊商是誰都不確定,可以用 ICANN Lookup 查詢。NS 查到的是「DNS 在哪」,ICANN Lookup 查到的是「網域向誰註冊」,兩者可能是不同的對象,登入哪個後台改紀錄,以 NS 的結果為準。

更換名稱伺服器前,先抄齊既有紀錄並關閉 DNSSEC

把 DNS 從註冊商搬到 Cloudflare 這類第三方代管時,最常造成網站或信箱斷線的,是搬過去的紀錄不完整,或是 DNSSEC 沒先處理。以下用 Cloudflare 的流程當示範,其他代管業者的介面名詞不同,背後的邏輯是一樣的。

Cloudflare 的設定流程依序是:

  1. 在新的代管處新增網域,建好全部紀錄(可以選自動掃描,或手動新增)。
  2. 到註冊商關閉 DNSSEC。
  3. 移除舊的名稱伺服器,填入新代管給的那一組,名稱必須逐字相同。
  4. 等待生效。
  5. 確認網域狀態變成 Active。

順序不能顛倒,每一步都有原因。自動掃描匯入的紀錄,Cloudflare 明確表示不保證找到所有既有的 DNS 紀錄,所以掃完一定要人工核對:根網域的網站紀錄(A、AAAA 或 CNAME,內容取決於網站所在的主機商)、www 與其他子網域,以及 Email 相關的紀錄(MX、SPF、DKIM、DMARC)。Cloudflare 的範例中,Email 紀錄包含 mail 的 A 紀錄、MX、_dmarc 的 TXT、*._domainkey 的 TXT 與 SPF 的 TXT,實際的值則依郵件服務商而定。其中漏抄 MX,信箱就會直接斷線。

還有一點容易疏忽。NS 一換,舊 DNS 後台裡的紀錄就不再被採用,所以「舊後台還留著那些紀錄」不代表安全。至於 DNSSEC,Cloudflare 的原話是,在 DNSSEC 啟用的狀態下更換名稱伺服器,網域可能變得無法連上,因此要先在註冊商關閉;等網域狀態變成 Active 之後,再回 Cloudflare 重新開啟。名稱伺服器要逐字複製,則是因為少一個字元,網域就無法正確解析。

等待時間要如實看待,因為 Cloudflare 的文件給了兩個不同的說法。設定頁寫的是最多等 24 小時,等註冊商更新名稱伺服器,完成時會收到 Cloudflare 的通知信;另一份 DNS 最佳實務的學習路徑則寫,名稱伺服器變更的傳遞通常從幾分鐘到 48 小時不等。兩個數字不必硬合併成一個,以自己網域狀態是否變成 Active 為準。確認時可以用 dig example.com NS @8.8.8.8 與 dig example.com NS @1.1.1.1 檢查兩個公共解析器是否一致回報新的名稱伺服器,生效之後再測 A 與 MX 這些關鍵紀錄。

每筆紀錄都由主機名稱、類型、值與 TTL 組成

不同後台把欄位叫成不同的名字,是新手最容易填錯格的原因。一筆紀錄的結構其實很固定:名稱(這筆紀錄屬於誰)、類型(問的是哪一種資料)、值(答案)與 TTL(這個答案可以被快取多久)。MX、SRV 這兩種類型則多了優先順序之類的欄位。

一筆 DNS 紀錄由名稱、類型、值與 TTL 組成,MX 另有優先順序,名稱欄填 @ 或 www 這類相對名稱
各家後台欄位名稱不同,對應回名稱、類型、值、TTL 四個概念就不會填錯格。
概念在管什麼後台常見的叫法
名稱這筆紀錄屬於哪個名稱Name、Host、主機、別名
類型問的是哪一種資料Type、類型
值查詢得到的答案Value、Content、Target、Answer、目的位置
TTL答案可以被快取多久TTL

Microsoft Learn 就提醒過,Target 欄位在不同註冊商可能叫 Content、IP Address、Target Host 或 Value。名稱不同,位置和作用都一樣,照上表對應就不會填錯格。

Cloudflare 的文件還補充了幾條名稱的限制。Name 可以是子網域,也可以是 zone apex(用 @ 表示);每一段標籤(label)不超過 63 個字元,完整的網域名稱不超過 253 個字元;建議只用字母、數字與連字號(LDH)。底線在 DNS 裡是合法的,常用在服務類的紀錄,像 Email 驗證會用到的 _dmarc 與 _domainkey。

@、www 與子網域的主機名稱寫法

名稱欄填的是「相對名稱」,不是完整的網域:

  • @ 代表網域本身,也就是根網域 example.com。
  • www 代表 www.example.com。
  • blog 代表 blog.example.com。

RFC 1035 對這點有明確規定,不以句點結尾的名稱是相對名稱,會與 origin 串接;以句點結尾才是絕對名稱。後台自動補上網域,就是這個機制在運作。

有些後台要求「留空」而不是填 @。Google Workspace 的 MX 說明寫的是名稱欄「留空或輸入 @」,要替子網域設定時,則填子網域的值,例如 support;Microsoft 在 SRV 的說明裡也提到,如果後台不接受 @,就把欄位留空。Google 談 TXT 紀錄時也是同樣的規則,主機是網域本身而不是子網域時,指定 @。遇到後台的寫法不同,以後台的欄位提示為準。

值欄位的格式與結尾句點

值欄位依類型填不同的東西:A 與 AAAA 填 IP,CNAME、MX、NS 填主機名稱,TXT 則填整段文字。

同樣的值,各家後台要求的格式並不一致。Google 的 MX 設定說明提到,有些註冊商要求在結尾加半形句點(smtp.google.com.),有些則把優先順序和目的位置放在同一行(1 smtp.google.com)。Microsoft Learn 也有類似的提醒,有些註冊商要求 Target 欄以句點結尾,要向註冊商確認。結尾句點要不要加,沒有通用答案,照服務商給的值填,格式不對再依後台的說明調整。

TTL 與優先順序兩個數字欄位

TTL 的單位是秒,3600 是 1 小時,86400 是 24 小時。TTL 越長,查詢越容易命中快取,網站解析也就越快,但紀錄更新後要等越久才會全面生效。Cloudflare 的 Auto 是 300 秒;走代理(Proxied)的紀錄,TTL 固定為 Auto,無法編輯,DNS only 的紀錄則可以設定 60 秒(非 Enterprise 方案)到 1 天。TTL 該設多少,取決於紀錄多常變動。

優先順序只出現在 MX 與 SRV。RFC 1035 把 MX 的 PREFERENCE 定義成 16 位元的整數,數值越低越優先,主要用來安排備援。

A、AAAA 與 CNAME 負責把網站指向主機

網站要連上主機,只會用到三種紀錄,選哪一種取決於主機商或平台給的是「IP」還是「主機名稱」。對方給 IP 就用 A(IPv6 則用 AAAA),給主機名稱就用 CNAME。Cloudflare 的說明也指出,根網域所需的紀錄類型(A、AAAA 或 CNAME)與內容,取決於託管網站或應用程式的提供者。

以下是龐果設計官網的範例,IP 只用 IETF 保留給文件與範例的位址。192.0.2.10 來自 RFC 5737 的 TEST-NET-1,2001:db8::10 則來自 RFC 3849 的 IPv6 文件前綴。

名稱類型值
@A192.0.2.10
@AAAA2001:db8::10
wwwCNAMEexample.com
blogCNAMEsites.example.net

實際填寫時,把值換成主機商或平台提供的內容。A 與 AAAA 的值是主機(origin)的位址,不是 Cloudflare 的 IP,Cloudflare 的文件明確說明這一欄不可以填 Cloudflare 的位址。

A 與 AAAA 把名稱指向 IPv4 與 IPv6 位址

A 對應 IPv4,AAAA 對應 IPv6,兩種紀錄都可以讓同一個名稱對應到一個或多個位址,每一筆都會被當成有效答案。以範例來說,根網域 @ 的 A 紀錄填 192.0.2.10,訪客輸入 example.com 就會連到這台主機。

主機如果沒有 IPv6,就不要補 AAAA。補了卻不通,只有走 IPv6 的訪客會連不上,其他人看起來一切正常,排查起來特別費工。

CNAME 是另一個主機名稱的別名,不能與其他紀錄並存

CNAME 的意思不是「轉址」,而是「這個名稱是另一個名稱的別名,查它就等於查那個」。平台指定主機名稱、IP 又可能變動的時候最適合用,例如把 www 設成 CNAME 指向 example.com,或指向平台給的主機名稱。Cloudflare 的文件說明,CNAME 可以串接多層,但最後必須指向一個有有效 A 或 AAAA 的主機名稱,否則解析不出 IP。

CNAME 有一條最重要的限制,同一個名稱底下,CNAME 不能與其他紀錄並存。RFC 1034 第 3.6.2 節寫明,節點上有 CNAME 就不應該再有其他資料,以免規範名稱與別名的資料不一致;RFC 1912 第 2.4 節更直接點名,MX、A 甚至 TXT 都不能與 CNAME 共存;RFC 2181 第 10.1 節只替 DNSSEC 相關的紀錄開了例外,任一名稱底下要不就是 1 筆 CNAME,要不就是沒有 CNAME 的其他紀錄。另外,Cloudflare 提醒,CNAME 如果指到另一個 Cloudflare 帳號,會出現 Error 1014。

www 與根網域需要各自一筆紀錄

example.com 與 www.example.com 在 DNS 裡是兩個不同的名稱,不會自動互通。只設了其中一個,另一個就打不開,這是很常見的狀況。Cloudflare 的建議是,即使不需要特定的子網域,也至少設定 www,因為有 www 紀錄,訪客在網址前面打 www 才找得到網站。

常見的搭配有兩種,一種是根網域放 A、www 用 CNAME 指回根網域,另一種是兩個名稱各自放 A。www 通常指向與根網域相同的內容,或者設定成轉址,轉址本身由主機或平台處理,不在 DNS 裡設定。因為是兩個名稱,驗證時也要分別查,不能查了其中一個就當作另一個也好了。

blog、shop 等子網域指向各自的服務

同一個網域底下,blog、shop、support 可以各自指到不同的主機或平台。Cloudflare 的說明文件建議,要在子網域放內容,先確認主機商能服務該主機名稱(<subdomain>.example.com),再建立對應的 A、AAAA 或 CNAME,名稱欄填子網域標籤,例如 blog、www、store。對方還沒設定好之前,紀錄指過去也連不上。子網域如果要整個交給別人管理,則改用 NS 委派。

使用 Cloudflare 時多出代理狀態欄位

DNS 放在 Cloudflare 時,A、AAAA、CNAME 會多一個代理開關。Proxied(橘雲)時,網頁流量會經過 Cloudflare 的網路,享有快取與 DDoS 防護等功能;DNS only(灰雲)時,Cloudflare 只回覆紀錄的值,不代理流量。

這個欄位常被忽略,後果是郵件主機或驗證用的 CNAME 被誤開了代理。Cloudflare 的建議是,驗證第三方服務網域的 CNAME 用 DNS only,Cloudflare 的 Email 範例中,mail 的 A 紀錄也是 DNS only。另外要知道,只有 A、AAAA、CNAME 這類 IP 解析紀錄能走代理,MX 與 TXT 不行;走代理的紀錄 TTL 固定為 Auto(300 秒),是為了讓 anycast IP 有異動時能快速生效。

走代理的紀錄還有一個容易嚇到人的現象。查詢 A 紀錄時,看到的是 Cloudflare 的位址,不是自己主機的 IP。這是正常的,代表代理正在運作,不要誤判成設錯。

根網域不能放 CNAME,改用 flattening 或 ALIAS

不少平台只給主機名稱,要求使用者設 CNAME;但想把根網域(@)也指過去時,後台常會直接拒絕。原因在於 CNAME 所在的名稱不能有其他資料,而根網域一定同時有 SOA 與 NS,信箱的 MX 也常掛在根網域底下,所以在根網域放 CNAME 就會和這些紀錄衝突。

實務上有三條出路:

  1. 平台如果同時提供 IP,就改用 A。
  2. DNS 代管若有 CNAME flattening、ALIAS 或 ANAME 這類「根網域別名」功能,就用它。
  3. 兩者都沒有的時候,把根網域轉址到 www。

Cloudflare 採用的是 CNAME flattening,它會找出 CNAME 最終指向的 IP(可能需要多次查詢),回應時給的是這個 IP,而不是 CNAME 本身。在根網域設定 CNAME 時,這個功能預設自動啟用,各種方案都一樣。同類的機制在各家叫法不同,ALIAS、ANAME、apex alias、Route 53 的 alias 與 CNAME flattening 都是;它們的共通點是解析設定的目標,再用目標的位址回答根網域的查詢,但控制資料的方式、失敗時的行為與 TTL 政策各家不同。這類功能目前沒有統一的標準,也不是每個 DNS 代管都支援,需要使用時,要查自己 DNS 代管的說明文件。

子網域可用 CNAME 指向平台主機名稱,根網域因已有 SOA、NS 與 MX 不能放 CNAME,需改用 A、flattening 或轉址
根網域放 CNAME 會和 SOA、NS 衝突,平台只給主機名稱時,改用 A、CNAME flattening 或轉址到 www。

用 flattening 時,要留意兩個陷阱:

  1. 付費方案可以選擇讓所有 CNAME 都 flatten,但如果第三方服務用 CNAME 來驗證網域,flatten 之後驗證方看不到 CNAME 本體,驗證可能因此失敗。
  2. CNAME 最終的目標如果沒有 A 或 AAAA(也就是目標已失效),flatten 會回傳空答案(NODATA),看起來就像紀錄一直沒生效。

Email 要設的紀錄包括 MX、SPF、DKIM 與 DMARC

信箱相關的 DNS設定集中在四組紀錄。MX 管「信往哪裡送」,SPF、DKIM、DMARC 則管「寄出去的信是不是真的從這個網域來」。設定順序是先 MX,再 SPF、DKIM,最後 DMARC,因為 DMARC 要建立在 SPF 與 DKIM 之上。所有的值都以信箱服務商後台給的為準,DKIM 金鑰這類每個網域專屬的值,不能照抄範例。

信箱的 DNS 設定依序是 MX、SPF、DKIM、DMARC,各有固定的紀錄類型、名稱與填寫重點
MX 決定信往哪裡送,SPF、DKIM、DMARC 依序設定,負責證明寄出的信真的來自這個網域。

MX 紀錄指定收信伺服器與優先順序

MX 通常放在根網域,名稱填 @ 或留空,值是收信伺服器的主機名稱,優先順序的數字越小越優先。依 RFC 2181 與 RFC 1035,MX 的值必須是有位址紀錄的主機名稱,不能填 IP,也不能指向 CNAME。換信箱服務時,舊的 MX 要刪掉,否則信會繼續送去舊系統,或是被分流。

SPF 只能有一筆,查詢次數也有上限

SPF 是放在根網域的一筆 TXT,以 v=spf1 開頭,列出有資格代表這個網域寄信的伺服器。Google Workspace 的寫法如下:

v=spf1 include:_spf.google.com ~allCode language: plaintext (plaintext)

依 RFC 7208,同一個名稱下出現 2 筆 v=spf1 紀錄,驗證結果就是 permerror,要用多個寄信服務時,把 include 合併進同一筆。include、a、mx 這類項目會計入 DNS 查詢次數,被 include 進來的紀錄也要一起累計,ip4、ip6 則不計入,總數超過 10 次,同樣會失敗。

DKIM 公開金鑰放在 _domainkey 子網域

DKIM 的公開金鑰放在 <selector>._domainkey 這個名稱底下(RFC 6376),名稱和值都由信箱服務產生。Google Workspace 用 1 筆 TXT,Microsoft 365 用 2 筆 CNAME,照後台給的內容建立即可。2048 位元的金鑰很長,部分後台會限制 TXT 的長度,貼上後要讀回來核對是否完整。

DMARC 紀錄放在 _dmarc,政策從 none 開始

DMARC 是 _dmarc 子網域的一筆 TXT(RFC 7489),規定 SPF、DKIM 沒通過的信該怎麼處理,並請收信方寄回統計報表。SPF 與 DKIM 穩定運作之後,再以 p=none 起步:

v=DMARC1; p=none; rua=mailto:[email protected]Code language: plaintext (plaintext)

確認合法的寄件來源都通過驗證,再逐步調整為隔離(quarantine),最後才是拒絕(reject)。

網域驗證 TXT 與 CAA、SRV、NS 的填寫方式

除了網站與 Email,網域還會遇到幾類比較少動、卻常被服務商要求的紀錄。依 Cloudflare 的定義,TXT 是以雙引號包住的一或多段文字,通常用來證明網域的擁有權;CAA 指定哪些憑證機構(CA)可以替網域簽發憑證;SRV 指定特定服務(像 VoIP、即時通訊)使用的主機與連接埠;NS 則指定由哪一組伺服器負責權威 DNS,只有在設定子網域,或是把子網域委派出去時,才需要加進紀錄表。

類型名稱值(示範)用途
TXT@服務商給的整段文字證明網域擁有權
CAA@0 issue "ca.example.net"限定可以簽發憑證的機構
NSblogns1.example.net把子網域交給別處管理
SRV_sipfederationtls._tcp100 1 5061 sipfed.online.lync.com指定服務的主機與連接埠

網域擁有權驗證的 TXT 可與 SPF 並存

Google、Microsoft 等服務為了確認網域是你的,會給一段文字,要求新增成 TXT。很多人看到前面「SPF 只能 1 筆」,就誤以為根網域不能有第二筆 TXT。實際上,受限的只有「以 v=spf1 開頭」的那種紀錄,驗證用的 TXT 可以和 SPF 並存在同一個 @ 底下。

填法很單純,類型選 TXT,主機填 @,值把服務商給的整段文字貼上。RFC 7208 第 4.5 節是這麼規定的,解析器取回紀錄集之後,會先丟棄不以 v=spf1 開頭的紀錄,剩下的如果多於 1 筆,結果才是 permerror。Google 建議同一個網域的 TXT 紀錄不要超過 200 筆,這是大多數網域支援的上限;Microsoft 則表示,網域驗證用的這筆 TXT 只用來確認擁有權,不影響其他設定。

CAA 限定可以簽發憑證的機構,一般網站不一定要設

CAA 是網域擁有者交給憑證機構(CA)的一份授權清單。RFC 8659 規定,合規的 CA 在簽發憑證之前,必須先檢查網域是否發布了相關的 CAA 紀錄;如果有,除非確認請求與 CAA 一致,否則不得簽發。如果紀錄集中沒有任何限制簽發的屬性標籤,CAA 就不構成限制。所以一般網站不一定需要設 CAA,沒有設定時,不會影響憑證的簽發。

格式範例如下:

example.com.  CAA  0 issue "ca.example.net"Code language: plaintext (plaintext)

issue 指定可以簽發一般憑證的機構,issuewild 針對萬用字元憑證,issue ";" 則代表不允許任何 CA 簽發。真的要設的人,最容易出事的是限制得太嚴,結果連自己的主機商或憑證服務都發不出憑證。設定之前,先向憑證服務確認它所使用的 CAA 識別字串,再填進紀錄。

SRV 指定服務連接埠,NS 把子網域交給別處

SRV 與子網域的 NS 屬於進階紀錄,但偶爾會遇到。SRV 讓某項服務找到正確的主機與連接埠,名稱格式是 _service._proto.name,值依序是優先順序、權重、連接埠、目標主機。RFC 2782 的完整格式為 _Service._Proto.Name TTL Class SRV Priority Weight Port Target,服務名稱前加底線,是為了避免與自然出現的 DNS 標籤衝突。

後台的欄位不一定齊全,Microsoft 提供了變通做法,沒有「服務」與「協定」欄位時,把 _sipfederationtls._tcp 直接寫進主機名稱欄;沒有優先順序、權重、連接埠欄位時,依序把數字寫進目標欄,例如 100 1 5061 sipfed.online.lync.com。有些後台還要求目標結尾加句點,欄位的名稱也各家不同,以後台的說明為準。

子網域的 NS,則是把 blog.example.com 整個交給另一組名稱伺服器管理,例如 blog 這個名稱的 NS 值填 ns1.example.net。Cloudflare 的說明指出,想讓子網域的 DNS設定完全在 Cloudflare 之外、由沒有 Cloudflare 帳號權限的人管理,才需要用到委派。依 RFC 1912,同一個委派建議不超過 7 個名稱伺服器,Cloudflare 本身的上限是 10 筆。

紀錄生效的時間取決於 TTL 與快取

「改了要等多久」,常被一句「最多 48 小時」帶過。實際決定等待時間的是快取,各地的解析器各自把舊答案存著,存到 TTL 到期才會重新來問。所以「生效」並不是全球 DNS 同步完成的那一刻,而是各地快取陸續到期、重新查到新答案的過程。

Google 的 DNS 基礎知識說明,TTL 是 DNS 紀錄中的值,定義紀錄後續變更生效前的秒數。紀錄目前的 TTL,決定現在所做的變更需要多久才會生效,例如 TTL 為 86400 秒,變更最多要 24 小時。Google 建議平時 TTL 設為 3600;計畫要改動之前,先調成 300 秒,萬一需要快速還原也來得及;改好、確認無誤之後,再改成 86400。

有一點容易搞錯。調短 TTL 只對「下一次」更新有用。Google 的說明指出,較短的 TTL 只會在先前的時間到期後生效,已經被快取的舊答案,仍然照舊的 TTL 過期。假設現在的 TTL 是 86400 秒,換主機前一天才調成 300 秒,那麼調整前剛被快取的舊答案,仍可能保留最久 24 小時,所以要提早調。

DNS 紀錄的 TTL 平時設 3600 秒,改動前調成 300 秒,確認後改為 86400 秒,舊快取仍照原 TTL 過期
調短 TTL 只對下一次更新有效,已被快取的舊答案仍照舊的 TTL 過期,所以要提早調(資料來源:Google Workspace 說明中心)。

各類紀錄的等待上限,說明文件給的數字並不相同,如實列在下表:

變更內容說明文件給的等待時間出處
更換名稱伺服器最多等 24 小時Cloudflare 設定頁
更換名稱伺服器通常從幾分鐘到 48 小時Cloudflare 學習路徑
MX最多 72 小時內辨識完成Google
SPF最多可能需要 48 小時Google
DKIM新增後最多 48 小時才會運作Google

更換名稱伺服器的兩個數字都出自 Cloudflare,實際仍以網域狀態變成 Active 為準。

「查不到」也會被快取。紀錄還不存在時被人查詢,「不存在」這個答案會依 SOA 的負向快取設定被存起來,RFC 2308 對此有規範,Cloudflare SOA 紀錄中負向快取的 Minimum TTL 預設是 1800 秒。所以建好紀錄之前,不要反覆去查,否則「不存在」這個答案可能被快取起來,反而讓自己更晚看到新紀錄。

用 nslookup 與 dig 驗證紀錄

改完紀錄,不要只靠瀏覽器重新整理,直接向名稱伺服器查詢最準確。nslookup 在 Windows、macOS、Linux 都有,dig 的輸出更精簡,也方便指定要詢問哪台伺服器。環境裡沒有 dig 時,可以用 nslookup,或是 Google Admin Toolbox 的 Dig 工具,Google 的 MX 說明就提到過。至於網頁式的 DNS 查詢工具,Cloudflare 提醒,多半使用快取的查詢結果,更新可能慢一步。

以下的指令都以 example.com 為例,換成自己的網域即可。

nslookup 查詢各類紀錄的指令

依 Microsoft Learn 的 nslookup 說明,非互動模式的第一個參數是要查的名稱,第二個參數是指定的 DNS 伺服器,省略就用預設值。-type= 指定紀錄類型。常用的查詢如下:

  • 名稱伺服器:nslookup -type=NS example.com
  • IPv4 位址:nslookup -type=A example.com
  • IPv6 位址:nslookup -type=AAAA example.com
  • 別名:nslookup -type=CNAME www.example.com
  • 收信伺服器:nslookup -type=MX example.com
  • 文字紀錄(含 SPF):nslookup -type=TXT example.com
  • DMARC:nslookup -type=TXT _dmarc.example.com
  • DKIM:nslookup -type=TXT google._domainkey.example.com
  • 指定向 1.1.1.1 詢問:nslookup -type=MX example.com 1.1.1.1

在 Windows 上,如果查回來的結果看起來對不上,例如出現與網域無關的 SOA,可能是系統自動在名稱後面補上本機的網域尾碼。這時在網域名稱結尾加一個句點,寫成 example.com.,代表這是完整的網域名稱,系統就不會再補尾碼。

用 nslookup 向 1.1.1.1 查詢 example.com,結果顯示 NS 指向 Cloudflare,TXT 中的 SPF 與另一筆 TXT 並存
向公共解析器查詢會得到「未經授權的回答」,查 NS 就知道紀錄該到哪個後台改(Windows 實際執行輸出,依原文重新排版)。

Windows 本機還可以用 ipconfig /flushdns 清除並重設 DNS 用戶端的解析器快取,Microsoft 說明這個指令在疑難排解時,可以用來丟棄負向快取項目與其他動態新增的項目。

dig 向公共解析器與權威名稱伺服器查詢的指令

dig 的語法是 dig [@server] [-t type] [name] [type],@server 是要詢問的名稱伺服器,預設查詢類型是 A,加上 +short 就只輸出精簡的答案。

dig example.com A +short
dig example.com MX +short
dig example.com TXT +short
dig _dmarc.example.com TXT +short
dig example.com NS +short
dig example.com NS @8.8.8.8
dig example.com NS @1.1.1.1Code language: plaintext (plaintext)

除了公共解析器,還可以直接問網域的權威名稱伺服器,繞過各地快取,確認「紀錄本身有沒有改成功」。做法是先用 dig example.com NS +short 取得名稱伺服器的名稱,再詢問那一台:

dig example.com A @ns1.example.netCode language: plaintext (plaintext)

其中的 ns1.example.net,要換成上一步查到的實際名稱。權威伺服器對自己負責的區段握有完整資訊,回答的是目前紀錄本身,不受解析器快取影響。

查詢結果要核對的 3 個重點

同樣一份輸出,要知道看哪裡。核對順序可以記成三步:

  1. NS 是否為預期的代管:名稱伺服器要和自己正在編輯的後台對得上。
  2. 值是否與服務商給的逐字相同:MX 要核對優先順序與主機,TXT 要確認沒有被截斷、沒有多餘的空格。
  3. 不同解析器的答案是否一致:一致,才算生效。

不同解析器的答案不一樣,通常是快取還沒到期,不是設錯,回頭對照 TTL 那一節的時間就能判斷。Cloudflare 的學習路徑也提醒,要看的是 Cloudflare 的名稱伺服器有沒有被一致地回報。

DNS設定的常見錯誤集中在填寫格式與殘留的舊紀錄

DNS設定出問題時,紀錄看起來通常都填了,只是填法有誤,或是殘留的舊紀錄讓結果和預期不同。

主機名稱欄被重複補上網域

症狀是紀錄列表裡出現 example.com.example.com 這樣的名稱,查詢時自然找不到。原因是很多後台會自動在名稱後面補上網域,使用者又填了完整的網域,結果被補了兩次。

修法是名稱欄填相對名稱就夠了,像 @、www、_dmarc。如果後台明確要求填完整名稱,就照辦,再用查詢指令複核。新增之後,也要看紀錄列表實際顯示的完整名稱。Google 談 DMARC 時也提醒,部分網域代管商會自動加上網域名稱,新增或更新 TXT 後,要確認紀錄的網域名稱格式正確。

舊的 A 或 MX 紀錄沒有刪除

症狀是網站時好時壞,或是信有時收得到、有時收不到。原因是新增了新紀錄,卻沒刪舊的,A 紀錄有 2 個 IP,訪客有一部分會連到舊主機;MX 有 2 台,信一部分進了舊系統。Cloudflare 的文件說明,A 與 AAAA 可以對應到一或多個位址,所以並存不會被拒絕,也不會有警告。

修法是搬完、確認無誤之後,明確刪掉舊的。MX 也是同樣的道理,Google 與 Microsoft 的說明都要求移除舊 MX,或是把舊的排在後面。刪除之前,先確認舊系統裡的資料都已經搬完,尤其是舊信箱裡的郵件。

TXT 的引號、換行與長度出錯

TXT 的值是一整段文字,貼上時常被後台加引號、換行,或是被截斷。症狀通常是驗證一直失敗,或是 SPF、DKIM 看起來設了卻沒作用。

Cloudflare 的規則是,TXT 內容由一或多段以雙引號包住的文字組成,引號不一致(例如 "this 或 "these" ones")會導致驗證錯誤;新紀錄如果沒有帶引號,Cloudflare 會自動補上雙引號。長金鑰(像 2048 位元的 DKIM)還會受到單段字串長度和後台限制影響,Google 就提醒部分網域供應商會限制 TXT 的長度。背景知識是,RFC 1035 規定單段字串最長 255 個字元(含長度位元組共 256 個八位元組),長值會被拆成多段,後台通常會自動處理,不需要手動拆。

修法是貼完之後,一定要用查詢指令把結果讀回來,與服務商給的內容逐字比對。

已停用服務的 CNAME 仍留在紀錄裡

子網域曾經指到某個平台,服務不用了、帳號也關了,DNS 的 CNAME 卻還留著。輕的情況是解析出空答案,像前面 flattening 遇到目標失效時回傳的 NODATA,看起來就像紀錄尚未傳遞。重的情況是這筆留下來的紀錄,成了被他人接管子網域的缺口。

修法是停用服務的同時,也刪掉對應的 DNS 紀錄,並且定期盤點子網域,確認每一筆紀錄背後的服務還在運作。

紀錄正確卻仍看到舊結果時的排查順序

紀錄看起來都對,卻還是看到舊的結果時,照下面的順序走,就不會亂改:

  1. NS 是否指向正在編輯的後台:用 nslookup 查 NS 類型,確認改的地方是對的。
  2. 直接問權威名稱伺服器:用 dig 指定那一台,看新值在不在。
  3. 換幾個公共解析器查:用 dig 分別指定兩個公共解析器,看答案是否一致。
  4. 等 TTL 與負向快取到期:對照前面的生效時間,別在到期前反覆修改。
  5. 清本機快取:在 Windows 執行 ipconfig /flushdns。
  6. 只有特定網路或裝置得到錯誤答案:才往 DNS 劫持、污染的方向查。
DNS 紀錄看似正確卻沒生效時,依序確認 NS、權威名稱伺服器、公共解析器與快取,最後才查劫持與污染
多數沒生效的狀況,在確認改對地方與等快取到期這兩步就能找到原因,不必反覆修改紀錄。

下一次 DNS設定看起來沒生效,先別急著再改一次紀錄。先確認改對了地方,再看快取有沒有過期,多數時候,問題在這兩件事裡就能找到,不必動到紀錄本身。DNS 的紀錄只是一份清單,真正決定結果的,是誰在回答,以及舊答案還在不在。

常見問答

本區問答由 AI 依文章內容自動整理,僅供快速參考,正式內容仍以全文為準。

DNS設定改電腦的 DNS 和改網域紀錄有什麼不同?

裝置上填的 DNS 位址(例如 8.8.8.8)只決定這台裝置向哪個解析器詢問;網域的 DNS 紀錄則存在名稱伺服器上,決定網站連到哪台主機、信要送去哪。網站換主機或信箱換服務時要改的是網域紀錄,裝置上的設定不必碰。

DNS 紀錄加了卻沒生效,該怎麼確認要改哪個後台?

DNS 紀錄要到網域目前登記的名稱伺服器(NS)所屬的後台改,其他地方加的紀錄不會被採用。用 dig example.com NS +short 查出名稱伺服器,屬於誰就到誰的後台改。

網站該用 A 紀錄還是 CNAME 紀錄?

網站用 A 還是 CNAME,取決於主機商或平台給的內容:給 IP 就用 A(IPv6 用 AAAA),給主機名稱就用 CNAME。A 的值是主機(origin)的位址;CNAME 的目標最後必須能解析到 A 或 AAAA。

根網域可以設定 CNAME 紀錄嗎?

根網域不能放 CNAME,因為 CNAME 不能與其他紀錄並存,而根網域一定有 SOA 與 NS。平台有給 IP 就改用 A,DNS 代管有 CNAME flattening、ALIAS 或 ANAME 就用它,都沒有就轉址到 www。

一般網站一定要設定 CAA 紀錄嗎?

一般網站不一定要設 CAA 紀錄。依 RFC 8659,CA 簽發憑證前會檢查 CAA,紀錄集中沒有限制簽發的標籤就不構成限制。真的要設時,先向憑證服務確認它的 CAA 識別字串,避免限制太嚴、連自己的憑證都發不出來。

同一個網域可以有兩筆 SPF 紀錄嗎?

同一個網域只能有 1 筆 SPF,同一名稱下出現多筆 v=spf1 紀錄,驗證結果是 permerror。要用多個寄信服務,就把 include 合併進同一筆;網域驗證用的其他 TXT 則可以和 SPF 並存。

SPF 的 10 次 DNS 查詢上限怎麼計算?

SPF 的 include、a、mx 這類項目都會計入 DNS 查詢次數,被 include 進來的紀錄也要一起累計,ip4、ip6 則不計入,總數超過 10 次,驗證結果就是 permerror。

DMARC 紀錄的政策為什麼建議從 p=none 開始?

DMARC 從 p=none 開始,是先收集報表、確認合法的寄件來源都通過 SPF 或 DKIM 驗證,再逐步改為 quarantine,最後才是 reject。設定前要先讓 SPF 與 DKIM 穩定運作。

DNS 紀錄改完通常要等多久才會生效?

DNS 紀錄的生效時間取決於舊紀錄的 TTL,TTL 為 86400 秒時,改了最多可能要等 24 小時。計畫改動前先把 TTL 調成 300 秒,但調短只對下一次更新有用,已被快取的舊答案仍照舊 TTL 過期,所以要提早調。

怎麼用 dig 確認 DNS 紀錄已經改成功?

用 dig 直接問網域的權威名稱伺服器最準,例如 dig example.com A @ns1.example.net,回答不受快取影響。再分別指定 @8.8.8.8 與 @1.1.1.1 兩個公共解析器查詢,答案一致才算生效。

資料來源
  1. RFC 1034: Domain Names - Concepts and Facilities — IETF
  2. RFC 1035: Domain Names - Implementation and Specification — IETF
  3. RFC 1912: Common DNS Operational and Configuration Errors — IETF
  4. RFC 2181: Clarifications to the DNS Specification — IETF
  5. RFC 2308: Negative Caching of DNS Queries (DNS NCACHE) — IETF
  6. RFC 2606: Reserved Top Level DNS Names — IETF
  7. RFC 2782: A DNS RR for specifying the location of services (DNS SRV) — IETF
  8. RFC 3849: IPv6 Address Prefix Reserved for Documentation — IETF
  9. RFC 5737: IPv4 Address Blocks Reserved for Documentation — IETF
  10. RFC 6376: DomainKeys Identified Mail (DKIM) Signatures — IETF
  11. RFC 7208: Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1 — IETF
  12. RFC 7489: Domain-based Message Authentication, Reporting, and Conformance (DMARC) — IETF
  13. RFC 8659: DNS Certification Authority Authorization (CAA) Resource Record — IETF
  14. The Domain Name Registration Process — ICANN
  15. Cloudflare DNS: Nameservers — Cloudflare
  16. Cloudflare DNS: DNS setups — Cloudflare
  17. Cloudflare DNS: Update nameservers — Cloudflare
  18. Cloudflare DNS: Change your nameservers (Full setup) — Cloudflare
  19. Cloudflare DNS best practices learning path: Phase 3 — Cloudflare
  20. Cloudflare DNS: DNS record types — Cloudflare
  21. Cloudflare DNS: Time to Live (TTL) — Cloudflare
  22. Cloudflare DNS: Proxy status — Cloudflare
  23. Cloudflare DNS: Create a subdomain record — Cloudflare
  24. Cloudflare DNS: Delegate subdomains outside Cloudflare — Cloudflare
  25. Cloudflare DNS: CNAME flattening — Cloudflare
  26. Cloudflare DNS: Set up CNAME flattening — Cloudflare
  27. Cloudflare: Error 1014 CNAME Cross-User Banned — Cloudflare
  28. Google Workspace: DNS basics — Google
  29. Google Workspace: Set up MX records for Google Workspace — Google
  30. Google Workspace: Set up SPF — Google
  31. Google Workspace: Set up DKIM — Google
  32. Google Workspace: About TXT records — Google
  33. Microsoft 365: Connect your domain by adding DNS records — Microsoft
  34. Microsoft 365: External Domain Name System records — Microsoft
  35. Microsoft Defender for Office 365: How to use DKIM for email in your custom domain — Microsoft
  36. Windows Commands: nslookup — Microsoft
  37. Windows Commands: ipconfig — Microsoft