设置面向 Internet 的 DNS 解析器非常容易。建立一个比了解这样做所涉及的风险要少得多的研究。这是善意无意中导致他人的恶行(和痛苦)的案例之一。
如果您的 DNS 服务器将响应它看到的任何源 IP 地址,那么您正在运行一个开放的解析器。这些不断被用于对无辜方的放大攻击。新的系统管理员每天都在支持开放的解析器,这使得恶意个人不断扫描它们是有利可图的。您的开放式解析器是否会被用于攻击,这并不是一个问题:截至 2015 年,这几乎是一个给定的问题。它可能不会立即发生,但肯定会发生。
即使您使用您的 DNS 软件(即 BIND)应用 ACL,这也只是限制您的服务器将回复哪些欺骗性 DNS 数据包。重要的是要了解,您的 DNS 基础设施不仅可以用来攻击 ACL 中的设备,还可以用来攻击您的 DNS 服务器和它将响应的设备之间的任何网络设备。如果您不拥有数据中心,那么这不仅仅是您的问题。
无论您运行的是开放式 DNS 递归器还是权威 DNS 服务器,问题都是一样的,大多数可能的解决方案也是一样的。
最佳解决方案
DNS cookie是一个提议的标准,它为 DNS 服务器提供了一种要求客户端发送 cookie 以证明客户端 IP 地址没有被欺骗的方法。这将花费第一次查找的额外往返费用,这是任何解决方案可以提供的最低开销。
老客户的后备方案
由于 DNS cookie 尚未标准化,因此现在和未来几年当然有必要支持旧客户端。
您可以在不支持 DNS cookie 的情况下对来自客户端的限制请求进行速率限制。但是速率限制使攻击者更容易对您的 DNS 服务器进行 DoS。请注意,某些 DNS 服务器具有仅为权威 DNS 服务器设计的速率限制功能。由于您询问的是递归解析器,因此此类速率限制实现可能不适用于您。设计的速率限制将成为您服务器的瓶颈,因此攻击者需要向您发送更少的流量才能导致合法请求被丢弃,而不是没有速率限制。
速率限制的一个优点是,如果攻击者确实用 DNS 请求淹没了您的 DNS 服务器,您更有可能有剩余容量允许您通过 ssh 连接到服务器并调查情况。此外,速率限制可以设计为主要丢弃来自发送许多请求的客户端 IP 的请求,这可能足以保护您免受无权访问欺骗客户端 IP 的攻击者的 DoS 攻击。
您需要了解以下几点:
这是一个网络工程问题。
大多数希望设置此类环境的人都是系统管理员。太好了,我也是系统管理员!工作的一部分是了解你的职责在哪里结束,其他人的职责从哪里开始,相信我,这不是系统管理员可以自己解决的问题。原因如下:
这不是最佳做法。最好的做法是不要这样做。
设置面向 Internet 的 DNS 解析器非常容易。建立一个比了解这样做所涉及的风险要少得多的研究。这是善意无意中导致他人的恶行(和痛苦)的案例之一。
Google 和 OpenDNS 可以做到这一点,为什么我不能呢?
有时有必要权衡热情与现实。以下是一些很难问自己的问题:
这是您想一时兴起的事情,还是您有几百万美元的投资来做正确的事情?
您有专门的安全团队吗?专门的虐待团队?他们是否都有处理滥用您的新基础设施的周期,以及您将从外部方面收到的投诉?
你有法律团队吗?
当所有这一切都说完之后,所有这些努力是否会开始为自己付出代价,为公司带来利润,或者超过处理导致您朝这个方向发展的不便的货币价值?
最后,我知道这个帖子是问答环节,对于与它相关的大多数人来说,这有点令人失望。Serverfault 在这里提供答案,“这是一个坏主意,不要这样做”的答案通常不会被认为很有帮助。有些问题比一开始看起来要复杂得多,这就是其中之一。
如果您想尝试完成这项工作,您仍然可以在尝试实施此类解决方案时向我们寻求帮助。要意识到的主要问题是问题本身太大,无法以方便的问答形式提供答案。您需要投入大量时间来研究该主题,并就您在实施过程中遇到的特定逻辑问题与我们联系。本问答的目的是让您更好地了解全局,并帮助您理解为什么我们无法回答如此广泛的问题。
帮助我们保持互联网安全!:)
无论您运行的是开放式 DNS 递归器还是权威 DNS 服务器,问题都是一样的,大多数可能的解决方案也是一样的。
最佳解决方案
DNS cookie是一个提议的标准,它为 DNS 服务器提供了一种要求客户端发送 cookie 以证明客户端 IP 地址没有被欺骗的方法。这将花费第一次查找的额外往返费用,这是任何解决方案可以提供的最低开销。
老客户的后备方案
由于 DNS cookie 尚未标准化,因此现在和未来几年当然有必要支持旧客户端。
您可以在不支持 DNS cookie 的情况下对来自客户端的限制请求进行速率限制。但是速率限制使攻击者更容易对您的 DNS 服务器进行 DoS。请注意,某些 DNS 服务器具有仅为权威 DNS 服务器设计的速率限制功能。由于您询问的是递归解析器,因此此类速率限制实现可能不适用于您。设计的速率限制将成为您服务器的瓶颈,因此攻击者需要向您发送更少的流量才能导致合法请求被丢弃,而不是没有速率限制。
速率限制的一个优点是,如果攻击者确实用 DNS 请求淹没了您的 DNS 服务器,您更有可能有剩余容量允许您通过 ssh 连接到服务器并调查情况。此外,速率限制可以设计为主要丢弃来自发送许多请求的客户端 IP 的请求,这可能足以保护您免受无权访问欺骗客户端 IP 的攻击者的 DoS 攻击。
由于这些原因,将速率限制稍微低于您的实际容量可能是一个好主意,即使它实际上并不能防止放大。
使用 TCP
可以通过发送指示答案对于 UDP 来说太大的错误代码来强制客户端使用 TCP。这有几个缺点。它需要额外的两次往返。并且一些有缺陷的客户端不支持它。
使用这种方法可以将两个额外往返的成本限制为仅第一个请求:
当客户端 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 数据包。