本文目录导读:

DNS服务器的递归查询限制,通常是为了防止DNS放大攻击(DDoS的一种)、滥用服务器资源以及保护内网安全而设置的安全策略。
下面我来详细解释一下递归查询的限制机制、常见配置方法以及安全考量。
什么是递归查询?
我们需要理解“递归”和“迭代”的区别,才能理解限制的对象。
- 递归查询:客户端(如你的电脑)问DNS服务器:“帮我查一下
www.example.com的IP,查不到的话,你替我去问根服务器、顶级域服务器、权威服务器,直到找到答案再回来告诉我。”- 负担:DNS服务器需要承担繁重的“跑腿”工作。
- 迭代查询:客户端问DNS服务器:“你知道
www.example.com的IP吗?不知道的话,请告诉我下一步该问谁。”- 负担:客户端自己承担“跑腿”工作。
限制的核心: 大多数DNS安全限制,主要针对服务器执行完整递归查询的能力,特别是针对非授权客户端。
常见的递归查询限制机制
基于客户端IP地址(最常用)
这是最基础也是最核心的限制,管理员会配置DNS服务器只允许哪些IP地址或网段使用它的递归服务。
- 配置示例(BIND 9):
options { // ... 其他配置 allow-recursion { 192.168.1.0/24; 127.0.0.1; }; // 或者 allow-query { any; }; // 允许任何人查询(包括非递归) allow-recursion { trusted_clients; }; // 只允许信任的客户端使用递归 }; acl trusted_clients { 192.168.0.0/16; 10.0.0.0/8; localhost; };- 效果:只有来自
168.1.x网段或本机的查询才会进行递归,外网客户端(如互联网上的随机IP)会收到“查询被拒绝”或“服务器故障”的响应,或者被强制进行效率更低的迭代查询。
- 效果:只有来自
查询类型限制(QNAME Minimization)
这是一种更精细的控制,主要为了减少DNS服务器向外发起的递归查询数量,防止信息泄露。
- 原理:当DNS服务器进行递归查询时,它不会一次性把完整的域名(如
www.example.com)发给所有服务器,而是逐步剥离域名,只发送当前层级需要的最小信息。- 问根服务器:
com的NS记录? - 问
.comTLD服务器:example.com的NS记录? - 问
example.com权威服务器:www.example.com的A记录?
- 问根服务器:
- 限制效果:符合RFC 7816标准,减少了向外部服务器暴露完整查询目标的可能性,也减少了递归请求的数量。
速率限制(Rate Limiting)
用于防止单个IP或网段在短时间内发起大量递归查询(可能是DDoS攻击或配置错误)。
- 原理:服务器跟踪每个来源IP的查询频率,如果超过预设阈值,会暂时丢弃该IP的查询或返回错误响应(如
SERVFAIL)。 - 配置示例(BIND 9 - rate-limit):
options { rate-limit { responses-per-second 10; // 每秒钟每个IP最多10个响应 log-only yes; // 先记录,不实际限制(用于测试) // ... }; }; - 强化效果:对于突发的高频递归请求,服务器会触发“减速”或“熔断”,保护自身资源。
响应大小限制(EDNS0)
为了防止DNS放大攻击(攻击者伪造源IP,让DNS服务器向受害者发送大量响应),服务器会限制递归查询响应的最大UDP数据包大小。
- 原理:如果响应数据包超过某个大小(512字节 或 1232字节),服务器可能会截断响应,或者强制使用TCP(TCP连接更容易被防火墙追踪)。
- 限制效果:攻击者无法利用DNS服务器向受害者发送巨大的响应包来进行流量放大。
递归深度限制(Recursion Depth)
防止因配置错误或恶意域名而导致的无限递归或递归环路。
- 原理:服务器设置一个最大递归层数(10层 或 16层),如果查询的域名依赖链非常长(CNAME链套娃),达到上限后服务器会停止查询并返回
SERVFAIL。 - 配置示例(Unbound):
server: val-clean-additional: yes val-log-level: 2 # 默认递归深度通常是10,可以调整 # 一般不需要手动修改 - 保护:避免计算资源耗尽,以及因递归逻辑问题导致的CPU 100%。
如何实现与检查这些限制?
| 限制类型 | 实现方式 | 常用软件支持 | 核心目的 |
|---|---|---|---|
| IP限制 | ACL列表 | BIND, Unbound, PowerDNS, Windows DNS | 只服务特定用户 |
| 查询类型 | QNAME Minimization | BIND 9.14+, Unbound 1.8.1+, PowerDNS | 减少外泄,保护用户隐私 |
| 速率限制 | rate-limit (BIND, Unbound) |
BIND, Unbound, Knot DNS | 防止滥用,稳定服务 |
| 响应大小 | EDNS0 UDP Size 配置 | 所有主流DNS软件 | 防止放大攻击 |
| 递归深度 | 内置上限 | 所有主流DNS软件 | 防止死循环 |
实际场景中的应用
- 企业内部DNS服务器:
- 通常会开放递归查询,但仅限于内部IP地址段(通过ACL)。
- 会启用速率限制,防止内部某个中毒的电脑发起大量查询。
- 会开启QNAME Minimization,防止内部员工的查询记录(如访问
xxx内部系统.com)泄露到外部。
- 公共递归DNS(如 8.8.8.8,114.114.114.114):
- 对全世界开放递归,因此必须极度依赖速率限制、响应大小限制和强大的硬件(+优秀软件)来抵御DDoS攻击。
- 没有IP地址限制。
- 权威DNS服务器(只负责回答自己区域的域名):
- 通常完全关闭递归功能,任何递归查询请求都会被忽略或拒绝,只处理迭代查询(直接给出答案或NS指引)。
- 这是最安全的方式。
DNS服务器对递归查询的限制不是一个单一开关,而是一套组合策略,最核心的是基于IP的访问控制(决定“谁可以用递归”),其次是速率限制(决定“允许用多快”)和响应大小/深度限制(决定“避免成为攻击工具”)。
作为管理员,你需要根据你的DNS服务器的角色(递归服务器 还是 权威服务器)和网络位置(内网 还是 公网)来配置这些限制。对于权威服务器,彻底关闭递归是最高优先级的安全措施。