题 CNAME应该用于子域吗?


我管理多个当前具有以下DNS配置的网站:

example.com      - A Record - Production Server IP
test.example.com - A Record - Test Server IP
www.example.com  - CNAME    - example.com
beta.example.com - CNAME    - test.example.com
dev.example.com  - CNAME    - test.example.com

这是否恰当地使用了CNAME记录?我在网上看了一下并没有找到明确的答案。有些人声称CNAME记录不好(但是,他们不清楚为什么会这样)并提出以下设置:

example.com      - A Record - Production Server IP
test.example.com - A Record - Test Server IP
www.example.com  - A Record - Production Server IP
beta.example.com - A Record - Test Server IP
dev.example.com  - A Record - Test Server IP

哪一个是更好的方法(以及为什么)?

注意: 子域不需要自己的MX记录,因此这不是问题。


76
2017-09-16 17:55




我觉得这应该是维基的答案。 DNS是如此难以正确,6年后这个被接受的答案仍然很好吗? - the0ther
@ the0ther是的,即使是今天经过验证的答案,来自 Jesper Mortensen,仍然有效(即使有人可能会争论事物的命名或使用正确的TTL值,但这些与使用CNAME记录的问题不同)。 DNS是30旧协议,因此CNAME记录等基本内容不会随时间而变化。 - Patrick Mevzek


答案:


是的,这是对CNAME的恰当使用。在我参与的讨论中,争论倾向于这样:

反对CNAME:

  • 由于下游DNS缓存需要执行2次DNS查找,一次用于CNAME,另一次用于CNAME指向的A-Record,因此存在(微小的)性能损失。
  • 关于CNAME具有较少“权威”或兼容性问题的模糊,虚假论点。

支持CNAME:

  • 它们提供硬件(物理服务器)和服务之间的干净抽象。
  • 它们简化了DNS管理 - 当服务器移动时,您只需要更改一条记录。

尝试了几种不同的方式 要做到这一点,我现在有一个个人喜欢的风格。它是:

  • 每个物理服务器一个A记录; TTL相当低(可能是30分钟);给服务器一个 人性化的名字
  • 每个服务一个CNAME; TTL很高(可能是24小时);指向上面的服务器名称。
  • 作为上述规则的唯一例外,域根是一个A-Record,指向webserver / web负载均衡器。 (@必须是A记录。)

我发现这个设置很好用。它为CNAMES提供额外的DNS查找;如果服务器崩溃,我仍然可以相当快地更改公共DNS。

这是一个(临时的)例子 在BIND语法中:

;name     ttl   class rr     value 
server01  30m   IN    A      192.168.0.3
server02  30m   IN    A      192.168.0.4

webmail   24h   IN    CNAME  server01
extranet  24h   IN    CNAME  server02
ftp       24h   IN    CNAME  server02

80
2017-09-16 19:45



谢谢,最后对CNAME的合理意见清楚简明地阐述了。 - Tyler
@Jesper Mortensen:请你用一个小例子来回答一下这个答案,特别是当你说“作为上述规则的唯一要求,域根是A-Record”时,我不明白你的第三点,你已经在第一点说,你为每个物理层服务器使用一个A记录。 (BTW链接已经消失) - Marco Demaio
@Marco Demaio:关于“域根A-Record”:像二级域名一样 company.com是一个区域顶点。它需要一个SOA记录。因此它必须是A记录而不是CNAME - 请参阅 serverfault.com/questions/170194/... - Jesper Mortensen
@不需要有A记录;相反,禁止使用CNAME。 - Michael Hampton♦
只是想补充说,如果您的服务器也支持IPv6地址,CNAME也特别有用,因为每个服务器至少需要两个条目(每个服务器一个A和AAAA记录),因此对子域使用CNAME在这种情况下,更简单。如果您使用Jesper的TTL建议(或您的DNS提供商具有良好的自动处理),那么应该没有真正的性能损失。 - Haravikk


是的,这是合适的。

我的最佳实践,许多人分享,是为每个服务器IP创建1 A记录;并将CNAMES用于其他任何事情。

一个常见的例子是:

server1.example.com.      IN A      192.168.0.1
server2.example.com.      IN A      192.168.5.2
www                       IN CNAME  server1
ftp                       IN CNAME  server1
beta                      IN CNAME  server2

12
2017-09-16 18:03



我知道在这个问题中他们说邮件不是问题,但我们假设您也使用邮件,你会如何使用MX记录?谢谢! - Marco Demaio
MX记录也将指向服务器名称。 IN MX server1 为方便起见,我建议也设置一下 imap 要么 pop 和 smtp CNAME,也可能 mail,正如许多电子邮件程序所猜测的那样。设置正确的SRV记录也是一个好主意,但由于这是一个相对基本的问题,SRV记录对于简单配置可能有点多。 - Chris S
快速评论, MX记录不能是CNAME,请参阅 serverfault.com/a/232243/2874  它在实践中可能运行良好 - 但最好不要这样做。 - Jesper Mortensen
如果你将一个MX或SRV记录指向一个CNAME,BIND将拒绝加载该区域......我可能应该清楚地表明MX记录需要指向A记录。谢谢。 - Chris S
@ChrisS,如何编辑你的答案并清楚地提到MX记录不能指向CNAME条目的事实? - Alexis Wilke