// ...
;; QUESTION SECTION:
;api.leancloud.cn. IN A
;; ANSWER SECTION:
api.leancloud.cn. 286 IN CNAME api-ucloud.leancloud.cn.
api-ucloud.leancloud.cn. 353 IN A 106.75.87.92
api-ucloud.leancloud.cn. 353 IN A 106.75.95.143
api-ucloud.leancloud.cn. 353 IN A 106.75.66.151
api-ucloud.leancloud.cn. 353 IN A 106.75.87.91
api-ucloud.leancloud.cn. 353 IN A 106.75.95.141
api-ucloud.leancloud.cn. 353 IN A 120.132.49.239
api-ucloud.leancloud.cn. 353 IN A 123.59.41.31
api-ucloud.leancloud.cn. 353 IN A 106.75.95.142
// ...
;; Query time: 27 msec
;; SERVER: 192.168.89.3#53(192.168.89.3)
;; WHEN: Wed Jun 7 15:56:35 2017
;; MSG SIZE rcvd: 456
你需要在被诊断的设备和正常的设备下分别运行该命令,然后对比两者的结果(ANSWER SECTION 部分),如果结果不同说明发生了 DNS 劫持。如果域名无法解析可能是你没有连接到互联网,或者 DNS Server(上面 SERVER: 192.168.89.3 的部分)存在故障。
如果域名无法解析或确实存在 DNS 劫持,可以尝试将设备上的 DNS Server 配置成更可靠的服务商(例如 DNSPod 119.29.29.29、阿里 DNS 223.5.5.5)。若更换后仍无法解析出正确的结果,需要向你的运营商(电信、联通等)投诉。
Certificate chain
0 s:/C=CN/ST=Beijing/L=Beijing/O=Mei Wei Shu Qian ( Beijing ) IT Co., Ltd./OU=OPS/CN=*.leancloud.cn
i:/C=US/O=GeoTrust Inc./CN=GeoTrust SSL CA - G3
1 s:/C=US/O=GeoTrust Inc./CN=GeoTrust SSL CA - G3
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
网络连通性诊断流程
本文适用于使用了 LeanCloud SDK 而出现的小范围、无法确认的网络连通性的诊断。以下内容以 macOS 为例,其他操作系统和工具的安装方法见文末 安装诊断工具。
建议先确定域名,然后进行「快速诊断」,根据结果再进行其他诊断。如果诊断的目标是 4G 网络,建议在手机上打开无线热点,然后使用 macOS 接入热点进行诊断。如果问题发生在用户的设备上,可能需要用户的配合来完成诊断。
确定域名
LeanCloud 不同版本的 SDK 可能使用不同的域名,因此需要先确定所使用的域名以便进行后续的诊断。
使用 JS SDK,可以打开浏览器的调试工具查看网络请求;在 Android 或 iOS 上,可以打开调试日志查看网络请求。如果是用户反馈上来的问题,你可以用同版本的应用进行上述步骤确定所使用的域名。以下以
api.leancloud.cn
为例,请替换为你所使用的域名,如果是云引擎的请求,请使用云引擎域名。快速诊断
上述命令会给出通过 HTTP 访问 LeanCloud 服务的耗时情况,一般总耗时 1 秒以下是可以接受的:
注意输出中的时间都是「时刻」而不是「耗时」,例如 init_ssl 的耗时实际上是 0.065 - 0.032 = 0.033s.
如果请求未成功完成(http_code 显示为 000):
curl: (6) Could not resolve host
,请跳转到「DNS 诊断」。curl: (7) Failed to connect to host
,请先进行「DNS 诊断」,再进行「延迟和丢包诊断」。curl: (35) SSL connect error
,请先进行「DNS 诊断」,再进行「SSL 诊断」。curl: (60) SSL certificate problem
,请先进行「DNS 诊断」,再进行「SSL 诊断」。如果命令长时间没有结束,请改用
curl -v https://api.leancloud.cn/1.1/date
来获取不完整的信息,确认请求卡在哪个步骤,再进行「延迟和丢包诊断」。请留意在进行诊断时是否开启了代理,否则得到的是经过了代理的访问情况,如不确认请在 curl 后添加
--noproxy '*'
。有些开发者可能习惯用 ping 检测服务可用性,但是 LeanCloud 的服务器并不是全部支持 ping 检测,所以 ping 的结果无法反映服务可用性。 我们建议使用 curl 等工具检测(参见本小节开头的 curl 测试命令样例)。
DNS 诊断
上述命令会给出 DNS 查询的结果,以下是部分输出:
你需要在被诊断的设备和正常的设备下分别运行该命令,然后对比两者的结果(
ANSWER SECTION
部分),如果结果不同说明发生了 DNS 劫持。如果域名无法解析可能是你没有连接到互联网,或者 DNS Server(上面SERVER: 192.168.89.3
的部分)存在故障。如果域名无法解析或确实存在 DNS 劫持,可以尝试将设备上的 DNS Server 配置成更可靠的服务商(例如 DNSPod 119.29.29.29、阿里 DNS 223.5.5.5)。若更换后仍无法解析出正确的结果,需要向你的运营商(电信、联通等)投诉。
如果你的设备全部存在连通性问题,可以尝试使用第三方服务的解析结果进行对比(例如 digwebinterface.com)。
Windows 系统下没有预装
dig
命令,可以使用 nslookup:SSL 诊断
SSL 本身有防御 DNS 劫持的能力,因此在进行 SSL 诊断之前请先检查 DNS 劫持的情况,如果 DNS 确实被劫持了,可通过下面的命令看到劫持者所使用的证书。
以下是部分结果,可以看到对方使用的证书:
完整结果还包含了更多的信息,如果确实发生了劫持可将结果提供给我们。
安装诊断工具
brew install mtr openssl
,brew 需要在 https://brew.sh/ 安装。相关文档:中国移动运营商网络问题的诊断和投诉