限制递归查询范围是削弱DNS放大攻击效果最直接有效的手段,通过控制允许发起递归查询的客户端来源,可以大幅降低攻击者利用开放DNS服务器发起反射放大攻击的可能性。
DNS放大攻击原理及防御:递归查询为何是核心
DNS放大攻击本质上是一种反射型分布式拒绝服务攻击,攻击者伪造受害者的IP地址,向大量开放的DNS服务器发送小尺寸查询请求,服务器则返回体积大得多的响应数据,这些数据最终全部涌向受害者,业内共识认为,这种攻击能奏效的核心前提是DNS服务器允许来自任意IP的递归查询。
递归查询意味着服务器不会只返回缓存或权威数据,而是会替客户端向上游逐级解析,最终将完整结果返回,攻击者利用的就是这个特性他们发送的查询类型(如ANY)会触发服务器返回包含多条记录的响应,放大因子可达数十倍甚至更高,如果服务器限制递归查询只对特定IP段开放,攻击者的伪造请求就无法触发递归过程,转而收到一个拒绝或限定响应,放大效果瞬间归零。
限制递归查询范围的具体操作与配置方法
限制递归查询范围的核心思路很简单:明确哪些客户端可以发起递归请求,其余一律拒绝,不同DNS软件的实现方式略有差异,但原理一致。
BIND递归查询限制配置
BIND是使用最广泛的DNS服务器软件之一,在named.conf中,你可以在options或view块内通过allow-recursion和allow-query-cache来指定来源。
- 使用ACL(访问控制列表)定义可信网络:
acl internal_net { 192.168.1.0/24; 10.0.0.0/8; }; - 在
options中应用:options { recursion yes; allow-recursion { internal_net; }; allow-query-cache { internal_net; }; }; - 如果只希望部分区域提供递归,可以在
view块内单独配置。
配置完成后需要重启或重新加载BIND服务,建议用named-checkconf验证语法无误。
Unbound递归查询限制配置
Unbound是一个轻量级递归服务器,配置集中在unbound.conf

。
-
使用
access-control选项决定哪些IP段允许递归:server: access-control: 127.0.0.0/8 allow access-control: 192.168.1.0/24 allow access-control: 0.0.0.0/0 refuse这样只有本地和内部网络可以递归,外部请求被拒绝。
-
如果你希望更精细控制,可以配合
access-control-view或local-zone。
Unbound默认只允许本地递归,但很多管理员在部署时将其改为开放,成为攻击目标,建议检查是否留下了0.0.0/0 allow的配置。
Windows DNS服务器限制递归
Windows DNS服务器通过图形界面或PowerShell调整递归行为。
- 打开DNS管理器,右键点击服务器,选择“属性” -> “高级”选项卡。
- 在“服务器选项”中,勾选“禁用递归”(即关闭递归功能)或通过“根提示”设置来控制递归流向。
- 更精确的办法是使用PowerShell命令:
Set-DnsServerRecursionScope -ScopeName . -EnableRecursion $false然后为特定子网创建递归作用域,并设置允许的客户端。
- 还可以通过防火墙规则限制外部UDP 53端口的访问,只允许内部IP发起查询。
防止DNS放大攻击的DNS递归查询设置教程
配置完递归限制后,验证是否生效同样重要,以下步骤可以帮你确认服务器已不再对外提供递归服务。
使用dig测试递归行为
从外部网络(比如一台不在允许列表内的机器)执行以下命令:
dig @你的DNS服务器IP www.baidu.com
如果返回结果中包含status: REFUSED或status: SERVFAIL,说明递归已被限制,如果返回了完整的A记录,说明递归仍然开放,需要检查配置。
检查递归查询的响应大小
攻击者常使用ANY类型查询来放大流量,你可以模拟攻击者的请求:
dig @你的DNS服务器IP ANY baidu.com
正常限制递归的服务器会返回一个很小的响应(如REFUSED),而开放递归的服务器可能返回大量数据,大小超过数KB,如果响应尺寸很小,说明限制有效。

