DNS 根網域 (Root Domain) CNAME

之前遇到有人問為什麼在 Route 53 沒辦法用 Root Domain CNAME,當時覺得很奇怪怎麼會有這個限制,因為平常使用 CloudFlare 並沒有這個問題,CloudFlare 是可以在 Root Domain CNAME 的,因此就到 Route 53 測試,發現的確會出現問題如下圖:

會出現以下警告 [RRSet of type CNAME with DNS name route53.clarence.tw. is not permitted at apex in zone route53.clarence.tw.] 所以就去研究一下 RFC 1912 section ‘2.4 CNAME Records’ 可以在裡面看到 A CNAME record is not allowed to coexist with any other data. 不允許 CNAME 紀錄與其他紀錄共存.

可以在 RFC 裡面看到 Root Domain 如是 CNAME 不允許再使用其他的記錄,所以可以發現市面上大多數的 DNS Server 都遵守的 RFC 的標準,就算這件事情其實在技術上來說是可以辦到的。

在 CloudFlare 如何?

Root Domain 不能使用 CNAME 其實造成非常大的困擾,因此 CloudFlare 在 2011年5月17日有發表一篇 Blog 說明他們支援 Root Domain CNAME。

這邊說的困擾是什麼困擾呢?我們可能需要指定一台 EC2 或是 LB 來作為我們 Root Domain 上的網站,而在 AWS、Google 或是其他雲服務的廠商設計上會配發一組 Domain 讓我們把 Domain 指過去,那這樣其實就變成了一個困擾了,因為沒辦法使用 CNAME!

CloudFlare CNAME Flattening

可是這樣雖然解決了問題但不就跟 RFC 衝突了?所以 CloudFlare 使用了 CNAME Flattening 來解決這個問題,什麼是 CNAME Flattening?意思就是當 CloudFlare 在 Root Domain 看到 CNAME 的時候,它不是直接回應 CNAME,而是自己先去問到 IP 再返回,所以看起來還是直接回應了 A 紀錄,並沒有跟 RFC 有衝突。

解決在 Route 53 Root Domain 無法 CNAME 的問題

那如果 Root Domain 在 Route 53 需要使用 LB 或是 CDN 怎麼辦呢?

其實 Route 53 有提供一個解法就是使用 Route 53 的 Alias 然後把 Type 改成 A,如下圖:

如果同時使用 AWS CDN 與 Route53 就可以使用這個解法,這樣不只方便還可以讓 DNS 少一層,但是如果是其他的 DNS Server 可能就需要看看有什麼方法可以解了。

總結

基本上在 Root Domain 上面版主目前遇到的只有 Route53 與 CloudFlare,其他家的 DNS 要怎麼解決就等遇到再分享給大家了!

參考資料