自建节点:为什么最后留在 naive 而不是 Xray

· 2 分钟阅读 #网络#naive#Caddy

先说结论:如果只是自己用、机器不被针对,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 证书有效、自动续期

最后一条容易被忽略:证书过期的那天,代理和网站会同时挂掉。