CNAME記錄
真實名稱記錄(英語:Canonical Name Record),即CNAME記錄,是域名系統(DNS)的一種記錄。CNAME記錄用於將一個域名(同名)映射到另一個域名(真實名稱),域名解析服務器遇到CNAME記錄會以映射到的目標重新開始查詢。[1]
這對於需要在同一個IP地址上運行多個服務的情況來說非常方便。若要同時運行文件傳輸服務和Web服務,則可以把ftp.example.com和www.example.com都指向DNS記錄example.com,而後者則有一個指向IP地址的A記錄。如此一來,若服務器IP地址改變,則只需修改example.com的A記錄即可。
CNAME記錄必須指向另一個域名,而不能是IP地址。
細節
《RFC 1034》詳細定義了CNAME記錄的標準,並在《RFC 2181》的第十節中做了進一步規範。
CNAME記錄在域名系統中的使用有諸多限制。當一個DNS解析服務器在查詢各類記錄時遇到一則CNAME記錄時,它會立即重啟查詢,查詢所映射到域名的對應記錄。(除非是要查詢CNAME記錄本身,在那種情況下會返回所映射到的域名。)CNAME記錄所映射的域名可以是域名服務中的任何域名。在同一服務器上,在遠程服務器上,甚至在屬於不同DNS zone(解析空間)的服務器上,都可以。
假設有下述DNS zone:
NAME TYPE VALUE -------------------------------------------------- bar.example.com. CNAME foo.example.com. foo.example.com. A 192.0.2.23
當要查詢bar.example.com的A記錄時,域名解析器會查到對應的CNAME記錄,即foo.example.com,隨即開始查詢該域名的A記錄,查到192.0.2.23則返回結果。
誤會
可以使用CNAME記錄將「bar.example.com」指向「foo.example.com」。因此,可能會有人隨意的將bar.example.com稱作是foo.example.com的「CNAME」。然而事實並非如此,bar.example.com的「CNAME」是foo.example.com,因為CNAME的意思是真實名稱,而右側才是真實名稱,才是CNAME。
這則誤會在《RFC 2181》「DNS規範的解釋」一章中有提到。應當說左側標籤是右側真實名稱的一個同名。即下述CNAME記錄:
bar.example.com. CNAME foo.example.com.
應當讀作:
bar.example.com的真實名稱是foo.example.com。請求訪問bar.example.com的客戶端會得到foo.example.com返回的結果。
限制
- CNAME記錄總是指向另一則域名,而非IP地址。
- 有CNAME記錄的域名不能有其他任何記錄(MX記錄、A記錄等,《RFC 1034》第3.6.2節、《RFC 1912》第 2.4節) 唯一的例外是在使用DNSSEC的情況下,這時可以設置相關的DNSSEC相關記錄,比如RRSIG,NSEC等(《RFC 2181》第10.1節)
- 為了保證效率,應當避免將CNAME記錄指向其他的CNAME記錄,但並非不可以。因此,可以通過CNAME記錄創造無法被解析的循環,比如:
foo.example.com. CNAME bar.example.com. bar.example.com. CNAME foo.example.com.
- MX記錄和NS記錄永遠都不應指向由CNAME記錄標記的域名(《RFC 2181》第10.3節)。因此,解析空間不應有下述結構:
example.com. MX 0 foo.example.com. foo.example.com. CNAME host.example.com. host.example.com. A 192.0.2.1
- 根據(《RFC1912》)第2.4節,根網域(Root Domain)不應該被添加 CNAME 紀錄。但部分 DNS 服務商(例如 DNSPod、NS1)可以忽略該 RFC 標準而針對根網域做出 CNAME 解析,比如:
example.com. CNAME foo.example.com.
但這樣做會導致該網域若有用於郵箱服務,則可能造成錯誤,詳見如下方。
而願意遵守 RFC 標準的 DNS 供應商 (例如 Neustar UltraDNS、Cloudflare DNS)則採用了 Apex Alias 或 CNAME flattening 技術,這個技術將使得由 DNS 服務商自行處理 CNAME 解析的過程,並將最終解析的 A 紀錄作為實際解析的結果,從而不與 RFC 標準抵觸,比如:
example.com. A 192.0.2.1
- 用於郵箱服務的域名不應有CNAME記錄。在實踐中,這或許不會出錯,但由於郵件服務的不同,可能會有意料之外的效果。[2]
DNAME記錄
DNAME記錄,即代理名稱記錄,由《RFC 6672》定義(原《RFC 2672》已經廢棄)。一條DNAME記錄會將某個域名的整個解析子樹映射到另一域名,而CNAME只映射設定的域名,不映射子域名。如同CNAME一樣,在DNS查詢過程中,會查找所映射到的新域名的地址。域名解析服務器會為每一個被查詢的子域名生成一則CNAME記錄。為某個域名設置DNAME記錄和為該域名的所有子域名設置CNAME記錄的效果是一樣的。
例如下述記錄:
foo.example.com. DNAME bar.example.com. bar.example.com. A 192.0.2.23 xyzzy.bar.example.com. A 192.0.2.24 *.bar.example.com. A 192.0.2.25
查詢foo.example.com的A記錄不會返回任何結果。不同於CNAME記錄,DNAME不會直接影響所設置域名的解析。
如果我們需要查詢xyzzy.foo.example.com,則由於DNAME記錄的映射會返回xyzzy.bar.example.com的A記錄,即192.0.2.24。而如果將DNAME記錄換成是CNAME記錄的話,這樣的請求則會報錯提示無法找到。
由此,查詢foobar.foo.example.com會由於DNAME記錄映射返回192.0.2.25。
ANAME記錄
部分DNS平台支持尚未被標準化的ALIAS[3]或ANAME記錄類型。此類偽記錄由DNS服務器維護,類似於CNAME記錄,但在(某些)客戶端解析時等同於A記錄。ANAME記錄通常會被設置指向另一域名。但在被客戶端請求時候,則會直接返回對應的IP地址。ANAME記錄的標準化過程正在進行中[4],但已經有許多不同的實現,所以由於平台的不同,效果也多種多樣。有些存在於域名解析區的頂端,有些則為了提供郵件服務而存在。ANAME記錄相對CNAME記錄的一大優勢是速度。服務端解析A記錄的速度通常比客戶端快,同時可以緩存對應的IP地址以備查詢。IETF正在討論和考慮ANAME記錄的標準化。[5]
參見
參考資料
- ^ Mockapetris. RFC 1035 - Domain names - implementation and specification. Internet Engineering Task Force. [2019-03-16]. (原始內容存檔於2011-02-12).
- ^ Bernstein, D.J. CNAME records in mail. [2011-06-03]. (原始內容存檔於2011-12-04).
- ^ DNS Alias. [2019-06-14]. (原始內容存檔於2019-02-20).
- ^ IETF DNSOP ANAME Draft by ISC, PowerDNS and DNSimple. [2019-06-14]. (原始內容存檔於2019-07-13).
- ^ Address-specific DNS Name Redirection (ANAME). 2018-01-11 [2019-06-14]. (原始內容存檔於2019-07-13).
外部連結
- RFC 1912 is wrongMeng Weng Wong's analysis of CNAME restrictions (from (頁面存檔備份,存於網際網路檔案館)).
- RFC 2219 – Use of DNS Aliases for Network Services (為網絡服務使用DNS別名)