因为某个据说很难开成功所以才严阵以待的会,近期云梯和自建的 SS 都相继被和谐了。勉强用公司的半残代理度日,非常难受。鉴于对全球最大同性交友网站的熟悉,使用“裸” Github (CSS样式加载不出来)倒也下载到了 V2ray程序文档

给有同样遭遇需要离线看 V2ray 文档的同学提个醒,它的 HTML 都有“如果页面不是 https 协议就跳转”的逻辑,批量删掉这段逻辑后才能在浏览器上本地查看。

由于无法上境外 VPS 卖家的官网,只能忍痛在腾讯云上买了很贵的香港节点的服务器。付好钱之后,弹出提示说要备案了之后才能被公网访问,当场懵逼。但本着死马当活马医的态度,继续尝试,果然 ssh 超时连不上啊,崩溃中。继续尝试用控制台的 Webshell 连,嘿能连上。起了个 SimpleHTTPServer,外网也是访问不到。不死心,开工单询问,好在腾讯云的客服回复很快,几个来回之后,对方直接打电话过来了,原来不只是我有问题,怕是腾讯云的兄弟下午也是忙成狗了吧。同时也了解了下,香港的主机不要求备案,以及知道我在这台机器上开的http服务对方能访问到,此时才意识到公司的网有毒,大部分境外网站都上不去,又连手机4G热点验证了下,果然如此。

长叹一声,看来也只能走国内服务器中转的方案了。恰好手头有一个百度云广州机房的机器,拿来一测能连通腾讯云香港的机器。看到了希望,马上配置两边的 V2ray,使用 Vmess 协议。期间碰到问题卡了一会儿,v2ray能建立连接但没法传数据,client拿到的是空返回。逐步排除,在腾讯云VPS上同时开 client 和 server 也有这问题,怀疑配置不对,仔细看了一遍,原来下载 v2ray-macos 版本自带的 config.json 配置里 outbound.streamSettings 填了些 tls、ws 相关的设置,结合错误日志看应该是校验不通过。把这些配置置空使用默认配置,再次尝试就成功了。顺便说一句,在 Server 上调试的时候,可以使用 curl 的 --socks5[-hostname] 参数来测试 socks 代理的连通性。

下一步就要做本地到百度云机器的代理。毕竟是公网服务,可不能像本地起服务这样直接配 noauth。虽然 V2ray 的 socks 协议支持配置账号,但 Chrome 代理扩展 SwitchyOmega 不支持 socks5 代理的用户名密码校验。考虑了一下,还是使用 shadowsocks 作为代理协议,本地开 Shadowsocks 客户端提供 Socks 代理给浏览器,用法和以前保持一致,手机上也可以继续使用 Shadowsocks 代理 App。在百度云机器上把 V2ray 的 inbound 配置为 Shadowsocks 即可,需要注意的是 Listen 字段要改成 0.0.0.0,否则就不会处理外部流量。

最后要赞一下 V2ray,它的 in/outbound 模式以及协议的灵活选择使得整个代理链路的串接非常方便,堪称天才的设计。

总结:使用 V2ray 灵活串接了 Shadowsocks 和 Vmess 两层代理,利用墙内服务器绕过公司糟糕的网络转发流量到墙外服务器实现翻墙。


上面提到的 streamSettings 默认参数是不加密的,为了安全起见还是要配置一下 tls。证书是用 LetsEncrypt 生成的,看了 DO 的文档,还讲了配定时任务刷新证书,比较详细。配置过程中也碰到了一些问题,1. 证书只需要在服务器端配置,客户端不需要配置,这个我也知道,但是还有个 serverName 客户端也是不需要配置的,没注意到,报错证书验证不对,查了好久;2. 客户端连接时一直报错 unknown authory ,查到个关于 Nginx 的问答里说服务器没有发送完整的证书链,把证书文件从 cert.pem 改成 fullchain.pem 就可以了,试了一把果然如此。

又受到了另一篇文章 的启发,采用 Websocket 模式的 V2ray 利用反向代理躲在服务器后面,使得墙无法嗅探到运行在奇怪的端口的未知协议的程序。文章里给出的是 Nginx 配置的范例,我使用的 Apache,配置类似。配置 Apache 加载代理模块 (proxy, proxy_http, proxy_wstunnel),然后配置代理规则 ProxyPass /xxx wss://127.0.0.1:ppp/xxx (xxx是配置在 wsSettings 里的路径,ppp是服务器端监听的端口) 。因为 TLS 加解密这步已经在 Apache 上做了,所以要修改服务器端 V2ray 配置把 security 改成 none,不需要再处理 TLS。如此就不需要再开端口给公网,inbound 加上 "listen": "127.0.0.1" 即可。为了增加迷惑性,服务器上再放些“正能量”的东西,假装成是个正经网站。客户端也配置下 HTTP 头,增加个 user-agent 假装成是正常浏览器,否则一堆 Go-http-client 就露馅了。