昨天晚上 Roam 今天一直没办法同步,F12 查看后台发现是到 firebaseio.com 的请求全部失败了。一个示例请求是 https://firescript-577a2-dbs-0017.firebaseio.com/.lp?start=t&ser=83912017&cb=14&v=5
这个域名我这边需要使用代理访问,之前都正常,直到今天,浏览器无论是否使用代理都无法访问。已经做了如下测试
- 使用浏览器代理无法访问(浏览器尝试了 Chrome 和 Firefox,代理类型尝试了 socks5 和 http)
- 使用 curl 配置了 socks5 代理在终端直接请求正常,在境外 VPS 直接 curl 请求也没有问题
- 使用全局的 anyconnnect vpn,浏览器访问正常
- 检查了浏览器的 DNS 解析是正确的
上文是我在自己排查了很久找不到原因后在 V2EX 上发的求助帖子。同时我还在 Tuna 的技术群中发了类似的东西。 等了许久之后有人指出了问题,可能是 socks 代理的问题,最终确定是代理节点出现了故障(与此同时代理的群里也有人反馈节点问题,可是我没有仔细看)。 觉得困惑的原因主要在于,终端是可以访问的,但是浏览器无法访问。明明是用了同样的代理,VPN 和 境外 VPS 可以访问说明服务端没有问题,除了 firebaseio 这个域名,其他域名包括 Google 等的访问正常,说明代理服务器没有出问题(这里是重点),那么问题究竟在哪里呢?
事后来看,遇到这个问题无法解决的原因是,不懂浏览器和 curl 的 socks 代理机制差异,下面简单总结一下。
- 浏览器中无法访问的原因是,Chrome 和 Firefox 设置的 socks 代理,需要远程解析 DNS,而远程服务器节点解析 firebaseio 域名出现了问题,导致无法访问。(FIrefox 默认 socks5 代理是本地解析,然而我很久以前修改了)
curl -x socks5://127.0.0.1:7891
会在本地解析,所以访问没有问题- 全局的自然没有问题
- 浏览器本地解析的 DNS 并没有什么意义(应该是我在采用 Direct 模式解析到的 DNS 缓存)
在本地使用 curl -x socks5h://127.0.0.1:7891
请求失败,这种方式类似浏览器,在远程解析 DNS,重现出了浏览器碰到的故障。附上一个记录
$ curl -vvv -x socks5h://127.0.0.1:7891 "https://firescript-577a2-dbs-0017.firebaseio.com/.lp?start=t&ser=83912017&cb=14&v=5"
* Trying 127.0.0.1:7891...
* TCP_NODELAY set
* SOCKS5 communication to firescript-577a2-dbs-0017.firebaseio.com:443
* SOCKS5 connect to firescript-577a2-dbs-0017.firebaseio.com:443 (remotely resolved)
* SOCKS5 request granted.
* Connected to 127.0.0.1 (127.0.0.1) port 7891 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* error:1408F10B:SSL routines:ssl3_get_record:wrong version number
* Closing connection 0
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number
感谢 Tuna 技术群的大佬指点,感谢中国大陆的网络,不断丰富我的网络知识和技能。关于 curl
的 socks 代理选项,参考了该链接,说的非常清楚了,感谢。