NAT VPS 自建代理的原理
2026-09-20 20:07:14
先讲小白版(前端类比),技术细节在后。
一句话:全局版的 dev proxy
你肯定在 vite.config.ts 里写过这个:
ts
server: {
proxy: { '/api': 'https://后端服务器.com' }
}浏览器以为自己在请求本地 /api,其实是 vite 替你把请求转给了真实后端,再把结果带回来。
翻墙的本质就是这件事:设备上跑一个代理程序(Clash),浏览器把请求交给它,它替你访问目标网站,拿到结果再还给你。唯一的区别是——这个"替你跑腿的人"身在新加坡。
各角色是什么(前端类比)
- VPS = 一台放在新加坡机房、24 小时开机的电脑。它上网没有限制,"翻墙" = 借它的身份上网。
- NAT VPS = 这台电脑是合租的。独立 VPS 像整租(独占门牌号 = 公网 IP),$5/月;NAT VPS 十几人合租(共享一个门牌号),所以 2 元/月。代价:快递没法直接寄到你家,只能寄到小区收发室,房东按编号分发——这就是端口转发(
外部端口 34438 → 你家插座 2081),外人只能敲 34438,看不到 2081。 - Xray = 跑在 VPS 上的核心程序,角色类似 nginx:监听端口、按配置处理连接。
- 3x-ui = xray 的宝塔面板。xray 只认一份
config.json,3x-ui 给你个网页点点点,最后还是改那份 json。"搭建 3x-ui" 翻译过来就是:装了个有图形界面的 nginx。
完整走一遍:访问 Google 时发生了什么
- 浏览器把请求交给本机 Clash(127.0.0.1:7897)
- Clash 查规则表——一串 if-else,类似 nginx 的
location匹配:google.com命中国外 → 走隧道;bilibili.com→ 直连 - Clash 把"我要访问 google"加密打包,伪装成一段访问 apple.com 的 HTTPS 流量,发往 VPS 的 34438 端口
- VPS 上的 Xray 验暗号通过,拆包,以自己的身份请求 Google(新加坡畅通无阻)
- 结果原路加密送回,Clash 拆包交给浏览器
全程墙只看到:你和某个 IP 之间有一堆"和苹果网站的正常 HTTPS 通信"。
REALITY 为什么能抗封锁
背景:正常 HTTPS 流量,墙能看懂"信封"——能看到你要访问 www.apple.com(SNI)和苹果的真证书,只是看不到信里的内容。墙不能封 HTTPS(等于封掉半个互联网),所以代理要活下来,就得长得和普通 HTTPS 一模一样。
REALITY 像一家暗店(speakeasy):
- 门面是货真价实的苹果网站。任何人来访问——包括墙派来的稽查员——看到的都是真 apple.com:真证书、真页面,零破绽
- 客户端和服务器在 TLS 握手时用密钥交换悄悄对暗号(配置里的
pbk、sid就是暗号本),对上了,这条连接才变成代理隧道 - 所以墙来探测节点,结果就是"访问了一个苹果网站",和真站无法区分。这也是为什么配置里不需要任何证书文件
补充两个术语:VLESS 是极简无状态代理协议,只负责"带一个 UUID 的转发指令",本身不加密,加密交给传输层(即 REALITY 这层)。
对比上一代方案 Trojan:思路类似,但门面是"自己搭的假网站"(自签证书),稽查员细看证书就能识破,所以客户端得开"跳过证书验证"。REALITY 直接借真苹果的门面,高明得多(TV 盒子、老路由器等只认 Trojan 的设备仍会用它)。
NAT VPS:端口映射与转发表
一台典型 NAT 小鸡的转发表(本次实战):
| 外部端口 | 内部端口 | 用途 |
|---|---|---|
| 57048 | 22 | SSH |
| 34437 | 2053 | 3x-ui 面板 |
| 34438 | 2081 | 代理入站 |
| 34439 | 2082 | Trojan 入站 |
客户端:订阅与分流
- 订阅 = 一个返回 YAML/节点列表的 URL;实际自用更常见的是本地 YAML 文件(Clash Verge 导入),内含节点、代理组(手动选择/自动测速)、分流规则。
- 分流规则:按顺序匹配——局域网直连 → 国内域名(
DOMAIN-SUFFIX/GEOSITE,CN,数万条国内域名库)→ 国内 IP(GEOIP,CN)→ 其余全部走代理(MATCH)。实现"国内直连、国外翻墙"。 - DNS/fake-ip:fake-ip 模式下本地 DNS 返回假 IP,真实域名交给代理服务器在海外解析,绕开本地 DNS 污染;国内域名用
nameserver-policy指到国内 DNS,保证 CDN 就近。
系统代理 vs TUN 模式(易踩坑)
- 系统代理:macOS 设置里的 HTTP/SOCKS 代理指向 127.0.0.1:7897,自愿制——只有守规矩的应用(浏览器)才把请求交给代理。
- TUN 模式:虚拟网卡接管整机流量,强制制——任何 App 都跑不掉。
- 典型反例:Telegram 的 MTProto 协议直连 IP、不走系统代理,开了系统代理它照样连不上(表现为大量 SYN_SENT 卡在 91.108.x.x / 149.154.x.x)——要么开 TUN,要么在 Telegram 内单独配 SOCKS5 代理。
实战踩坑记录
- NAT 内外端口对齐:客户端永远填外部端口,转发规则的内部端口必须和入站监听端口一致。
- 传递信息以面板为准:密码/UUID 手抄转述错一个字母,认证必失败。
- 劣质 NAT 网关对"未生效的转发规则"会做 SNI 代理(把流量送到 SNI 指向的真网站),远程诊断时极易误判成服务器问题——上机
openssl s_client看本机应答的证书才能分清是服务器侧还是网关侧。 - 配置不生效先想到重启 xray:面板数据库里的配置 ≠ 正在运行的配置。