这是关于保护公共DNSparsing器的规范性问题
开放的DNS服务器看起来非常整洁,方便,因为它们提供的IP地址可以在我们的公司中一致地使用,无论它们位于何处。 谷歌和OpenDNS提供这种function,但我不确定我希望这些公司能够访问我们的DNS查询。
我想为我们的公司设置这样的东西,但我听到很多关于这是危险的做法(特别是在放大攻击方面 ),我想确保我们这样做是正确的。 build立这种types的环境时,我需要记住什么?
有几件事情你需要了解进入这个:
大多数想要build立这种types的环境的人都是系统pipe理员。 这很酷,我也是系统pipe理员! 部分工作是理解你的责任到底和别人的开始,相信我,这不是系统pipe理员可以自行解决的问题。 原因如下:
build立一个面向互联网的DNSparsing器非常容易。 build立一个研究所花费的研究远比理解这样做所涉及的风险要less得多。 这是善意不经意地使他人的不当行为(和痛苦)的情况之一。
有时候有必要衡量热情与现实。 这里有一些难题要问自己:
这是你想要一时兴起的东西,还是这个东西你有几百万美元投资做对了?
你有一个专门的安全团队吗? 专门的滥用团队? 他们两个都有周期来处理滥用新基础设施的情况,以及你会从外部获得哪些投诉?
你有法律团队吗?
当这一切都说完之后,所有这些努力是否都会远程开始为自己付出,为公司谋利还是超过处理这个方向带来的不便的货币价值呢?
最后,我知道这个线程对于大多数被链接到的人来说是一个令人失望的问题。 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数据包。