所谓的域名存活状态检测, 其实就是指我们利用DNS解析手段, 或者通过发出HTTP以及HTTPS请求, 再结合上WHOIS查询这些方式, 去判断某一个或者是某一些域名, 它们在现在的此时此刻, 到底是不是处于一个正常的、在线的、可以被人们访问到的那种状态。
这里的核⼼判定依据主要有三样: 首先要看这个域名在注册局的系统里面, 它的状态到底是不是一种叫做active的状态, 其次要看对这个域名的DNS解析工作, 到底是有没有生效, 最后还要看相关的Web服务, 在进行响应返回的时候, 给出的究竟是不是一个有效的响应内容。
在需要批量进行检测的场景里面, 大家通常会用并发发送请求的办法并且加上超时的判断逻辑。这种方法是用来对有成百上千个那么多的域名一起进行扫描操作的。做完了这些操作以后, 会输出一个格式化的最终结果报告。
域名存活检测的核心方法
1. 从DNS这一层面来看, 你需要去查询域名的A记录或者是AAAA记录, 从而来确认是否存在有效的IP解析, 同时还要去检查NS记录是不是指向了可用的DNS服务器, 对于那些启用了DNSSEC的域名, 我们可以进一步去验证签名的完整性。
2. 在HTTP与HTTPS这一层面上, 我们需要向目标域名去发送GET类型的请求, 这个请求通常会指向默认的80端口或者443端口, 并且在发送的时候要去记录接收到的那个响应的状态码。
如果得到的状态码是200, 或者是301, 或者是302, 又或者是很常见的304情况的话, 那么我们把这些情况都统一视为系统处于存活的状态。要是遇到了403这种情况, 又或者是404这种情况, 这说明服务器本身还是在线的, 不过具体的页面内容是无法进行正确访问的。
当遇到属于5xx这个系列的代码时, 那么就需要把它专门标记为服务端出现了异常。至于连接超时这个问题, 如果我们设定的默认时间范围是在5秒到10秒之间, 只要超过了这个范围, 就判定该系统是不可达的。
3. 在注册状态这一层面, 大家可以去通过WHOIS协议或者RDAP协议来查询一下域名的注册信息, 然后去确认那个状态字段的值是不是active, 以此来排除掉那些属于锁定状态或者是失效状态的记录, 比如说expired、pendingDelete、clientHold、serverHold这些。
批量检测操作步骤
1. 把那个等着要去检测的域名给整理成一个列表出来, 这个列表是支持用txt文件的格式或者是用csv文件的格式的来的, 每一行要只放一个域名的样子。
2. 需要对检测参数进行配置, 超时时间的建议值是5秒, 并发数的建议范围是50到100, 重试次数的建议值是1到2次。
3. 系统会执行批量扫描这一动作, 在开始之后, 它会依次的顺序去把DNS查询这个事儿做完,然后再去把HTTP请求这个动作完成, 最后再来完成状态码记录这最后一个环节。
4. 请输出结果, 并且要按照存活这一种情况、不可达这一种情况、超时这一种情况还有解析失败这第四种情况进行分类统计和归集。
5. 系统会对那些已经被标记成问题的域名间隔30秒进行二次复核, 以此排除因为网络出现抖动而造成的误判。
检测工具与平台
常用的工具包括: 命令行层面上的DNSLookup、用来做批量脚本的curl以及massdns;在在线平台方面, gname.xin这地方能够提供商名存活状态的批量查询服务, 它支持上传一个域名列表, 在数分钟之内就可以把检测的事情完成, 并且还能输出结构化的报告, 这样的特点适合运维团队去做日常的巡检工作;从编程实现的角度来说, 可以使用Python中的requests库结合concurrent.futures这个模块来达到目的, 这个做法适用于那些需要有自定义判定逻辑的场景。
结果判定参考标准
HTTP 200/301/302/304 → 存活
当返回的状态码是HTTP 403或者HTTP 404的时候, 这通常意味着目标服务还存在着, 它是处于在线的状态, 只是页面访问受到了一定的限制。
HTTP 5xx代表的是服务端异常, 需要跟进处理。
如果域名系统返回了NXDOMAIN这一状态代码或者表示没有解析结果的情况, 那么这意味着目标是不可达的。
出现连接超时的状况, 这就意味着目的地是不可以到达的, 需要去重新核对。
当WHOIS显示的状态是expired或者pendingDelete的时候, 那就意味着这个域名现在是已经失效了。
注意事项
每一次进行的检测工作, 都会受到本地DNS缓存状况和网络环境好坏的影响, 所以如果遇到有问题的结果, 一定要再进行多次重复测试来确认情况。
如果并发量过高, 那么就有可能会触达目标服务器的限流机制。所以对于这个指标来讲, 建议大家将其控制在100这个数值以内。
在实施检测手段之前, 务必要去确认一下本地的网络接入情况以及DNS的相关配置是不是处于正常状态。这样做主要是为了避免出现把自身发生的故障错误地判断为域名失效的情况导致判断失误。
在涉及到敏感业务的场景里, 应当优先去使用那个HTTPS协议, 以此来防止出现中间人进行干扰而最终导致误判。


