什么是 ANY 查询?

一条查询可以把一个名字下所有类型的记录一次问全,这在早期是省事的用法。后来它成了放大攻击里性价比最高的工具,标准随即允许服务器少答一点。

第 32 期讲过域名系统里的记录类型:一个名字下面可以有地址、邮件、文本等多种记录。查询的时候通常要指明类型,问哪一类就答哪一类。

ANY 查询是不指明类型的那一种,类型值为 255,意思是把这个名字下的记录都返回。早期网络环境里,这种问法能省掉多次往返,一次拿全。它也是调试时常用的手段,想知道一个域名配了什么,一条命令就能看齐。

它的麻烦在于应答很大。第 114 期讲过放大攻击:攻击者伪造来源地址发出请求,让应答涌向受害者,请求越小、应答越大,放大倍数越高。ANY 查询正好符合这个形状——请求很短,返回的却可能是这个域名下的全部记录,几十倍的放大很常见。

公开的域名系统软件和公共解析服务后来陆续改了做法,不再返回这份全量清单,改成只给一条最小应答。这属于实现一侧的选择,标准一侧的做法出现在 2019 年 1 月:RFC 8482 给出了统一的出路,权威服务器收到 ANY 查询时可以不返回全部记录,而是返回一份最小应答,或者只回一条占位记录,让客户端知道这里没有它想要的东西。

这样一来,查询本身仍然合法,语义却被收窄成"这里没什么可给的"。依赖 ANY 拿全量记录的旧用法因此不再可靠,而放大攻击也失去了这个最好用的入口。