序幕

小时候开始折腾电脑往往会因为访问不了国外网站处处受阻,然后再长大一点能零零散散找到一些临时能用的梯子,可能中间我们又结识了代理知道了墙的存在,再后来可能找到了稳定的梯子,可能甚至知道了几种加密协议,然后就会开始面对梯子总归是会要跑路的情况。那么,既然我们已经长大了,就该自己动手丰衣足食搭建自己的梯子了,我们会重新认识前面遇到过的东西。

材料

一台非大陆服务器,这篇博客

买一台服务器

我们可以直接从阿里云、腾讯云、百度云、华为云、七牛云,或者香港的htstack(这是我找到的相对便宜的了)直接买一台普通的海外服务器。
直接买轻量应用服务器就好了。和ECS有什么区别?我也不知道。
基本价格在¥30-¥300,000/月 不等,看你的喜好。1C1G即可,多多益善。

选择操作系统镜像

选Ubuntu,能选Ubuntu24.04最好。

安装docker

腾讯云有直装好的docker/ubuntu镜像,阿里云的docker镜像是ali自研的CentOS不推荐
Ubuntu装docker详见 http://readfrog.ltd/index.php/archives/23/
注意不需要配置国内源,因为服务器就在海外,回国慢

如果想一步到位,不想看碎碎念,请直接看 VLESS+RAW+Reality

snake:如果不想麻烦,可以直接使用squid

安装详见 http://readfrog.ltd/index.php/archives/22/ (还没写,先百度一下,或者问问deepseek老师)
squid是透明的http代理,如果你想访问civitai huggingface google youtube... ,那你就会喜提"该链接已被重置"。不出意料的,或者也许第一次遇到会很惊奇,种花家颇负盛名的长城防火墙(GFW,Great Wall FireWall)发力了。
不过意外的,X(推特)似乎可以。

废案:WireGuard

虽然叫WireGuard,但很遗憾,Guard不了一点,在GWF面前还是太小儿科了。虽然有基本的加密,但是特征还是很明显:

  • 握手发起包永远是 148 字节
  • 响应包永远是 92 字节
  • 第一个字节固定是 0x010x02
  • 没有任何伪装,裸奔的 UDP

GFW 的 DPI(深度包检测)扫到这种固定特征,自动就把它标记/干扰了。

典型的症状

典型的症状就是,能成功链接,但访问网站就是加载不出来,数据流量只有几b-几kb。
如果我们想检查是否是主机转发问题,并执行了这两个命令的话:
docker exec -it wg-easy tcpdump -i wg0 -n 和另开一个 sudo tcpdump -i eth0 -n udp port 51820
如果我们没配置出错,大概率会看到两个命令的结果都是:

19:01:14.060841 IP 36.28.198.45.34469 > 172.17.25.152.51820: UDP, length 148
19:01:14.061053 IP 172.17.25.152.51820 > 36.28.198.45.34469: UDP, length 92
19:01:19.053162 IP 36.28.198.45.34469 > 172.17.25.152.51820: UDP, length 148
19:01:19.053397 IP 172.17.25.152.51820 > 36.28.198.45.34469: UDP, length 92

解析

这就是 GFW 对 WireGuard 的一种典型打法

36.28.198.45.34469 > ...51820: UDP, length 148   ← 客户端发来的:148 字节
...51820 > 36.28.198.45.34469: UDP, length 92    ← 服务器回复的:92 字节
  1. 每隔 ~5 秒重复一次,永远是 148 进 / 92 出
  2. 只有这两种固定长度的包,没有别的大小

这是 WireGuard 握手包的典型特征:

  • 148 字节 = WireGuard 握手发起包(Handshake Initiation)
  • 92 字节 = WireGuard 握手响应包(Handshake Response)

也就是说:客户端一直在重发握手请求,服务器每次都正常回应握手响应,但握手就是"完不成"——客户端发起→服务器响应→然后就没有下文了,每 5 秒(WireGuard 的重试间隔)又重来一遍。

而且你 eth0 上完全看不到任何数据包(transfer 数据包,长度会是各种大小),只有这两种固定的握手包。

这是 :

  • 允许握手发起包(148)过去
  • 允许握手响应包(92)回来
  • 但破坏握手的"最终确认"环节,或者丢弃握手完成后的第一个数据包,导致握手永远无法真正建立

结论:GFW 正在干扰你的 WireGuard 握手

