blog
blog copied to clipboard
记一次网络错误的解决过程
我有一个项目用到了 canvas-prebuilt,今天在同事的电脑上安装它时报错了:
$ npm install canvas-prebuilt
...
> [email protected] install node_modules/canvas-prebuilt
> node-pre-gyp install
Fail to connect to 192.30.253.113:443 connection timed out
...
在我自己的电脑上安装这个模块是没有问题的,所以一开始我以为是网络不稳定造成的,但同事说从早上到晚上试了好几次都是同样的错误,所以……
我先尝试在自己电脑上 ping 了一下这个 IP:
$ ping 192.30.253.113
PING 192.30.253.113 (192.30.253.113): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
...
看来即使在能正常安装的电脑上也是 ping 不通这个 IP 的,那为什么没有遇到连接超时的错误呢?
带着这个疑问,我先查了一下这个 IP 地址是哪里的。在 Google 里搜索了 “where is 192.30.253.113”,得知这个 IP 地址来自美国加州的旧金山,是属于 GitHub 的 IP 地址。
鉴于 canvas-prebuilt 将编译好的文件托管在 GitHub 上,我猜它应该是想用这个 IP 访问 GitHub 上的文件,所以我尝试查找了一下 github.com 的 IP 地址:
$ nslookup github.com
Server: 192.168.0.1
Address: 192.168.0.1#53
Non-authoritative answer:
Name: gtihub.com
Address: 192.30.253.112
Name: gtihub.com
Address: 192.30.253.113
我的 DNS 服务器告诉我 github.com 有两个 IP 地址,其中一个就是上面那个 ping 不通的以 113 结尾的 IP,但还有一个 112。
然后我尝试 ping 了一下 github.com:
$ ping github.com
PING github.com (192.30.253.112): 56 data bytes
64 bytes from 192.30.253.112: icmp_seq=0 ttl=45 time=475.662 ms
64 bytes from 192.30.253.112: icmp_seq=1 ttl=45 time=493.921 ms
...
然后我注意到,我在 ping github.com 的时候,返回的 IP 地址是 112 结尾的;在同事的电脑上试了一下之后,发现 ping github.com 返回的 IP 地址是 113 结尾的。
另外,同事的电脑上运行 nslookup github.com
返回的也是这两个 IP 地址,但是顺序不太一样:113 结尾的排在前面。然后我尝试在同事的电脑上 ping 112 结尾的 IP 也是可以 Ping 通的。
所以最后的结论就是:我的电脑将 github.com 解析到了 112 结尾的这个能 ping 通的 IP,但同事的电脑上解析到了 113 结尾的无法 ping 通的 IP。
尝试在 hosts 里将 github.com 指向 112 结尾的 IP 地址之后,再安装 canvas-prebuilt 就没有问题了:
$ sudo echo "192.30.253.112 github.com" >> /etc/hosts
$ npm i canvas-prebuilt
> [email protected] install node_modules/canvas-prebuilt
> node-pre-gyp install
[canvas-prebuilt] Success: "node_modules/canvas-prebuilt/canvas/build/Release/canvas-prebuilt.node" is installed via remote
但这又引出了另一个问题:为什么我和同事的电脑上解析到的域名的 IP 地址顺序不一样?可是后来有别的事情,这个问题也就没有深究下去了。