自建权威 DNS 的利弊
TL;DR:我的观点是现时 (2023) 大多数人都不应该自建DNS,而应该找一家比较可靠的供应商。
下面说说我的理由。
自建DNS的好处
对于基础设施的把控和灵活性
自建DNS意味着完全控制,或者至少是几乎完全控制和自己域名有关的基础设施。这可以满足从业人员的好奇心(例如可以获得用户采用的DNS服务、这些服务实现标准的情况,以及与之相关的趋势等等各类DNS托管服务业者不可能提供的数据),也可以在符合标准的前提下进行各种有趣的试验,例如基于DNS的按用户来源分配流量、负载转移等等,这可能会带来一些精神上的愉悦。
此外,如果实施了DNSSEC,自建DNS意味着可以掌控签名公钥,换言之在域名注册服务提供商,或是域名注册机构没有出现问题的情况下域名的内容不会被篡改(当然,这依赖于用户使用了验证DNSSEC签名的解析服务器,但如果他们没做的话他们显然有比无法访问一个人的个人网站更严重的问题需要去担心)。
避免和别人一起被一锅端掉
自建DNS意味着不和其他人共享同一组服务器,并且潜在地可能会使用不同的DNS服务器实现。这样一来,就不必担心DNS托管业者本身的问题(例如其操作人员失误导致服务影响,或是同一组服务器由于其他域名的问题而被一些国家的政府禁止访问)导致自己的网站无法访问。此外,如果某一主流DNS服务器实现存在漏洞,自建DNS意味着你有可能由于采用了不同的实现而逃过某次全互联网范围的灾难。
可以增加自己对于DNS服务的理解
这些经验有许多属于犀利而无用的手艺一类的默会知识,涉及的内容比较庞杂,市面上的书籍往往无法涵盖所有。
自建DNS的缺点
说完了好处,我们再来看看自建DNS的缺点。
成本昂贵
通常,最佳实践建议使用一台隐藏的主服务器(这台服务器可能不直接接入互联网,它的作用是持有DNSSEC的各种密钥,并将签名过的域数据分发给实际向互联网提供服务的服务器)。这样一来就需要至少两台机器。另一方面,DNS对于可靠性的要求非常高,因此通常需要有多个(大部分域名要求存在至少两个权威服务器)服务器。
为了进一步提高性能和可靠性,DNS服务还应使用Anycast,这意味着需要架设更多的服务器,并且接入更多的网络。
在已经建设了这些基础设施之后,在其上增加新的域名的边际成本是很便宜的。这也就是为什么许多云服务业者能够将其作为一项免费服务提供给用户的原因。
安全和可靠性差
让我们来正视一个事实:大部分人并不能紧跟安全更新,也不能全天候地盯着服务器。专门的DNS服务业者往往有能力雇佣单独的团队来做这些事情,因此他们在安全和可靠性方面很可能做的要比单独的个人要更好。
需要注意的是,和邮件服务当机4小时只会丢掉垃圾邮件不同,DNS服务要求所采用的一组服务器能够提供接近完美的uptime,这是一项对于可靠性要求非常高的业务,其发生问题时将会导致邮件丢失,由于邮件发送者是分散的,因此如果权威DNS出现问题,很难找到对方并进行处理(与此相反,邮件服务器如果是在存储时出现问题,正常的发送端会重试多次,并且接收方也有很大概率会留下一些记录)。
需要大量犀利而无用的知识
和邮件服务类似,运行DNS服务需要大量在其他地方完全用不上的犀利而无用的知识,这些知识不摔一些跟头往往不易获得。
个人的一些建议
首先当然是劝退。找一家合适的支持DNSSEC和anycast的DNS服务提供者并在他们那里托管对于大多数人来说是合适的选择,早年大多数业者都不支持这么做,而现时支持DNSSEC的服务提供者已经很多了。
如果一定要自己建权威DNS服务的话,可以考虑找一些棋逢对手的精神病一起互相做备份服务。在启用了DNSSEC的前提下,并不需要特别担心对方劫持自己域名的问题(当然,对方服务器如果无法访问的话仍然会对域名解析产生一定的影响;如果对方服务器被人攻陷提供错误数据,或是主动提供错误数据,虽然可以被做了DNSSEC验证的DNS解析服务器发现,但没做DNSSEC验证的用户就有可能被引导到错误的地方)。无论是完全自建权威DNS服务,还是自建其中的一部分并配合一组从属服务器,监控(这包括DNS的SOA记录一致性、重要地址记录的签名正确性等等)都是十分重要的。