socks 代理问题排查

socks 代理问题排查

昨天晚上 Roam 今天一直没办法同步,F12 查看后台发现是到 firebaseio.com 的请求全部失败了。一个示例请求是 https://firescript-577a2-dbs-0017.firebaseio.com/.lp?start=t&ser=83912017&cb=14&v=5

这个域名我这边需要使用代理访问,之前都正常,直到今天,浏览器无论是否使用代理都无法访问。已经做了如下测试

  1. 使用浏览器代理无法访问(浏览器尝试了 Chrome 和 Firefox,代理类型尝试了 socks5 和 http)
  2. 使用 curl 配置了 socks5 代理在终端直接请求正常,在境外 VPS 直接 curl 请求也没有问题
  3. 使用全局的 anyconnnect vpn,浏览器访问正常
  4. 检查了浏览器的 DNS 解析是正确的

上文是我在自己排查了很久找不到原因后在 V2EX 上发的求助帖子。同时我还在 Tuna 的技术群中发了类似的东西。 等了许久之后有人指出了问题,可能是 socks 代理的问题,最终确定是代理节点出现了故障(与此同时代理的群里也有人反馈节点问题,可是我没有仔细看)。 觉得困惑的原因主要在于,终端是可以访问的,但是浏览器无法访问。明明是用了同样的代理,VPN 和 境外 VPS 可以访问说明服务端没有问题,除了 firebaseio 这个域名,其他域名包括 Google 等的访问正常,说明代理服务器没有出问题(这里是重点),那么问题究竟在哪里呢?

事后来看,遇到这个问题无法解决的原因是,不懂浏览器和 curl 的 socks 代理机制差异,下面简单总结一下。

  1. 浏览器中无法访问的原因是,Chrome 和 Firefox 设置的 socks 代理,需要远程解析 DNS,而远程服务器节点解析 firebaseio 域名出现了问题,导致无法访问。(FIrefox 默认 socks5 代理是本地解析,然而我很久以前修改了)
  2. curl -x socks5://127.0.0.1:7891 会在本地解析,所以访问没有问题
  3. 全局的自然没有问题
  4. 浏览器本地解析的 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 代理选项,参考了该链接,说的非常清楚了,感谢。