我们在 Linux 机器上运行面向公众的递归 DNS 服务器。我们已被用于 DNS 放大攻击。是否有任何iptables
有助于减轻这些攻击的推荐规则?
显而易见的解决方案就是将出站 DNS 数据包限制在特定的流量级别。但我希望找到更聪明的东西,这样攻击就可以阻止到受害者 IP 地址的流量。
我已经搜索过意见和建议,但它们似乎都是“不要运行面向公众的递归名称服务器”。不幸的是,我们陷入了这样一种情况,即如果我们不这样做,不容易改变的事情就会崩溃,这是由于十多年前在这些攻击成为问题之前做出的决定。
整个事情有点像“不是我的问题”的场景,这并不是你的错,应该/可以通过采取适当的行动来 100% 解决,不管它有多“困难”或“困难”,这就是终止你的打开递归服务器。
逐步淘汰:告诉客户该服务器将于 X 日停止使用。在那之后,他们需要安装补丁(假设您有补丁)以阻止它使用您的 DNS 服务器。这是一直在做的。系统管理员、网络管理员、服务台人员、程序员?我们明白了;这种生命周期结束的事情一直在发生,因为它是供应商/服务提供商/合作伙伴告诉我们在 X 日期后停止使用某些东西的标准操作程序。我们并不总是喜欢它,但它是 IT 生活中的一个事实。
你说你当前的设备上没有这个问题,所以我假设你已经通过固件更新或补丁解决了这个问题。我知道你说过你不能触摸设备,但他们肯定可以吗?我的意思是,如果他们允许这些盒子本质上给你打电话,他们就不会真的对谁对他们的设备做了什么那么肛门;您可以为他们所知道的一切设置反向代理,所以为什么不让他们安装修复此问题的补丁或告诉他们使用自己的 DNS 服务器。您的设备肯定支持 DHCP;我想不出一个网络设备(不管多旧/脆弱/奇数)不会。
如果你做不到,下一步要做的是控制谁可以访问你的递归服务器:你说“很难说”谁在使用它以及如何使用它,但现在是时候确定并开始减少流量了不合法。
这些是“准军事/政府”组织,对吧?好吧,他们很可能是他们拥有的合法网络块的一部分;这些设备不是动态 IP 背后的家庭路由器。查出。联系他们,解释问题,以及如果他们可以确认设备将用于访问您的 DNS 服务器的网络块/IP 地址, 您如何通过不强制更换固件或产品来为他们节省大量资金。
这一直都是这样做的:我有几个客户以这种方式限制外联网访问或 HL7 听众到医疗保健合作伙伴;没那么难让他们填写表格并提供 IP 和/或 netblock 我应该期待流量来自:如果他们想要访问外部网,他们必须给我一个 IP 或子网。而且这很少是一个移动的目标,所以你不会每天被数百个 IP 更改请求淹没:大型校园医院网络拥有自己的网络块,有数百个子网和成千上万的主机 IP,它们经常给我我应该期待的一些 IP 地址或子网;再一次,这些不是一直在校园里游荡的笔记本电脑用户,那么为什么我会期望看到来自不断变化的 IP 地址的 UDP 源数据包?很明显,我在这里假设我是一个假设,但我敢打赌,对于 < 100 台设备,它并不像你想象的那么多。是的,这将是一个冗长的 ACL,是的,
如果由于某种原因通信渠道不开放(或者某人太害怕或懒得联系这些旧设备所有者并正确执行此操作),您需要建立正常使用/活动的基线,以便您可以制定其他一些有助于(但不能阻止)您参与 DNS 放大攻击的策略。
一个长时间运行的
tcpdump
应该工作过滤传入的 UDP 53 和 DNS 服务器应用程序的详细日志记录。我还想开始收集源 IP 地址/netblocks/geoIP 信息(你的所有客户都在美国吗?阻止其他一切)因为,正如你所说,你没有添加任何新设备,你只是提供了一个遗留服务于现有装置。这也将帮助您了解正在请求哪些记录类型,以及针对哪些域、由谁以及多久请求一次:要使 DNS 放大按预期工作,攻击者需要能够向一个大型记录类型(1) 请求一个功能域(2)。
“大记录类型”:您的设备甚至需要 TXT 或 SOA 记录才能被您的递归 DNS 服务器解析吗?您可以指定哪些记录类型在您的 DNS 服务器上有效;我相信使用 BIND 和 Windows DNS 是可能的,但您必须进行一些挖掘。如果您的 DNS 服务器响应
SERVFAIL
任何 TXT 或 SOA 记录,并且该响应至少比预期的有效负载小一个(或两个)数量级。显然你仍然是“问题的一部分”,因为受欺骗的受害者仍然会SERVFAIL
从你的服务器获得这些响应,但至少你没有攻击它们,也许你的 DNS 服务器从收集的列表中“除名”机器人随着时间的推移使用不“合作”。“功能域”:您可以仅将有效域列入白名单。我在强化的数据中心设置上执行此操作,其中服务器只需要 Windows Update、Symantec 等即可运行。但是,此时您只是在减轻造成的损害:受害者仍会受到您服务器的轰炸
NXDOMAIN
或SERVFAIL
响应,因为您的服务器仍会响应伪造的源 IP。同样,Bot 脚本也可能会根据结果自动更新其打开的服务器列表,因此这可能会导致您的服务器被删除。正如其他人所建议的那样,我还会在应用程序级别(即消息大小、每个客户端的请求限制)或防火墙级别(参见其他答案)使用某种形式的速率限制,但同样,您将必须进行一些分析以确保您不会扼杀合法流量。
经过调整和/或训练的入侵检测系统(同样,这里需要一个基线)也应该能够按来源或数量检测随时间推移的异常流量,但可能会定期进行保姆/调整/监控以防止误报和/ 或者看看它是否真的在阻止攻击。
归根结底,你不得不怀疑所有这些努力是否值得,或者你是否应该坚持做正确的事情,这首先就消除了问题。
这取决于您想要执行的速率限制类型。
速率限制
iptables
实际上更多地用于限制传入的数据包,因为达到限制的数据包将匹配过滤器并应用指定的目标(例如,ACCEPT
)。您可能会有一个后续目标,目标是DROP
与过滤器不匹配的数据包。虽然iptables
有一个QUEUE
目标,但它只是将数据包传递到用户空间,您需要在其中提供自己的排队应用程序。您还可以对传出数据包进行速率限制,但很少有人真的想开始丢弃传出流量。iptables
速率限制下降:使用
hashlimit
rather thanlimit
会给你每个目标 IP 的速率限制。即,到达限制的 8.8.8.8 的五个数据包将阻止数据包被发送到 8.8.4.4,而hashlimit
如果 8.8.8.8 达到最大值,您仍然可以到达 8.8.4.4,这听起来更像您想要的。如果您不想丢弃超过限制的数据包,那么您真正想要的是
tc
.tc
将调节流量以获得稳定的流量而不是大量的突发流量。在传入端,数据包传送到应用程序的速度较慢,但都会按顺序到达。传出数据包将尽可能快地离开您的应用程序,但会以一致的流形式放置在网络上。我用得不多,但这里有一个速率限制 ICMP
tc
的示例,您可以轻松地适应 DNS。您可以采取以下措施来潜在地减轻对欺骗性查询的响应,但这需要一些工作:
首先,查看您的安全通道日志,找到一个被欺骗的 IP 地址。
然后使用该源 IP (10.11.12.13) 运行 tcpdump,如下所示:
tcpdump -n src 10.11.12.13 and udp dst port 53 -v -X -S
你会得到这样的东西:
现在是有趣的部分!在https://www.rfc-editor.org/rfc/rfc1035打开 rfc1035并转到第 4.1.1 节。
是时候翻译 tcpdump 的结果并找出我们可以用来创建数据包级过滤器的模式了。
标头的 ID 从 0x1C 开始,因此我们在 0x1E 处有一些标志,在 0x20 处有 QDCOUNT,在 0x22 处有 ANCOUNT,在 0x24 处有 NSCOUNT,在 0x26 处有 ARCOUNT。
这将实际问题留在 0x28,在本例中,NAME 为空 (ROOT),QTYPE = ANY 为 0xFF,QCLASS = IN 为 0x01。
长话短说,我发现添加以下 iptables 规则可以阻止超过 95% 的请求根目录中任何记录的欺骗查询:
iptables -A INPUT -p udp --dport domain -m u32 --u32 "0x28=0x0000ff00" -j DROP
您的里程可能会有所不同...希望这会有所帮助。
tc
在 Linux 中为出站端口 53 UDP使用和排队规则:将为
disc
任何带有防火墙标记“1”的数据包设置 10mbit 的限制。防火墙标记仅在防火墙内部,不会修改数据包。只是排队规则对数据包的处理。以下是iptables
制作防火墙标记的方法:根据您的喜好进行修改以排除受信任的子网和/或目的地。将
-o eth0
整形限制为仅出站数据包。希望这可以帮助。根据您所在的网络“位置”[具有多个 bgp 提要或处于互联网的“末端”- 作为存根网络],您可以尝试使用uRPF之类的方法来防止源地址欺骗。
其他信息来源。
我会尝试编写一个列表,列出所有依赖于您面向外部的递归解析器的客户端。从 DNS 框上的数据包跟踪开始一天左右。从那里开始创建 iptables 规则以允许您识别和授权的流量。默认最终将流量降低到 53/tcp 和 53/udp。如果这破坏了某些东西,请微调您的规则。
这些设备是否仍在支持合同中?如果是这样,请联系您的客户。让他们知道互联网在过去十年中发生了一些变化,为了继续为这些设备提供名称解析,您需要知道 SRC IP 以期待查询。设定一个大约 6 个月后的日期,届时您将无法再为未知客户提供服务,并坚持下去。这在行业中很常见。如果这些设备不再有支持合同……听起来像是一项商业决策。贵公司打算在不再产生收入的旧产品上花费多长时间?
这些听起来像是专用设备,它们是否专业到您可以合理预测哪些域可以进行合法查询?bind 支持视图,创建一个只对这些域进行递归的公共视图。
将此作为一个学习机会,如果您还没有这样做,请停止发布您没有能力修复错误的产品。就是这样,一个错误。肯定会过早地淘汰此设备的人,迟早。
从某个地方的 nanog,这个:
这并不理想。每秒允许更少的数据包并具有更高的突发可能会更好。
这是我多次使用过的针对 DDOS 攻击的解决方案,它并不完美,但帮助了我。该解决方案包含一个脚本,该脚本每 N 分钟(如 1、2、3 等分钟)被 cron 调用,并阻止 IP 创建的连接数大于脚本中给定的连接数: