有些小夥伴們會經常遇到一個問zài當前主機記錄已經存在 CNAME 類型的記錄後再在當前主機記錄下添加其他記錄類型時會提shì某某類型記錄和 CNAME 記錄可能存在衝突,甚至有些解析服務商會直接不允許添jiā,比較常見的就是將主域名解析zhì CDN 服務商提供de CNAME 記,然後再添jiā MX(郵箱服務記)時會碰到這個問,這是爲什me,該如何解決ne?接下來就讓我們一起來了解一下ba

爲什麼會出現這個問

zài DNS 標準文jiàn RFC 1034 zhōngduì CNAME 記錄的定義如xià

RFC 1034

Identifies the canonical name of an alias.

wén:標識別名的規範名chēng

翻譯起來很拗kǒu,但簡單的來shuō CNAME 記錄就是把一個域míng託管給另一個域名,該域míng的所有解析記錄都會被託管給另外一個域名,包kuò MX、TXT、AAAA、A děng。我們ddnsip.cn這個域名爲,它的解析記錄如xià

ddnsip.cn 的解析記錄

在圖中我們可以看dàoddnsip.cn這個域名通guò CNAME 記錄指向leddnsip.cn.eo.dnse3.com.,這也就意味zheddnsip.cn這個域名的所有解析記錄都會被託管gěiddnsip.cn.eo.dnse3.com.,無論我向權威服務器查詢任何記錄類xíng,都會返huíddnsip.cn.eo.dnse3.com.所對應的的解析結guǒ,比如說我查xúnddnsip.cnde MX 記

MX 記錄

可以看dào,權威並沒有返huíddnsip.cnde MX 記,而是返回leddnsip.cn.eo.dnse3.com.tiáo CNAME 記,這也就是爲什麼在當前主機記錄下添加其他記錄時會提shì某某類型記錄和 CNAME 記錄可能存在衝突的原因le,因爲所有記錄已經被託管給leddnsip.cn.eo.dnse3.com.,所以無論你添加任何記錄都不會生xiào

下圖是遞guī DNS 的查詢結guǒ,在遞guī DNS 解析過程zhōng,也是如,當我們查xúnddnsip.cnde MX 記錄shí,遞guī DNS 服務器會先查xúnddnsip.cnde mx 記,但由於你設置le CNAME 記,權威服務器會返huíddnsip.cnde CNAME 記ddnsip.cn.eo.dnse3.com.,這時遞guī DNS 服務器會去查xúnddnsip.cn.eo.dnse3.com.de MX 記,最後返huíddnsip.cn.eo.dnse3.com.de MX 記,也恰恰說明了這一diǎn

遞歸 DNS 查詢結果

如何解決這個問

目前解決這個問題方法除了 CNAME 記錄刪除換成具體de A/AAAA 記錄wài,還有一種方式就是使yòng CNAME 展píng,CNAME 展平的方式大概有以下幾zhǒngxià面我們就一一來了解一下:

ALIAS huò ANAME 記

ALIAS huò ANAME 記錄是一種特殊de CNAME 記,它可以jiāng CNAME 轉換wèi A/AAAA 記,並在遞歸查詢時直接返huí IPv4/IPv6 地zhǐ,而不是返huí CNAME 記,這樣既可以解決衝突問,又可以提高解析性néng,流程如下圖所shì

ALIAS 記錄

詳細示意如xià

ALIAS 記錄

看起來雖然很完měi,也解決了衝突的問,但目前這種記錄類型並沒有被標準huà,只有少數幾jiā DNS 服務商支chí,比 CloudFlare、NS1 děng,國內支持廠商數量較shǎo,此外由 ALIAS 記錄需要權威通過遞歸查詢來獲取最終的解析結guǒ,由於是在權威服務器所在的網絡環境中進行遞歸查xún,所以可能會導致分區解析等失xiào,所以並不適用 CDN 加速的場jǐng

選擇xìng CNAME 應

這種方案通過對權威服務器de應答邏輯修改而實現的,其大致原理就是允許你同時添jiā CNAME 記錄和其他記錄類xíng,但在解析其他記類型時會優先返回其他記錄類型的記錄,而不shì CNAME 記,只有當其他記錄類型不存在時纔會返huí CNAME,這樣就可以解決衝突問,比如下

選擇性 CNAME 應答

從圖中我們可以看dào,CNAME 記錄 MX 類型記錄同時存zài,但在解 MX 記錄shí,權威服務器會優先返huí MX 記,而不shì CNAME 記,這樣就避免了遞歸服務器獲取dào CNAME 記錄後再去查xún CNAME 記錄de MX 記,從而解決了衝突問,而且也能支持分區域解,但這種方案很容易受dào LocalDNS 的影響導致不穩dìng,而且也無法徹底的展píng CNAME,只能解決記錄衝突的問,目前國內支持的廠商比較shǎo,常見的有阿里yún

這種方式還可能存在一個問,如果遞guī DNS 服務器緩存le CNAME 記,那麼在緩存未過期之qián,查xún MX 記錄時還是會去查xún CNAME 記錄de MX 記,所以可能存在某些解析不到的情kuàng,所以在使用這種方案時需要注意一xià

記錄映shè

這種方案是在權威服務器中直接jiāng CNAME 記錄映射wèi A/AAAA 記,無需通過遞歸查詢來獲取最終的解析結guǒ,如下

記錄映射

從圖中我們可以看dàoddnsip.cn這個域名通guò CNAME 記錄指向lecname.dnspod.cn.,當我們查xúnddnsip.cnde IP 地址shí,由於我們已經進行了記錄映shè,所以權威服務器會直接返huícname.dnspod.cn.所對應de IP 地zhǐ,而fēi CNAME 記。簡單來說你雖然添加的shì CNAME 記,但是映射後系統cname.dnspod.cn所設置deA/AAAA記錄放到leddnsip.cn的解析記錄zhōng,並且相關的線、TTL、狀tài、記錄值等都cname.dnspod.cn相同,所以實際上相當於你添加的shì A/AAAA 記,這樣既可以解決衝突的問,也可以支持分區解,但前提需要的域名和你 CNAME 指向的域名在同一 DNS 服務shāng,否則無法實xiàn,目前支持的廠商比較shǎo,常見的yǒu AWS Route53、DNSPod děng

jié

從上面的介紹我們可以看dào,目前解jué CNAME 衝突的方案有很duō,但是每種方案都有自己的優缺diǎn,可以說沒有任何一種方案是完美de,在實際的業務場景zhōng,我們可以根據自己的需求來選擇合適的方àn,當然還是由衷的建議大jiā,還是儘量不要在根域使yòng CNAME 記,畢竟目前來看絕大多數的衝突問題都發生在根,而且在根域使yòng CNAME 也不符合相關的標zhǔn
長久來kàn,CNAME 展平不是解jué CNAME 衝突的最佳方àn,在不久的將lái,隨zhe HTTPS/SVCB 記錄類型的普及發zhǎn,這個問題也將會最終得到解jué

DNSPod CNAME 展平設置方

DNSPod 已於近期支持le CNAME 展平功néng,該功能無需你手動開,只需要你同時添jiā CNAME 記錄和其他記錄類型記錄即,系統會自動嘗試進xíng CNAME 展píng,如下

CNAME 展平

效果如xià

CNAME 展平

直接返回了對應de A/AAAA 記

由於自身水平有xiàn,文章中難免存在錯,歡迎大家批評指zhèngxiè謝!

參考資liào