结合日志分析
大多数DNS软件支持查询日志,开启日志后,观察是否有来自异常IP的递归请求被拒绝,例如BIND中设置querylog yes;,Unbound设置verbosity: 2,如果日志中出现大量来自外部IP的REFUSED记录,说明递归限制正在工作。
企业DNS服务器安全配置:不止是递归查询限制
限制递归查询范围是基础,但企业在实际部署中还需要其他措施来强化DNS安全,形成纵深防御。
关闭不必要的递归功能
如果DNS服务器只负责权威解析(比如托管公司自己的域名),完全不需要开启递归,直接关闭递归功能是最干净的做法。
- BIND:
recursion no; - Unbound:默认就是递归服务器,但如果只做权威解析,应改用其他软件或配置为转发模式。
- Windows DNS:在高级选项中禁用递归。
启用响应速率限制(RRL)
即使递归已限制,DNS服务器仍可能被用于针对特定域名的权威放大攻击,RRL可以限制每秒钟对同一来源的响应数量,降低攻击流量的强度。
- BIND中启用
rate-limit:options { rate-limit { responses-per-second 5; slip 2; }; };
实施源地址验证(BCP38)
攻击者之所以能伪造IP,是因为部分网络允许出站数据包携带任意源地址,企业应配合ISP实施BCP38,确保从自己网络出去的流量源IP符合预期,这不能直接保护本机,但能减少攻击来源。
防火墙和访问控制列表
在边界防火墙上,限制UDP 53端口只允许来自内部DNS服务器的流量,或只允许与已知权威服务器通信,对于面向外部的DNS服务器,只开放必要的端口,并配置ACL限制来源IP。
| 措施 | 防护侧重点 | 配置复杂度 | 附加效果 |
|---|---|---|---|
| 限制递归范围 | 阻止反射放大 | 低 | 直接影响攻击源头利用 |
| 关闭递归 | 彻底消除递归风险 | 低 | 适用于权威服务器 |
|
响应速率限制 |
削弱攻击流量强度 | 中 | 缓解未完全关闭的递归 |
| 源地址验证 | 减少伪造流量 | 中 | 需要ISP配合 |
| 防火墙ACL | 控制访问边界 | 低 | 基础防护,需配合其他 |
限制递归查询能多大程度削弱DNS放大攻击
限制递归查询范围直接切断了攻击者利用服务器发起反射放大攻击的路径,一旦服务器只响应内部或可信来源的递归请求,外部伪造的查询请求就无法得到放大响应,攻击效果被大幅削弱,据统计,开放递归服务器的数量大幅减少与DNS放大攻击规模下降呈正相关,这一措施配合其他安全配置,能有效降低企业DNS服务器成为攻击跳板的概率,保护自身网络带宽和公共服务可用性。
DNS放大攻击防御:限制递归查询常见问题解答
问题1:限制递归查询范围后,是否完全杜绝了DNS放大攻击的可能性?
限制递归查询范围是防御反射放大攻击的关键,但无法完全杜绝所有DNS放大攻击,如果攻击者使用真实的合法客户端(比如内部被控机器)发起递归查询,或者利用服务器的权威解析功能(如针对特定域名的ANY查询),放大攻击仍然可能发生,因此需要结合响应速率限制、源地址验证等多层手段。
问题2:配置递归查询限制后,内部用户发起递归解析会受影响吗?
只要配置正确,内部用户(来自允许列表中的IP段)的递归解析不受影响,服务器会根据来源IP判断是否允许递归,内部请求正常处理,外部请求被拒绝,常见的问题是配置时遗漏了内部某些子网,导致部分用户无法解析,需要仔细规划和测试ACL。
问题3:如何判断一台DNS服务器是否已经限制了递归查询范围?
从外部网络使用dig命令向该服务器发起一个递归查询(如查询任意域名),观察返回结果,如果返回REFUSED或SERVFAIL,说明递归被限制;如果返回正常解析结果,说明递归开放,使用nslookup设置服务器为外部IP,查询一个非本域名的记录,如果得到NXDOMAIN或解析结果,表明递归开放。
