我有提供开放和递归 DNS 的业务需求。这个 DNS 当然被 DNS 放大攻击严重滥用,导致 5-10 Mbps 的持续出站负载仅由欺骗的 ANY 请求引起。因此,我必须找到一种解决方案来解决这个问题,至少要达到最小程度的滥用。我假设其他人也有同样的问题,所以我想分享我的方法,因为它似乎是唯一一种超出通常建议“不要操作开放递归 DNS”的公开共享方法“……这根本没有帮助。
因此,我正在寻找能够让我维持可操作的开放递归 DNS 的方法,同时最大限度地减少任何尝试利用可能产生的影响。
有谁知道任何其他解决方案?
当我发现放大攻击时,我的方法只是自动化我手动执行的操作:
运行 tcpdump 以确定传出流量的特征。一旦您确信这确实是 DNS ANY 请求,请使用以下命令捕获它们:
tcpdump -n udp dst port 53 | grep ANY
然后使用 iptables 丢弃具有上述特征的传出流量。
我发现绝大多数脚本小子使用我只能推测的一些开箱即用的 DNS amp 模板脚本,它可能有一个“在此处插入目标端口”行......因此将输出限制为一个特定的目标端口。在这种情况下,它就像识别该端口一样简单,并阻止从端口 53 (DNS) 到该目标端口的任何 UDP 流量。如果做不到这一点,您可以将所有流量丢弃到您的 tcpdump 显示为“请求”重复任何 DNS 查询的目标 IP 地址 - 无论如何,没有多少合法使用。
您有可能会阻止合法流量,也有可能在 tcpdump 捕获时间之间仍然允许一些滥用。但考虑到替代方案,这是一个很小的代价。
您没有提及您运行的名称服务器软件,但如果它有一些响应速率限制方案,那可能是帮助解决这种情况的良好开端。
另一种选择是引入一些额外的层来进行速率限制/阻止,但我建议使用一些深度 DNS 感知工具而不是自己滚动。
看看dnsdist,一个非常灵活的 DNS 代理/负载均衡器(文档/配置示例)。
当然,如果可能的话,简单地锁定对已知客户端的递归访问会容易得多。