自建节点:为什么最后留在 naive 而不是 Xray
先说结论:如果只是自己用、机器不被针对,Xray 装起来更快、客户端支持更全。我最后换到 naive,是因为想要「看起来完全不像代理」这件事。
Xray 的问题不是性能
Xray 的 VLESS + REALITY 已经做得很好,握手复用了真实站点的证书,主动探测很难区分。但它仍然是一个自定义的二进制协议——流量形态上不是标准 HTTPS。
对普通使用来说这完全够用。对我来说不够的地方在于:一旦 IP 被重点照顾,非标准协议的流量特征本身就是可疑点。
naive 的取舍
naive 走的是 HTTP/2 CONNECT over TLS,由真实的 Caddy(或 nginx)进程处理。也就是说:
- 服务端就是一个正常的 web server,跑的也是正常配置
- TLS 指纹、ALPN、证书链全部来自真实实现
- 没通过认证的请求,看到的就是一个普通网站
代价是:
- 服务端必须有域名和有效证书(纯 IP 不行)
- 客户端支持面窄,手机端尤其麻烦
- 多一层 HTTP 语义,理论吞吐略低于裸自定义协议
对我这点流量来说,最后一条无所谓。
部署形态
不需要单独装什么「naive 服务端」。用带 forward_proxy 模块的 Caddy:
{
order forward_proxy before file_server
}
example.com {
tls {
protocols tls1.2 tls1.3
}
encode zstd gzip
forward_proxy {
basic_auth <用户名> <密码>
hide_ip
hide_via
probe_resistance <随机串>.com
}
file_server {
root /var/www/html
}
}
forward_proxy 必须排在 file_server 前面,否则普通请求也会被当成代理请求处理。probe_resistance 给一个不存在的域名做密钥,探测者拿到的是「查无此站」,而不是一个需要认证的代理。
伪装页不是摆设
Caddy 在这里同时扮演两个角色:代理入口和普通网站。所以站点本身得有内容——一个空白页配一个有效证书,比什么都可疑。
这也是为什么我把这张单页换成了博客:有文章、有列表页、有 RSS、有 404,看起来才像个真的个人站点。
验证清单
搭完之后至少确认这几项:
| 检查项 | 期望 |
|---|---|
| 无凭据访问首页 | 200,正常页面 |
无凭据访问 /http://xxx/ | 404,不是 407 |
| 错误凭据走代理 | 连接被断开 |
| 正确凭据走代理 | 返回服务器出口 IP |
| TLS 证书 | 有效、自动续期 |
最后一条容易被忽略:证书过期的那天,代理和网站会同时挂掉。