⚠️ 脱敏声明:本文是折腾过程的记录与复盘。所有服务器地址、域名、密码、密钥、token 一律以占位符代替,请勿在公开笔记里保存真实凭据——这是本文最重要的教训之一。
为什么自建
商业机场的问题:节点质量不可控、流量共享、跑路风险。于是从 2026 年 6 月开始,我用三个多月时间搭了一套自己的网络:
- 两个自建出口节点:一台美国 CN2 线路的 VPS(日常主力),一台日本大阪 IIJ 线路的 VPS(兜底)
- 一个自建订阅服务器:跑在美国 VPS 上,一个 URL 管所有客户端
- 客户端矩阵:家里主路由 + 多台店里旁路由(iStoreOS + OpenClash)、两台 Mac(Clash Verge Rev + TUN)、iPhone(Shadowrocket)、一台带电池和蜂窝网络的便携路由(出门即热点)
最终效果:五台路由器全部验证通过,故障切换自动兜底,换 VPS 的 IP 时所有客户端零改动。
架构一句话
美国 VPS ──┐
├── 订阅服务器(同一台美国VPS) ── 各客户端拉订阅
日本 VPS ──┘
两个关键设计决定:
- 节点寻址一律用域名 + DDNS,不写裸 IP。DuckDNS 免费,VPS 上 cron 每 5 分钟同步一次。后来美国 VPS 机房迁移、日本节点换了三台机器,客户端配置一行都没改过。
- 分组用 fallback(故障切换),美国优先、日本兜底。不用"自动选最快"——日本实测比美国快 3 倍,但我坚持美国优先,理由只有一个:出口 IP 要稳定不飘。登录态、风控都吃频繁换 IP 的亏。
折腾时间线
阶段一:单机起家(6 月上旬)
第一台美国 VPS 上用 3x-ui 管理 VLESS + Reality,监听 TCP 443;后来又装了 Hysteria2,监听 UDP 443。TCP 和 UDP 的 443 是两条独立通道,可以共存——这台机器从此一个端口都不浪费。
很快吃到第一次教训:IP 被墙了。在商家面板里换机房迁移,数据无损、拿到新 IP——这时候才体会到"节点写域名不写 IP"有多值钱:改一条 DDNS 记录,全部设备几分钟内自动跟上。
阶段二:QUIC 与 YouTube 的战争(6 月中旬)
症状很诡异:YouTube 网页视频能放但页面 UI 刷不出来;安卓/iOS 原生 app 直接连不上;手机单独挂代理又一切正常。修好安卓坏 iOS,按下葫芦浮起瓢。
根因是 QUIC(UDP 443,HTTP/3 的底座)与节点传输方式的匹配问题:
| 节点类型 | QUIC 该怎么办 |
|---|---|
| TCP 传输节点(Reality/Trojan 等) | 必须屏蔽 QUIC(drop UDP 443)。QUIC 塞进 TCP 隧道 = UDP-over-TCP,又慢又不稳 |
| UDP 原生节点(Hysteria2/TUIC) | 必须放开 QUIC。这才是它的主场 |
“打地鼠现象"就是你在 TCP 节点上反复调 QUIC 开关——那条路上无解,根治只能换 UDP 原生节点。
另一个结论:iOS 是老大难。透明代理下无论怎么调,iOS YouTube app 都时好时坏(它对静默 DROP 不回退)。正解简单粗暴:iOS 别走透明代理,直接 Shadowrocket 连 Hy2 节点。安卓的 Cronet 回退果断,反而没事。
阶段三:DNS 污染,从 Passwall 迁到 OpenClash(6 月中旬)
iStoreOS 升级 24.10 后 Passwall 连环报错,正好顺势搬家。压死骆驼的最后一根稻草其实是 DNS 污染:Passwall 默认的 chinadns-ng 明文 DNS 模式下,www.google.com 这类重污染域名直接被 GFW 投毒解析成假 IP,怎么调代理都没用。
mihomo 系(OpenClash / Clash Verge)的 fake-ip 机制天生免疫:本地只发假 IP,真实解析发生在节点端。迁移后国内外分流正常,google 秒开。
顺带踩坑:OpenClash 核心"一直在更新”,是核心自动更新在墙内反复下载失败,关掉 auto_update 即安。
阶段四:日本节点的血泪史(7 月初)
想加个日本节点做兜底,结果一台机器贡献了三个经典案例:
- MTU 黑洞。某些"优化线路"本身是隧道,MTU 被压小,1500 字节的大包(恰好是 TLS 握手用的那种)在路上被静默丢弃、反复重传——表现为直连 TLS 握手要 9.6 秒。修复:把 VPS 网卡 MTU 压到 1280 并做成开机服务,握手立刻降到 0.28 秒。诊断口诀:“ping 得通但 TLS 握手巨慢 ≈ 先查 MTU”。
- TCP 中间盒破坏 Reality。这条线路上有个 TCP 加速盒会重切分段,xray 日志狂刷
processed invalid connection——Reality 的字节级认证扛不住。同样的配置换个机房就好。而 shadow-tls v3 因为做的是真 TLS 握手,反而活下来了。 - DDNS 抢域名战争(最阴的一个)。换机后服务"时好时坏"查了半天:旧 VPS 的 crontab 里还留着 DDNS 更新脚本,每 5 分钟把域名抢回去指向它自己!客户端一半时间连到旧机器(上面跑的还是旧协议),一半时间连新机器。教训刻进骨头里:复用 DDNS 域名换节点前,先
crontab -l | grep duck清掉旧机器的定时任务。
8 月终于翻盘:换到一条干净线路的新机器,ping 41ms / 0% 丢包,Hysteria2 直接起飞,下载实测 140Mbps,比美国主力快 3 倍。MTU 都不用压——好线路和烂线路的差距就是这么赤裸裸。
阶段五:自建订阅服务器(6–7 月)
不想手动给每台设备发配置,就在美国 VPS 上用 python3 起了个 HTTPS 小服务,按随机 token 路径提供两份订阅:Clash YAML(给 mihomo 全家)+ base64 分享链接(Shadowrocket 对 YAML 订阅支持差,必须单独喂)。
两个值得记的坑:
- 服务卡死 bug:最初把 TLS 握手直接包在 accept 主循环里同步做,任何一个境内客户端握手卡住就堵死所有人。改成每个连接在自己的线程里做握手 + 30 秒超时,世界清净了。
- 非标准端口会被掐:订阅端口不是 443,从家宽/店宽直连时 TCP 都建不起来。所以别指望各路由自动更新订阅,最可靠的方式是 scp 直接推配置文件再重启服务。根治方案(挪到标准 443)还在待办上。
彩蛋功能:给订阅响应注入 Subscription-Userinfo 头,Clash Verge 卡片上就有流量用量进度条,数据来自商家只读 API,缓存 5 分钟。
阶段六:远程管理与自愈(7 月)
路由器散落在不同的内网,现场维护不现实。用 FRP 打通:一台境内云主机当中转,每台路由跑 frpc 反向连接,SSH 随时可达。铁律:境内实名中转机只做管理隧道,绝不跑代理流量——合规红线。
再加一层保险:每台路由装 watchdog,每 5 分钟经节点探测 generate_204,连续两次不通就自动重启代理服务刷新 DNS 解析,15 分钟冷却防抖。VPS 再换 IP,路由器也能自己爬起来。
沉淀下来的设计原则
- 一切寻址用域名,IP 只是临时状态
- VPS 无状态化:一份重建脚本,新机器 root 下跑一遍 = 2 分钟还原全套服务(含证书续期、开机自启)
- 单一真源:订阅服务器是唯一配置源头,本地只留副本
- fallback 保稳定,不为速度牺牲出口一致性
- TCP 节点屏蔽 QUIC,UDP 节点放开 QUIC,先看协议再动手
- 换机先清旧机器的 cron(DDNS 血泪)
- 远程运维走独立通道,与业务流量物理隔离
安全清单(公开笔记前自查)
这次整理博客顺便做了遍审计:
- 所有密码/密钥/token 是否已从文档移除?(包括"看起来无害"的面板地址)
- 曾在 AI 对话中出现过的凭据,当作已泄露处理,全部轮换
- 管理面板端口用防火墙 DROP 公网访问,仅留 SSH 隧道入口
- SSH 改密钥登录、禁密码(待办清单上的常客,别学我拖了两个月)
- 家宽/店铺拓扑、内部网段不在公开内容里出现
后记
整个过程我是和 AI 结对完成的:让它读交接文档、远程上机器排查、把每次排障结论固化成可复制的 SOP。回头看,最值钱的不是哪条命令,而是"域名寻址、无状态重建、单一真源"这几个原则——它们让后面每一次故障都从"事故"降级成了"练习"。
本文由 ox-alpha(模型 ID:openrouter/stealth/ox-alpha,undisclosed organization 出品)基于作者的项目交接文档协助整理撰写;文中所有敏感信息均已脱敏。