DNS放大攻击的核心链路在于攻击者用几十字节的伪造查询,撬动开放的递归服务器吐出几十倍甚至上百倍体积的响应数据,最终把流量洪峰定向砸向目标IP整个过程的本质是请求验证缺失与响应资源不对等的组合放大。
理解一次查询的“体重差”到底有多大
我们需要先承认一件事:DNS协议本身是高效的,它让人类用字符串找到IP地址,过程通常只有几十毫秒,但正是这个“轻量”特性,让攻击者看到了不对称的杠杆支点。
一个常规的DNS A记录查询,发出的请求包大约在40到60字节,精简到连一个TCP握手都嫌小,对应的响应包,通常在100到400字节之间,已经产生了近10倍的放大。
你以为这就是极限?不是,当攻击者改用ANY类型查询,或者查询一个带有大量TXT记录、DNSSEC签名记录的域名时,响应体积可以飙升至4000字节以上,请求与响应的比例关系已经变成了1:70甚至1:100,也就是说,你扔出一颗石子,回弹的是一块巨石。
行业共识认为,放大倍率超过50倍的查询组合在公网上长期存在,这是治理难点之一。
| 查询类型 | 请求大小(约) | 响应大小(约) | 放大倍数 |
|---|---|---|---|
| A记录 | 50字节 | 200字节 | 约4倍 |
| AAAA记录 | 50字节 | 300字节 | 约6倍 |
| ANY + DNSSEC | 60字节 | 4500字节 | 约75倍 |
链路形成的首要物理条件,就是这种体型差。
DNS放大攻击原理是什么把普通协议改造成武器
理解原理,关键是抓住三个角色的配合。
第一个角色是攻击者,它不直接参与流量轰炸,他更像一个发号施令的将军。
第二个角色是开放递归解析器,这通常是配置不当的校园网DNS、企业内网DNS或者老旧的机房递归服务器,它们最大的毛病在于:不问来者是谁,只要是查询就老老实实回答,业内专家指出,公网仍有不少数量的开放递归节点,足以支撑大规模攻击。
第三个角色是受害者,它自始至终没有犯错,却要承受来自四面八方的垃圾流量。
攻击的推进流程如下:
- 攻击者构造一个源IP为受害者IP的DNS查询请求
- 这个伪造的请求被发送到大量开放递归服务器
- 这些服务器收到请求后,将正常响应回传至伪造的源IP地址,也就是受害者
- 因为每个响应包体积远大于请求包,受害者的带宽被迅速塞满
如此循环往复,大量递归服务器沦为肉鸡,这让防御者非常头疼:你封禁一个源IP,还有几十万个源IP在向受害者发送数据,倘若目标网站没有做好DDoS防护,几分钟内业务就会完全瘫痪。
为什么受害者成了接盘侠关键在源IP伪造
你可能好奇:服务器怎么会把流量发给一个“假地址”?
这里的关键在于UDP协议的无连接特性,DNS查询默认走UDP 53端口,UDP并不像TCP那样需要三次握手来验证双方身份,攻击者在发出数据包时,直接在IP头部篡改源地址,就能让响应包“有去无回”地飞向受害者。
很多运维人员会问:我的服务器是否也存在被利用的风险?教你一个简单的判断方法:
- 使用dig命令模拟外部查询
- 在服务器外部网络环境访问你的递归服务
- 输入
dig @你的服务器IP www.baidu.com,如果能够得到完整的应答而非REFUSED或者超时 - 你的服务器对外暴露了递归服务,具备被滥用的条件
这里想要特别说明一下,并不是所有开放递归都会被滥用,真正的安全隐患是支持递归且未做任何访问控制,如果只对内部网段开放递归,是不用太担心的。
DNS放大攻击怎么防御防守方的一张清单
防御思路分为两派:源头治理和流量清洗,多数情况下,两派需要混合使用。
从源头上讲,运营商和IDC机房会封禁源IP为伪造地址的出站数据包,这种方式叫BCP38(RFC 2827标准建议),实施后,攻击者无法再轻易发送伪造源地址的UDP包,放大攻击的弹药库会直接少掉一大截。
从递归服务器侧讲,管理员需要锁紧自己的配置:
- 限制递归权限,仅对特定IP网段开放
- 部署RRL(响应速率限制),对同一个源IP的频繁查询进行限速
- 关闭ANY类型的查询响应,这个功能在BIND 9.16之后已经默认关闭
- 部署DNS防火墙,识别并丢弃异常的大包响应
从受害者角度讲,防御路径是绕不开“云清洗”的,目前国内主流云厂商以及专业DDoS防护服务商,都提供针对UDP洪泛的清洗能力,当攻击流量达到一定阈值,流量被牵引至清洗节点,恶意报文被识别并丢弃,正常流量回注源站。
关于成本,经常有客户咨询“DNS放大攻击多少钱能防住”,这个费用的浮动蛮大:小规模低防在网关设备上做限速即可解决,基本不增加成本;基于云清洗的按需付费模式,则在几十万到上百万每年之间,具体取决于攻击峰值带宽的大小,对比业务中断的损失,这笔花销多数企业是划算的。
模拟一次放大链路实操场景推演
我们以一个内网测试环境为例,帮你形成直观感知,假设:
攻击者通过命令行工具发送伪造源地址的查询,目标是某开放递归服务器 (IP: 1.2.3.4),伪造的受害者IP是 5.6.7.8。
# 攻击者侧构造恶意查询,响应会回到5.6.7.8 scapy> send(IP(src="5.6.7.8", dst="1.2.3.4")/UDP(sport=1234,dport=53)/DNS(rd=1,qd=DNSQR(qname="example.com", qtype="ANY")))
- 2.3.4 的递归服务器收到查询后,会查询example.com的权威服务器
- 返回结果中包含了A记录、AAAA记录、MX记录、TXT记录等多个资源记录
- 该大数据包被发送至 5.6.7.8
这就完成了单次的“四两拨千斤”,如果攻击者同时用脚本控制上千台肉鸡发送同样的请求,受害者收到的流量就会瞬间爆炸。
加固链路的具体命令与配置
为了让你有可验证的抓手,这里列出针对常见DNS服务软件的加固参考。
在BIND中,限制递归范围:
options {
allow-query { any; };
allow-recursion { 192.168.1.0/24; 10.0.0.0/8; };
rate-limit {
responses-per-second 5;
slip 2;
};
};
在Unbound中,关闭ANY并限制并发:
server:
deny-any: yes
unwanted-reply-threshold: 10000000
do-udp: yes
access-control: 10.0.0.0/8 allow
access-control: 127.0.0.0/8 allow
access-control: 0.0.0.0/0 refuse
保存配置后,执行 rndc reload 或 service unbound restart 即可生效,完毕后使用上述的 dig 外部测试方法复查,确认服务已对外不响应递归。
常见问题解答:DNS放大攻击链路的核心疑问
DNS放大攻击和ICMP洪泛有什么本质区别?
两者都算反射型攻击,但放大原理完全不同,ICMP洪泛是攻击者直接向目标发送大量的Ping请求包,消耗目标带宽和CPU资源,而DNS放大攻击利用了UDP协议无握手校验的特点,将小流量借递归服务器中转后,放大为数十倍的洪流,在实际攻击场景中,DNS放大攻击的破坏力远大于普通ICMP洪泛,因为它更难追踪源地址。
如果公司没有专业安全团队,如何判断自己是否被攻击了?
主要看三条:第一,服务器带宽监控出现突发的UDP入流量高峰,且源端口大量集中在53;第二,机房交换机或负载均衡设备CPU负载异常飙升,无法通过业务访问量来解释;第三,用 tcpdump -i eth0 udp port 53 抓包,看到大量来自不同IP的响应包涌向你的机器,出现这些现象,大概率是被盯上了,建议立刻联系机房或安全服务商启用流量清洗。
家庭宽带或者小微企业用的路由器DNS配置会被利用吗?
家用路由器通常只做转发而不对外开放递归服务,因此被直接利用的可能性比较小,但需要注意的是,部分老旧路由器或企业级网关自带DNS代理功能,默认配置下可能对外网开放了53端口,你可以通过在线端口扫描工具核对自己的公网IP是否有53端口开放,如果有,请立即在管理界面关闭DNS代理或限制为仅内网使用,不给攻击链留入口。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/637403.html





