我如何设置一个“安全”的开放式parsing器?

这是关于保护公共DNSparsing器的规范性问题

开放的DNS服务器看起来非常整洁,方便,因为它们提供的IP地址可以在我们的公司中一致地使用,无论它们位于何处。 谷歌和OpenDNS提供这种function,但我不确定我希望这些公司能够访问我们的DNS查询。

我想为我们的公司设置这样的东西,但我听到很多关于这是危险的做法(特别是在放大攻击方面 ),我想确保我们这样做是正确的。 build立这种types的环境时,我需要记住什么?

有几件事情你需要了解进入这个:


这是一个networking工程问题。

大多数想要build立这种types的环境的人都是系统pipe理员。 这很酷,我也是系统pipe理员! 部分工作是理解你的责任到底和别人的开始,相信我,这不是系统pipe理员可以自行解决的问题。 原因如下:

  • UDP是一个无状态的协议。 没有客户握手。
  • 针对DNS服务器的查询是未经身份validation的两步事务(查询,回复)。 服务器在回复之前无法知道源IP是否被欺骗。
  • 在查询到达服务器时,防止伪造的UDP数据包已经太晚了。 欺骗只能通过被称为入口过滤的做法来防止,这是一个由文档BCP 38和BCP 84涵盖的主题。 这些由位于DNS服务器前面的networking设备实现。
  • 我们无法为您介绍如何从头至尾设置数据中心,以及如何实施这些最佳实践。 这些东西是非常特定于您自己的需求。 Q&A格式对此不起作用,本网站不打算替代聘请专业人士从事专业工作。
  • 不要以为你的十亿美元太大而不能倒闭的公司实现了正确的入口过滤。

这不是最佳做法。 最好的做法是不要这样做。

build立一个面向互联网的DNSparsing器非常容易。 build立一个研究所花费的研究远比理解这样做所涉及的风险要less得多。 这是善意不经意地使他人的不当行为(和痛苦)的情况之一。

  • 如果你的DNS服务器会响应它所看到的任何源IP地址,你正在运行一个开放的parsing器。 这些不断被利用在对无辜党的放大攻击中。 新的系统pipe理员每天都会站在开放的解决scheme之上,使恶意的个人不断对其进行扫描。 开放的parsing器是否会被用于攻击并不是一个真正的问题:截至2015年,这几乎是一个给定的问题。 这可能不是直接的,但肯定会发生。
  • 即使你使用你的DNS软件(比如BIND)来应用ACL,所有这些都会限制你的服务器将会回复的DNS数据包。 了解您的DNS基础架构不仅可以用来攻击ACL中的设备,还可以用于DNS服务器和它将响应的设备之间的任何networking设备,这一点很重要。 如果你不拥有数据中心,这不仅仅是你自己的问题。

谷歌和OpenDNS做到这一点,为什么我不能?

有时候有必要衡量热情与现实。 这里有一些难题要问自己:

  • 这是你想要一时兴起的东西,还是这个东西你有几百万美元投资做对了?

  • 你有一个专门的安全团队吗? 专门的滥用团队? 他们两个都有周期来处理滥用新基础设施的情况,以及你会从外部获得哪些投诉?

  • 你有法律团队吗?

  • 当这一切都说完之后,所有这些努力是否都会远程开始为自己付出,为公司谋利还是超过处理这个方向带来的不便的货币价值呢?


最后,我知道这个线程对于大多数被链接到的人来说是一个令人失望的问题。 Serverfault在这里是为了提供答案,“这是一个坏主意,不这样做”的答案通常不被认为是非常有用的。 有些问题要比一开始就复杂得多,这就是其中之一。

如果你尝试做这个工作,当你试图实现这种解决scheme时,仍然可以要求我们帮助。 要认识到的主要问题是问题本身太大 ,答案提供方便的问答forms。 您需要投入大量的时间来研究这个话题,并且在实施过程中遇到您遇到的特定逻辑问题。 这个问答的目的是让你更好地了解更大的图片,并帮助你理解为什么我们不能回答这个广泛的问题。

帮助我们保持互联网的安全! 🙂

无论您是运行一个开放的DNS recursor还是一个权威的DNS服务器,问题都是一样的,大多数可能的解决scheme也是一样的。

最好的解决scheme

DNS cookie是一个build议的标准,它给DNS服务器提供了一种方法来要求客户端发送一个cookie,以certificate客户端IP地址没有被欺骗。 这将花费额外的往返第一次查找,这是任何解决scheme可以提供的最低开销。

老年客户的退步

由于DNS cookie尚未标准化,因此当然需要现在和未来几年支持较老的客户端。

您可以评估来自客户端的限制请求,而不需要DNS cookie支持 但速率限制使攻击者更容易拒绝您的DNS服务器。 请注意,某些DNS服务器具有仅为授权DNS服务器devise的速率限制function。 既然你在问一个recursion的parsing器,这样的速率限制实现可能并不适用于你。 devise的速率限制将成为您的服务器的瓶颈,因此攻击者将需要减lessstream量,以便导致合法请求被丢弃,如果没有速率限制的话。

速率限制的一个好处是,如果攻击者用DNS请求淹没你的DNS服务器,你更有可能拥有容量,这将允许你SSH服务器和调查的情况。 此外,速率限制可以devise为主要放弃来自发送多个请求的客户端IP的请求,这可能足以保护您免受来自无法访问欺骗客户端IP的攻击者的DoS攻击。

由于这些原因,在您的实际能力下,速率限制可能是一个好主意,即使它实际上不能防止放大。

使用TCP

通过发送一个错误代码来强制客户端使用TCP是可能的,这个错误代码指出UDP的回答太大了。 这有几个缺点。 它需要两个额外往返。 而一些有故障的客户端不支持它。

另外两次往返的成本可以仅限于使用此方法的第一个请求:

当客户端IP尚未确认时,DNS服务器可以发送截断的响应来强制客户端切换到TCP。 被截断的响应可以与请求一样短(或者如果客户端使用EDNS0,则响应不会更短),从而消除放大。

任何完成TCP握手和发送DNS请求的客户端IP都可以暂时列入白名单。 将白名单列入IP后,即可发送UDP查询,并接收最多512字节的UDP响应(如果使用EDNS0,则为4096字节)。 如果UDP响应触发ICMP错误消息,则从白名单再次移除IP。

该方法也可以使用黑名单反转,这意味着默认允许客户端IP通过UDP进行查询,但任何ICMP错误消息都会导致IP被列入黑名单,需要TCP查询才能从黑名单中取消。

覆盖所有相关IPv4地址的位图可以存储在444MB的内存中。 IPv6地址将不得不以其他方式存储。

我不知道是否有任何DNS服务器已经实施了这种方法。

也有报道说一些TCP协议栈可以用于放大攻击。 但是,这适用于任何基于TCP的服务,而不仅仅是DNS。 这样的漏洞应该通过升级到一个内核版本来缓解,在这个内核版本中,TCP堆栈已经被修复,不能发送多个数据包来响应SYN数据包。