判断一个域名是不是真的活着, 其实就看三件特别关键的事情域名存活状态检测域名存活状态检测,第一件事是要看能不能把域名名字顺利变成IP地址, 也就是正常的DNS解析, 第二件事是去看看那个目标服务器能不能接得住HTTP或者是HTTPS这样的网页请求, 第三件事呢是要检查一下那些非常重要的业务接口端口有没有打开, 只要这其中的任何一条条件没达成, 没做好, 那你就可以很确定地说这个域名的状态是有问题的或者说是已经死了。

域名存活的判定逻辑

检测一个域名是否还存活, 按照优先级的顺序依次去验证以下的链路。

DNS解析层要看一看, 那个用权威DNS服务器给出的回复里头, 有没有拿得出来的A记录或者是AAAA记录。要是说返回了NXDOMAIN, 又或者是SERVFAIL, 再又或者干脆就是超时的话, 那就说明这个域名已经处于不可用的状态了。

把解析出来的IP地址和指定的端口比如80或者是443连起来, 看看能不能用TCP协议建立连接。如果连接被拒绝或者超时了, 那就说明服务器没有在运行。

应用响应层: 这个部分要看服务器到底能不能返回HTTP 200状态码, 或者是301状态码, 或者是302状态码。要是服务器返回了一个以5开头的错误代码, 也就是大家常说的五系列错误代码, 又或者服务器什么都没有返回, 压根就没有任何响应的情况下, 这就说明服务层已经完全崩溃了。

以gname.xin这类域名为例, 我们可以分两步来进行操作。第一步是执行dig gname.xin +short这个命令, 通过这个操作就可以获得对应的解析IP地址了。

第二步是用curl -sI https://gname.xin这个方式来验证一下响应头信息。只要做完了这两步工作, 就可以快速判断出该域名当前的存活状态了。

5种常用检测方法

1. 通过命令行的方式来实现快速的检测这个动作,而且这个检测针对的是一个单独的域名。

DNS的检查灵音心图,可以通过执行命令nslookup 域名来进行, 也可以通过执行命令dig 域名 A来进行。

存活检查:curl -o /dev/null -s -w "%{http_code}" -m 10 https://域名

关于端口进行检查这一操作, 具体而言就是去执行telnet 域名 443这个命令, 或者是去执行nc -zv 域名 443这个命令。

2. 使用Python来写一个脚本, 然后这个脚本可以批量地进行检测。

使用requests这个库, 针对域名列表里的每一个域名, 分别去发起GET类型的请求, 并且设置超时时间为10秒, 同时把状态码还有响应时间记录下来, 如果有50个域名的话, 大约能够在1分钟之内完成对全部域名的扫描工作。

域名还活着吗?批量域名存活状态检测的5种实操方法(图1)

3. 在线DNS/SSL检测平台

通过WHOIS查询注册状态, 结合SSL证书有效期检查, 然后判断域名是否过期或是被吊销。

4. 批量PING + HTTP探测组合

我们先对IP池执行ICMP ping排除完全断网节点, 然后再对存活IP发起HTTP请求, 进行二次服务可用性确认。

5. 自动化监控(长期运行)

你可以去部署那个 Uptime Kuma, 也可以使用 Zabbix, 或者是自己来写一个定时任务, 然后让这个程序每隔 5 分钟就去对这个域名列表执行一次全链路的检测动作, 一旦发现有不正常的情况存在, 就自动地触发告警机制。

批量检测的实操要点

关于并发控制问题, 我们有这样的建议是请求的并发数量不要超过20, 这样做是为了防止目标服务器触发限流机制或者将IP地址进行封禁处理。

超时设置: 单次请求的超时时间是8到12秒, 这样可以避免有些慢节点拖慢了整体的进度。

判定阈值的意思是设定为连续3次检测失败才会被标记为死亡, 这样做的目的是为了在网络出现抖动的时候防止发生误报的情况。

结果被记录了下来, 里面保存了检测时间, 还有状态码, 以及响应耗时, 同时也对IP解析了进行保存, 这样做是为了便于事后去追溯, 也方便去做对比。

高频疑难及解决

现象 原因 处理
DNS解析正常但HTTP无响应 服务器宕机或防火墙拦截 检查主机状态与端口策略
返回403/401 域名存活但需鉴权 携带正确Token重试
SSL握手失败 证书过期或不匹配 更新证书或检查SNI配置
解析到127.0.0.1 DNS记录被误配 修正A记录指向真实IP

当上述检测步骤被全部完成之后, 那么就需要将得到的检测汇总的结果整理成为包括“存活状态”、“异常状态”以及“死亡状态”这三种特定状态的检测报告。这样一来,这种报告就可以直接被用作对于域名资产进行有效管理的相关决策依据, 同时也能够直接作为针对域名是否需要进行续费这一事项做出最终判断的直接依据。