问题描述#
笔者在访问某个网站时,突然提示找不到服务器。而该网站在昨天仍能够正常连接,并且在手机端使用流量也能够正常连接。

排查与解决#
首先在命令行中使用 ping 工具检查连通性。得到结果:
> ping cst.b***.edu.cn
Ping 请求找不到主机 cst.b***.edu.cn。请检查该名称,然后重试。plaintext可以确认问题出在 DNS 上,系统无法通过域名解析到对应的 IP 地址。因此尝试使用 Windows 下的 nslookup 工具发起 DNS 请求,查看能否正常进行域名解析。
可以看到结果如下所示,DNS 服务器能够查询到这个域名的记录,但是返回的是一个 IPv6 地址。而本地使用的是校园网,暂不支持 IPv6,因此无法正常连接。

由于问题是突发性的,不排除网站正在检修,导致 IPv4 地址不通的可能性。为了验证这一猜想,我将用于加速国外网站的代理调成了全局模式(相当于更换一个 IP 进行访问,仍然是仅 IPv4 的环境)。发现网站可以正常打开。
因此可以得出结论:导致该网站打不开的原因是校内的 DNS 服务器配置存在问题,无法给出正确的 IPv4 应答,导致无法访问。由于我只是临时访问这一网站,至此就没有寻找后续的长期解决方案。
并且该问题的出现已经不是一两次了,之前就经常出现 DNS 问题,只是没有仔细研究。
值得一提的是,我在关闭代理之后重新尝试打开目标网站,发现又能够正常连接了。再次使用 nslookup 工具,发现应答中重新出现了 IPv4 地址。

思路总结与延伸#
在某一网站突然无法访问时,如何排除故障?#
在上面的案例中,我在排查这类故障(仅这个网站打不开,其他网站访问正常)的时候遵循以下的初步思路,可供参考。简单来说分为三步:确认环境差异 → 测试连通性 → 逐步缩小范围,如下所示:
- 更换设备与网络环境(如使用手机流量),是否能够正常访问?
- →可以访问:考虑是否为本地设备与网络环境的问题。
- 使用
ping命令测试该网站域名,能否 ping 通?- →连接成功:检查是否为浏览器问题(可使用
curl尝试),也可能为配置问题。 - →连接不稳定,很高的丢包率:网络环境差,尝试检查是否为配置问题。
- →连接失败,找不到域名:DNS 配置问题,尝试使用
nslookup或dig命令检查 DNS 服务。 - →连接失败,显示超时:多半是网站在局域网范围被屏蔽。也可以检查
hosts文件。
- →连接成功:检查是否为浏览器问题(可使用
- 使用
- →不能访问:网站或区域问题。例如服务器宕机或者该网站被GFW屏蔽。
- 使用
ping命令测试该网站域名,能否 ping 通?- →连接成功:疑似HTTP请求被拦截,有待后续调查。
- →连接失败,显示超时:多半是网站被墙或者宕机。
- →连接失败,找不到域名:考虑是否为网址输入有误,或者网站已关闭。
- 使用
- →可以访问:考虑是否为本地设备与网络环境的问题。
可以看到,故障排除的过程其实就是一个调查并获取线索,然后利用逻辑思维缩小范围、由果溯因的过程,我个人觉得挺有意思的。
将 DNS 更换成公共 DNS 服务器,能否一劳永逸地解决问题?#
答案是不能。尽管大多数莫名其妙的问题都和 DNS 有关,有时候把 DNS 服务器换成 8.8.8.8(Google的公共DNS)就能解决,但不推荐长期这么做。
在此前的一次网络问题中,我的设备在访问腾讯文档时总是极其缓慢,但其他网站都是正常的,在手机上使用也是正常的。使用 ping 命令发现目标服务器的丢包率非常高。
排查了大半天,发现是因为我把电脑上的DNS服务器地址设为了 223.5.5.5(阿里云公共DNS),后者返回的 IP 地址虽然能够连通,但不是最优线路。这是因为公共 DNS 可能会把域名解析到距离服务器所在地最近的节点,而不是距离用户最近的节点。而校内 DNS 返回的是离我最近的 CDN 节点,能够保证流畅访问。
这说明在某些情况下,使用公共 DNS 会存在 CDN 定位不准确的问题,导致访问更加缓慢。
因此,推荐的做法是避免单点依赖——可以多配置几个DNS,同时也保留本地运营商DNS。最好的做法是使用自定义的本地DNS服务器,例如SmartDNS ↗,它支持并发查询多个 DNS,并返回最快可用的结果。