平时不以为然的信息对抗,在这种地方就能体现出来。如果你要问,为什么以前按月付费的梯子就没事?因为一般的商业梯子都起码会采用VLESS等的混淆措施,比如下面要讲的:

VLESS+RAW+Reality

安装3x-ui

创建数据目录

mkdir -p /opt/3x-ui/db
mkdir -p /opt/3x-ui/cert

启动3x-ui

docker run -d \
  --name 3x-ui \
  --restart unless-stopped \
  -p 2053:2053 \
  -p 443:443 \
  -v /opt/3x-ui/db:/etc/x-ui/ \
  -v /opt/3x-ui/cert:/root/cert/ \
  ghcr.io/mhsanaei/3x-ui:latest

检查启动情况

docker ps | grep 3x-ui
docker logs --tail 50 3x-ui

放行端口

sudo ufw allow 2053/tcp
sudo ufw allow 443/tcp

云厂商的云防火墙也要注意放行2053和443
注意:443端口不能被占用!如果有nginx也只能放弃!

此时我们打开浏览器输入服务器IP:2053就能看到登录页面

配置3x-ui账号密码

docker exec -it 3x-ui sh

x-ui

我们能看到一个主菜单

The OS release is: alpine

╔────────────────────────────────────────────────╗
│  3X-UI Panel Management Script                │
│  0. Exit Script                               │
│────────────────────────────────────────────────│
│  1. Install                                   │
│  2. Update                                    │
│  3. Update to Dev Channel (latest commit)     │
│  4. Update Menu                               │
│  5. Legacy Version                            │
│  6. Uninstall                                 │
│────────────────────────────────────────────────│
│  7. Reset Username & Password                 │
│  8. Reset Web Base Path                       │
│  9. Reset Settings                            │
│  10. Change Port                              │
│  11. View Current Settings                    │
│────────────────────────────────────────────────│
│  12. Start                                    │
│  13. Stop                                     │
│  14. Restart                                  │
|  15. Restart Xray                             │
│  16. Check Status                             │
│  17. Logs Management                          │
│────────────────────────────────────────────────│
│  18. Enable Autostart                         │
│  19. Disable Autostart                        │
│────────────────────────────────────────────────│
│  20. SSL Certificate Management               │
│  21. Cloudflare SSL Certificate               │
│  22. IP Limit Management                      │
│  23. Firewall Management                      │
│  24. SSH Port Forwarding Management           │
│  25. PostgreSQL Management                    │
│────────────────────────────────────────────────│
│  26. Enable BBR                               │
│  27. Update Geo Files                         │
│  28. Speedtest by Ookla                       │
╚────────────────────────────────────────────────╝

Panel state: Running
Start automatically: Managed by Docker
xray state: Running

Please enter your selection [0-28]: 

输入7,然后输入你想要的账号密码。二次验证是否开启凭喜好,建议不要开启。
等xui重启后,打开登陆页面输入账号密码登陆

配置3x-ui

3x-ui主要有两个配置:入站,用户
有能力的可以看官方文档 https://docs.sanaei.dev/docs/config/reality/
但实际文档写错了,还是不要看了。

入站配置
我写累了,直接抄作业吧,原理下次再补。注意一点:选择的Dest/SNI必须是服务器和客户端都能访问的,这是个大坑,因为咱家能访问的只有Cloudflare,选其他的都不行!
image.png
image.png
image.png
image.png
没展示的就保持默认

客户端配置
添加客户端
image.png

注意入站要选择前面配置好的入站!

下载V2Ray

直接从github下载:https://github.com/2dust/v2rayN/releases/tag/7.23.4
梯子的文档都是中文,不得不说中国在梯子研究这方面真是遥遥领先啊
讲一个关于梯子的笑话吧: 外国人说,中国人是我见过最注重网络安全的群体。因为他妈从不用自己的真实ip访问github
不过有一说一,配置好dns,Github偶尔还是可以访问的

配置V2Ray

image.png
选中我们配置好的入站规则,点击通用操作-导出链接,然后复制链接
image.png
运行V2Ray-点击配置项-点第一个从剪贴板导入分享链接
然后恭喜你就可以正常使用了,后面的操作网上都有。如果用过别的,应该也轻车熟路了。

值得一提的是,这个分享链接其实只是简单的配置装配出的字符串,所有必要信息都明文编码在里面

运行展示

image.png
image.png
这个速度还是很不错的

结语

在连续折腾3个小时之后,我觉得能写到这样已经很不错了,我今天累了,就不叨叨了。