AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 418810
Accepted
David Schwartz
David Schwartz
Asked: 2012-08-18 15:10:07 +0800 CST2012-08-18 15:10:07 +0800 CST 2012-08-18 15:10:07 +0800 CST

面向公众的递归 DNS 服务器 - iptables 规则

  • 772

我们在 Linux 机器上运行面向公众的递归 DNS 服务器。我们已被用于 DNS 放大攻击。是否有任何iptables有助于减轻这些攻击的推荐规则?

显而易见的解决方案就是将出站 DNS 数据包限制在特定的流量级别。但我希望找到更聪明的东西,这样攻击就可以阻止到受害者 IP 地址的流量。

我已经搜索过意见和建议,但它们似乎都是“不要运行面向公众的递归名称服务器”。不幸的是,我们陷入了这样一种情况,即如果我们不这样做,不容易改变的事情就会崩溃,这是由于十多年前在这些攻击成为问题之前做出的决定。

domain-name-system
  • 9 9 个回答
  • 8200 Views

9 个回答

  • Voted
  1. Best Answer
    gravyface
    2012-08-21T08:29:33+08:002012-08-21T08:29:33+08:00

    整个事情有点像“不是我的问题”的场景,这并不是你的错,应该/可以通过采取适当的行动来 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)。

    1. “大记录类型”:您的设备甚至需要 TXT 或 SOA 记录才能被您的递归 DNS 服务器解析吗?您可以指定哪些记录类型在您的 DNS 服务器上有效;我相信使用 BIND 和 Windows DNS 是可能的,但您必须进行一些挖掘。如果您的 DNS 服务器响应SERVFAIL任何 TXT 或 SOA 记录,并且该响应至少比预期的有效负载小一个(或两个)数量级。显然你仍然是“问题的一部分”,因为受欺骗的受害者仍然会SERVFAIL从你的服务器获得这些响应,但至少你没有攻击它们,也许你的 DNS 服务器从收集的列表中“除名”机器人随着时间的推移使用不“合作”。

    2. “功能域”:您可以仅将有效域列入白名单。我在强化的数据中心设置上执行此操作,其中服务器只需要 Windows Update、Symantec 等即可运行。但是,此时您只是在减轻造成的损害:受害者仍会受到您服务器的轰炸NXDOMAIN或SERVFAIL响应,因为您的服务器仍会响应伪造的源 IP。同样,Bot 脚本也可能会根据结果自动更新其打开的服务器列表,因此这可能会导致您的服务器被删除。

    正如其他人所建议的那样,我还会在应用程序级别(即消息大小、每个客户端的请求限制)或防火墙级别(参见其他答案)使用某种形式的速率限制,但同样,您将必须进行一些分析以确保您不会扼杀合法流量。

    经过调整和/或训练的入侵检测系统(同样,这里需要一个基线)也应该能够按来源或数量检测随时间推移的异常流量,但可能会定期进行保姆/调整/监控以防止误报和/ 或者看看它是否真的在阻止攻击。

    归根结底,你不得不怀疑所有这些努力是否值得,或者你是否应该坚持做正确的事情,这首先就消除了问题。

    • 10
  2. bahamat
    2012-08-18T16:45:11+08:002012-08-18T16:45:11+08:00

    这取决于您想要执行的速率限制类型。

    速率限制iptables实际上更多地用于限制传入的数据包,因为达到限制的数据包将匹配过滤器并应用指定的目标(例如,ACCEPT)。您可能会有一个后续目标,目标是DROP与过滤器不匹配的数据包。虽然iptables有一个QUEUE目标,但它只是将数据包传递到用户空间,您需要在其中提供自己的排队应用程序。您还可以对传出数据包进行速率限制,但很少有人真的想开始丢弃传出流量。

    iptables速率限制下降:

    iptables -A INPUT -p udp --port 53 -m hashlimit --hashlimit 1/minute --hashlimit-burst 5 -j ACCEPT
    iptables -A INPUT -p udp --port 53 -j DROP
    

    使用hashlimitrather thanlimit会给你每个目标 IP 的速率限制。即,到达限制的 8.8.8.8 的五个数据包将阻止数据包被发送到 8.8.4.4,而hashlimit如果 8.8.8.8 达到最大值,您仍然可以到达 8.8.4.4,这听起来更像您想要的。

    如果您不想丢弃超过限制的数据包,那么您真正想要的是tc. tc将调节流量以获得稳定的流量而不是大量的突发流量。在传入端,数据包传送到应用程序的速度较慢,但​​都会按顺序到达。传出数据包将尽可能快地离开您的应用程序,但会以一致的流形式放置在网络上。

    我用得不多,但这里有一个速率限制 ICMPtc的示例,您可以轻松地适应 DNS。

    • 6
  3. Chris Bennett
    2012-12-12T00:33:41+08:002012-12-12T00:33:41+08:00

    您可以采取以下措施来潜在地减轻对欺骗性查询的响应,但这需要一些工作:

    首先,查看您的安全通道日志,找到一个被欺骗的 IP 地址。

    然后使用该源 IP (10.11.12.13) 运行 tcpdump,如下所示:

    tcpdump -n src 10.11.12.13 and udp dst port 53 -v -X -S

    你会得到这样的东西:

    18:37:25.969485 IP (tos 0x0, ttl 52, id 46403, offset 0, flags [none], proto: UDP (17), length: 45) 10.11.12.13.51169 > 01.02.03.04.domain: 4215+ ANY ?. (17)
            0x0000: 4500 002d b543 0000 3411 b9d9 0A0B 0C0D E..-.C..4 ......
            0x0010: 0102 0304 c7e1 0035 0019 0e89 1077 0100 ......5 .....w ..
            0x0020: 0001 0000 0000 0000 0000 ff00 0100 ..................
    

    现在是有趣的部分!在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

    您的里程可能会有所不同...希望这会有所帮助。

    • 4
  4. Vince Berk
    2012-08-21T06:12:23+08:002012-08-21T06:12:23+08:00

    tc在 Linux 中为出站端口 53 UDP使用和排队规则:

    IFACE=eth0    
    tc qdisc  add dev ${IFACE} root handle 1: htb default 0
    tc class  add dev ${IFACE} parent 1: classid 1:1 htb rate   10mbit burst 20m
    tc qdisc  add dev ${IFACE} parent 1:1 handle 10: sfq perturb 1
    tc filter add dev ${IFACE} protocol ip parent 1:0 prio 1 handle 1 fw flowid 1:1
    

    将为disc任何带有防火墙标记“1”的数据包设置 10mbit 的限制。防火墙标记仅在防火墙内部,不会修改数据包。只是排队规则对数据包的处理。以下是iptables制作防火墙标记的方法:

    iptables -A PREROUTING -o eth0 -p udp --sport 53 -t mangle -j MARK --set-mark 1
    iptables -A PREROUTING -o eth0 -p udp --dport 53 -t mangle -j MARK --set-mark 1
    

    根据您的喜好进行修改以排除受信任的子网和/或目的地。将-o eth0整形限制为仅出站数据包。希望这可以帮助。

    • 3
  5. pQd
    2012-08-18T16:12:38+08:002012-08-18T16:12:38+08:00

    根据您所在的网络“位置”[具有多个 bgp 提要或处于互联网的“末端”- 作为存根网络],您可以尝试使用uRPF之类的方法来防止源地址欺骗。

    其他信息来源。

    • 1
  6. dmourati
    2012-08-21T08:18:13+08:002012-08-21T08:18:13+08:00

    我会尝试编写一个列表,列出所有依赖于您面向外部的递归解析器的客户端。从 DNS 框上的数据包跟踪开始一天左右。从那里开始创建 iptables 规则以允许您识别和授权的流量。默认最终将流量降低到 53/tcp 和 53/udp。如果这破坏了某些东西,请微调您的规则。

    • 1
  7. Jason Preston
    2012-10-29T07:17:38+08:002012-10-29T07:17:38+08:00

    这些设备是否仍在支持合同中?如果是这样,请联系您的客户。让他们知道互联网在过去十年中发生了一些变化,为了继续为这些设备提供名称解析,您需要知道 SRC IP 以期待查询。设定一个大约 6 个月后的日期,届时您将无法再为未知客户提供服务,并坚持下去。这在行业中很常见。如果这些设备不再有支持合同……听起来像是一项商业决策。贵公司打算在不再产生收入的旧产品上花费多长时间?

    这些听起来像是专用设备,它们是否专业到您可以合理预测哪些域可以进行合法查询?bind 支持视图,创建一个只对这些域进行递归的公共视图。

    将此作为一个学习机会,如果您还没有这样做,请停止发布您没有能力修复错误的产品。就是这样,一个错误。肯定会过早地淘汰此设备的人,迟早。

    • 1
  8. Jan
    2013-03-30T22:51:10+08:002013-03-30T22:51:10+08:00

    从某个地方的 nanog,这个:

    iptables -A INPUT -p udp --dport 53 -m hashlimit \
    --hashlimit-name DNS --hashlimit-above 20/second --hashlimit-mode srcip \
    --hashlimit-burst 100 --hashlimit-srcmask 28 -j DROP 
    

    这并不理想。每秒允许更少的数据包并具有更高的突发可能会更好。

    • 1
  9. Logic Wreck
    2012-08-21T11:45:34+08:002012-08-21T11:45:34+08:00

    这是我多次使用过的针对 DDOS 攻击的解决方案,它并不完美,但帮助了我。该解决方案包含一个脚本,该脚本每 N 分钟(如 1、2、3 等分钟)被 cron 调用,并阻止 IP 创建的连接数大于脚本中给定的连接数:

    #!/bin/sh
    
    PORT_TO_CHECK="53"
    CONNECTION_LIMIT="20"
    IPTABLES="/sbin/iptables"
    
    netstat -an > /tmp/netstat.tmp
    Buf_var1=`cat /tmp/netstat.tmp | grep -v "LISTEN"| grep ":$PORT_TO_CHECK\ " | grep -v "0.0.0.0" | awk '{print $5}' | grep -v ":$PORT_TO_CHECK$" | sed -e 's/^::ffff://g' -e 's/:.*$//g' | sort | uniq`
    i=0
    banned_flag=0
    for conn in `for i in $Buf_var1; do echo -n "$i "; cat /tmp/netstat.tmp | grep -c $i;done | grep -v "=\ 0"`;do
    [ $i = 0 ] && connip=$conn && i=1
    [ $i = 2 ] && {
    connum=$conn
    [ $connum -ge $CONNECTION_LIMIT ] && {
    [ "$var_test" = "" ] && {
    $IPTABLES -I INPUT -s $connip -j DROP
    banned_flag=1
    }
    }
    }
    [ $banned_flag = 1 ] && i=0
    [ $i = 1 ] && i=2
    done
    rm -f /tmp/netstat.tmp
    
    • -1

相关问题

  • Solaris DNS

  • resolv.conf 在经过一段时间后被更改

  • 为什么有些网站的网址中没有“www”就无法显示?[关闭]

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve