Canary Workshop

Whatever is worth doing at all is worth doing well

一个基于 SOA 记录的域名扫描工具

在使用 Har-Kuun/DomainMegaBot 扫描域名的时候发现了一些问题,如扫描过慢、经常报错等,于是就编写了这个基于 SOA 的扫描工具。

工具原理非常简单:RFC 1035 规定每个域名都需要有一个 SOA 记录,即注册过的域名都将会包含一个 SOA 记录,哪怕这个域名连 A 记录也没有。也就是说,要判断一个域名是否存在,只需要判断是否有 SOA 记录。

这样一来,基于 WHOIS 的查询的诸多缺陷就被规避了,其中包括:

  • 部分域名不开放 WHOIS 查询;
  • 部分域名的 WHOIS 查询限制严格;
  • 许多国别域名查询速度非常慢;
  • 需要维护专门的 WHOIS 列表。

在编写的过程中,曾经考虑了两种判断记录是否存在的方法:

  • 通过 DNS 响应的 ANCOUNT 字段,即响应包含的回答数量;
  • 通过 DNS 响应的 RCODE 字段,即响应状态。

在实际操作中发现,许多域名在部分 DNS 服务器下会报 SERVFAIL(该问题主要存在于8.8.8.8),且原因暂不明确。然而根据 RFC 2929RCODE 字段包含的信息较为丰富:0为正常,2为错误,3为域名不存在。于是,通过 RCODE 来判断更具有普适性。这也是最终采取的方案。

考虑到要构造的 DNS 请求非常简单,为了减少第三方依赖,使用了 Python 内建的库硬编码了大部分请求字段,仅有域名和 ID 变动。

最后是代码,参阅 dynos01/DomainScanningTool