答案1
您需要了解以下几件事:
这是一个网络工程问题。
大多数想要建立这种环境的人都是系统管理员。太棒了,我也是系统管理员!这份工作的一部分就是了解你的职责在哪里结束,别人的职责在哪里开始,相信我,这不是系统管理员可以独自解决的问题。原因如下:
- UDP 是无状态协议。无需客户端握手。
- 对 DNS 服务器的查询是未经身份验证的两步事务(查询、回复)。服务器在回复之前无法知道源 IP 是否被欺骗。
- 当查询到达服务器时,阻止欺骗 UDP 数据包已经太迟了。只有通过一种称为入口过滤,文档涵盖的主题38号作战计划和84号作战计划。这些是由位于 DNS 服务器前面的网络设备实现的。
- 我们无法为您提供如何从头到尾设置数据中心的指南,也无法为您提供如何实施这些最佳实践的指南。这些内容完全取决于您自己的需求。问答格式不适用于这种情况,本网站并非旨在替代聘请专业人士来做专业工作。
- 不要以为你所在的价值数十亿美元的大到不能倒的公司能够正确实施入口过滤。
这不是最佳做法。最佳做法是不这样做。
设置面向互联网的 DNS 解析器非常简单。设置它所需的研究远少于了解这样做所涉及的风险。这是那些善意无意中导致他人犯错(和遭受痛苦)的案例之一。
- 如果您的 DNS 服务器会响应它看到的任何源 IP 地址,则您正在运行开放解析器。这些解析器不断被利用放大攻击针对无辜方。新的系统管理员正在支持开放解析器每天,让恶意个人不断扫描它们变得有利可图。您的开放解析器是否会被用于攻击其实并不成问题:截至 2015 年,这几乎是必然的。这可能不会立即发生,但肯定会发生。
- 即使您使用 DNS 软件(即 BIND)应用 ACL,这也只能限制您的服务器将响应哪些欺骗性 DNS 数据包。重要的是要了解,您的 DNS 基础设施不仅可用于攻击 ACL 中的设备,还可用于攻击 DNS 服务器和它将响应的设备之间的任何网络设备。如果您不拥有数据中心,那么这不仅仅是您的问题。
Google 和 OpenDNS 可以做到这一点,那我为什么不能呢?
有时,你需要权衡热情与现实。以下是一些需要你自问的难题:
这是您一时兴起想要建立的事物,还是您投入几百万美元来做好的事物?
你有专门的安全团队吗?有专门的滥用团队吗?他们是否有时间来处理对你新基础设施的滥用以及来自外部各方的投诉?
你有没有合法的团队?
当所有这些都说完了,所有这些努力是否会产生回报,为公司带来利润,或者超过解决导致你朝这个方向发展的不便所带来的金钱价值?
最后,我知道这个问答主题对于大多数链接到它的人来说有点令人失望。Serverfault 是来提供答案的,而“这是一个坏主意,不要这样做”的答案通常被认为没有什么帮助。有些问题比一开始看起来要复杂得多,这就是其中之一。
如果你想为了尝试实现这一点,您仍然可以在尝试实施此类解决方案时向我们寻求帮助。要意识到的主要问题是本身太大以便以方便的问答形式提供答案。您需要已经投入了大量时间研究该主题,并向我们提出具体的您在实施过程中遇到的逻辑问题。本问答的目的是让您更好地了解整体情况,并帮助您理解为什么我们无法回答像这样宽泛的问题。
帮助我们维护互联网安全!:)
答案2
无论您运行的是开放 DNS 递归器还是权威 DNS 服务器,问题都是相同的,并且大多数可能的解决方案也是相同的。
最佳解决方案
DNS Cookie是一项提议的标准,它为 DNS 服务器提供了一种要求客户端发送 cookie 以证明客户端 IP 地址未被欺骗的方法。这将在第一次查找时花费一次额外的往返,这是任何解决方案可以提供的最低开销。
为老客户回退
由于 DNS cookie 尚未标准化,因此现在和未来几年当然有必要支持旧客户端。
您可以对不支持 DNS cookie 的客户端的请求进行速率限制。但是速率限制使攻击者更容易对您的 DNS 服务器进行 DoS 攻击。请注意,某些 DNS 服务器具有专为权威 DNS 服务器设计的速率限制功能。由于您询问的是递归解析器,因此此类速率限制实现可能不适用于您。设计上的速率限制将成为您服务器的瓶颈,因此攻击者需要向您发送比没有速率限制时更少的流量,才能导致合法请求被丢弃。
速率限制的一个优点是,如果攻击者确实用 DNS 请求淹没了您的 DNS 服务器,您更有可能有剩余容量,允许您通过 SSH 连接到服务器并调查情况。此外,速率限制可以设计为主要丢弃发送大量请求的客户端 IP 的请求,这可能足以保护您免受无法访问欺骗客户端 IP 的攻击者的 DoS 攻击。
出于这些原因,将速率限制在略低于实际容量的水平可能是一个好主意,即使它实际上不能防止放大。
使用 TCP
可以通过发送错误代码来强制客户端使用 TCP,该错误代码表示答案对于 UDP 来说太大。这有几个缺点。它需要两次额外的往返。而且有些有故障的客户端不支持它。
使用这种方法可以将两次额外往返的成本限制在第一个请求上:
当客户端 IP 尚未确认时,DNS 服务器可以发送截断响应以强制客户端切换到 TCP。截断响应可以与请求一样短(如果客户端使用 EDNS0 而响应未使用,则更短),从而消除放大。
任何完成 TCP 握手并在连接上发送 DNS 请求的客户端 IP 都可以暂时列入白名单。列入白名单后,该 IP 可以发送 UDP 查询并接收最多 512 字节(如果使用 EDNS0 则为 4096 字节)的 UDP 响应。如果 UDP 响应触发 ICMP 错误消息,则该 IP 会再次从白名单中删除。
该方法也可以使用黑名单逆转,这仅意味着默认情况下允许客户端 IP 通过 UDP 进行查询,但任何 ICMP 错误消息都会导致 IP 被列入黑名单,需要 TCP 查询才能脱离黑名单。
覆盖所有相关 IPv4 地址的位图可以存储在 444MB 内存中。IPv6 地址必须以其他方式存储。
我不知道是否有任何 DNS 服务器已经实现了这种方法。
据报道,某些 TCP 堆栈可用于放大攻击。但这适用于任何基于 TCP 的服务,而不仅仅是 DNS。通过升级到内核版本,应可以缓解此类漏洞,在该版本中,TCP 堆栈已修复为不会在响应 SYN 数据包时发送多个数据包。