都 2024 年了,该更新翻墙技术了

标签:翻墙

时光荏苒,距初代的翻墙神器 shadowsocks 停更都已过去 6 年了,这期间墙早已进化了多次,至少原生的 shadowsocks 基本上会被秒封了。
随着墙的进化,我翻墙的姿势也不得更换了数次,使用最久的还是 kcptun + shadowsocks 的方案,毕竟对于线路不好的 VPS 而言,可以自定义拥塞控制的 UDP 协议还是比 TCP 快几个数量级的。
不过最近两年 kcptun 也容易被墙了,于是我又开始了新的寻觅,然后选中了 hysteria。它被墙的概率要低很多,而且无需配合 shadowsocks 等协议一起工作,可以直接提供 SOCKS5 和 HTTP 代理。

顺便介绍一下 UDP 方案的加速原理。
默认的 TCP 拥塞控制策略是丢包就降低一半的发包速率,且初始速率和增长速度都很慢,形象来说就是刹车踩得很猛,但油门给得很少。因此只要有轻微的丢包,速度就不可能提得上去。比如在 30ms 延迟的百兆网络中,2% 的丢包率会使吞吐量下降约 90%,而不是 2%。
而以 hysteria 的 Brutal 协议为例,它的原理是设定一个目标速率,直接以这个速率发包。如果发现丢包,就根据实际 ACK 的比例增大发包速率(不超过设定速率的 1.25 倍),以补偿丢包造成的损失。形象来说就是油门踩很深,如果风阻太大达不到预期速度,就踩到底。这里我并不评价这种行为是否公平或道德,大家可以自行判断。只是从我的观察来看,国际线路大部分时候其实并不像大家想象中的拥塞,它不是堵住不动的上下班高峰路段,而是时速 120 公里的高速公路,但是大家都因为路上偶尔遇到一粒砂石,就自觉地降到秒速 5 厘米了(你没看错,大概就这个量级)。
hysteria 还开源了 TCP Brutal 协议,可以用于加速基于 TCP 的翻墙协议。我试了下只在服务端开启,也能使下载速度从约 10KB/s 提升到约 2MB/s。

但是 hysteria 也有缺点,CPU 的占用率有点高,我用 Oracle 的免费云主机,大概 8MB/s 的下载速度就能把 CPU 占满(不过已经足够看 8k 的视频了)。比较有效的方案是关闭 obfs 混淆,能节省一些 CPU 占用。
另外还需要手动设定速率,而不同的环境(家里、公司、5G)可能都不相同,设低了达不到最高速率,设高了浪费 CPU 和流量。
另一个问题是电信运营商对 UDP 有 QoS,丢包的概率会大于 TCP,且长时间大流量使用容易封端口。这个丢包率和前面提到的速率可以通过 iperf 来测试,但是经常过几分钟端口就被封了,所以不建议经常测试。通过开启 HYSTERIA_BRUTAL_DEBUG 环境变量,也能从日志中观测到 ACK 率。Oracle 日本线路的丢包率超过 30% 了,可想而知如果用 TCP 的拥塞控制是基本无法使用的。
为了应对 QoS,hysteria 还提供了端口跳跃的方案,就是用 iptables 把一批端口都 DNAT 到同一个目标端口去。对客户端而言,它可以任意往这些端口中的任意一个发包,而且 UDP 无需建立连接,并没有额外开销;对服务端而言,它只监听一个端口,所有的包都会被视为同一个连接,并不需要额外修改代码。这样就避免了单一端口流量过大而被封的情况。
顺带一提,我在 Oracle 的云主机上折腾这个 iptables 一直不成功,添加不报错,但是不生效。后来手动创建了 /etc/iptables 文件夹后,发现正常了……

而在去年 9 月,hysteria 2 也发布了。两个版本的服务端和客户端并不兼容,这里推荐用新版的,至少我下载速度到 12MB/s 的时候,CPU 占用率也就 60% 多。
至于客户端的话,macOS 上我习惯用命令行,Android 上推荐 Clash Meta for Android(它支持 1 代的端口跳跃和多个代理节点间的负载均衡),而 NekoBox 和 sing-box 我是没成功用上……我稍微看了下源码,Clash.Meta 对 hysteria 2 的支持是基于 sing-quic,后者因为 sing-box 服务端不支持端口跳跃,所以不愿意在客户端进行支持。前者可能出于省事的原因,就也懒得支持了。目前我已经提了 PR 用 hysteria 的官方实现来替换 sing-quic 以支持 2 代的端口跳跃了,看看什么时候能合并。
顺带一提,Clash.Meta 的文档真的烂,很多配置看源码才知道。比如 obfsobfs-password 这两个配置有什么区别?如果只配置其中一个的话,它们都表示 obfs 密码;如果两个都配置的话,obfs 必须是 salamanderobfs-password 表示 obfs 密码。

当然,以上都是基于有墙外 VPS 而言的翻墙方案,如果不想花钱的话,还有 Cloudflare 提供的方案。
最简单的是用 WARP 客户端。它的原理是用 WireGuard 协议建立一条通道连接 Cloudflare 的服务器,然后像 VPN 一样翻墙。缺点是无法开箱即用,因为默认的连接地址被墙了。搜索「warp 优选ip」可以找到不少脚本,原理是从可用的 IP(注意这里面其实只有 4 个 C 段可用) 中随机找一批来测试连接速度和下载速度。我自己用 Go 写了测速脚本,找了一批还不错的 IP。然后执行 warp-cli set-custom-endpoint ip:2408 来更换连接地址就可以连上 WARP 了。如果不想全局开 VPN 的话,还可以用 warp-cli set-mode proxywarp-cli set-proxy-port 1080 来启用 SOCKS5 代理。
WARP 的速度还行,但是延迟比较高,最近的服务器也远在新加坡。同时它还会修改 DNS 服务器为 1.1.1.1,并且注意一下 Chrome 的「使用安全 DNS」这个配置,我的被改成了 1.1.1.1,导致未翻墙的网站都域名无法解析了,查了几天才找到这个原因。

而要在手机上使用的话,新版 WARP 的客户端已经无法修改服务器 IP 了,旧版则已经无法使用了。不过网上可以搜索「WARP+ telegram」,可以免费获得几十 PB 流量的 WARP+ 账号。再用这个账号生成 WireGuard 配置,就可以用 WireGuard 客户端来连接了。
如果想转成 SOCKS5/HTTP 协议的话,推荐在 Docker 中运行 wireproxy,这样不会污染本机的网络配置。
顺带一提,WireGuard 虽然是基于 UDP,但并没有什么特别的拥塞控制算法,所以速度主要取决于线路的好坏。

如果 WARP 仍然嫌慢的话,还可以用 Cloudflare 的 Worker 来翻墙。搜索「cloudflare worker vless」可以找到不少脚本和文章,它也需要使用优选 IP,但是可用的 IP 范围比 WARP 多很多(几个 B 段可用),其中有不少速度更快的。
macOS 上我仍然习惯用 V2Ray 命令行,Android 上可以用 v2rayNG
它的缺点是某些网站会提示证书不对,但是对于下载速度能到 10MB/s 的白嫖方案来说,这个小问题也算不上什么。而且它是 TCP 的方案,被 QoS 的概率较低。但是因为目标过大,可能会像 Google 一样被官方打击,所以切用且珍惜吧。

2条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?