CNAME是否应用于子域?


84

我管理着多个当前具有以下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记录,因此在这里不是问题。


1
我觉得这应该是维基的答案。DNS很难正确解决,六年后这个公认的答案仍然很好吗?
the0ther

1
@ the0ther是的,即使到了今天,来自Jesper Mortensen的经过验证的答案仍然有效(即使有人可以争论事物的命名或要使用的正确TTL值,但这与是否使用CNAME记录的问题是不同的。 )。DNS是30年前的旧协议,因此CNAME记录等基本信息不会随时间变化。
Patrick Mevzek '18

Answers:


85

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

针对CNAME:

  • 这会带来(微小的)性能损失,因为下游DNS缓存需要执行2个DNS查找,一个用于CNAME,一个用于CNAME指向的A记录。
  • 关于CNAME的“权限”或兼容性问题较少的虚假争论。

支持CNAME:

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

在尝试了几种不同的方法来完成此操作后,我现在有了个人最喜欢的样式。它是:

  • 每个物理服务器一个A记录;具有相当低的TTL(可能是30分钟);给服务器起一个人性化的名称
  • 每个服务一个CNAME;具有较高的TTL(可能是24小时);指向上面的服务器名称。
  • 作为上述规则的唯一示例,域根是A记录,指向Web服务器/ 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

1
谢谢您,最后,我对CNAME提出了合理,简洁的意见。
泰勒2012年

@Jesper Mortensen:您能否举一个小例子来更新答案,特别是当您说“作为上述规则的唯一代表,域根是A记录”时,我不明白您的第3点,您已经第一点说,您为每个物理层服务器使用一个A记录。(顺便说一句,链接已经消失了)
Marco Demaio

2
@Marco Demaio:关于“域根A记录”:二级域就像company.com是区域顶点。它需要一个SOA记录。因此,它必须是一个A记录而不是CNAME -见serverfault.com/questions/170194/...
加斯帕·莫特森

4
@不需要具有A记录;而是禁止使用CNAME。
迈克尔·汉普顿

1
只是想补充一点,如果您的服务器也支持IPv6地址,那么CNAME尤其有用,因为每个服务器至少需要两个条目(每个记录一个A和AAAA),因此将CNAME用于子域在这种情况下要简单得多。如果您对TTL使用Jesper的建议(或您的DNS提供商具有良好的自动处理能力),则应该没有实际的性能损失。
Haravikk '16

13

是的,这是适当的。

许多人分享的“我的最佳实践”是为每个服务器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

我知道在这个问题中他们说邮件在这里不是问题,但让我们假设您还使用邮件如何处理MX记录?谢谢!
Marco Demaio,

1
MX记录也将指向服务器名称。IN MX server1为方便起见,我建议还设置imappopsmtpCNAME记录,也可能mail,因为很多电子邮件程序猜测这一点。设置正确的SRV记录也是一个好主意,但是由于这是一个相对基本的问题,对于简单的配置,SRV记录可能会有点过多。
克里斯S

1
快速评论,MX记录不能是CNAME,请参阅serverfault.com/a/232243/2874 在实践中,它可能工作得很好,但最好不要这样做。
Jesper Mortensen

如果您将MX或SRV记录指向CNAME,则BIND将拒绝加载区域...我可能应该已经清楚地表明MX记录需要指向A记录。谢谢。
克里斯S

@ChrisS,如何编辑答案并清楚提到MX记录不能指向CNAME条目这一事实呢?
亚历克西斯·威尔克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.