Naive 服务端实际上是支持正向代理的 Caddy 服务器插件。这样可以有效的隐藏 TLS 指纹信息,最大程度防止被 GFW 识别。
近期使用最新版的 Go 程序编译 Naive/Caddy 后,启动 Caddy 时会报错,提示有未被识别的字段,详细信息如下:
loading module 'forward_proxy': decoding module config: http.handlers.forward_proxy: json: unknown field "auth_user_deprecated"
出现这个错误,配置文件中使用了如下内容用于设置 Naive 代理用户名及密码信息:
"auth_user_deprecated": "user" "auth_pass_deprecated": "password"
尝试将两个字段修改为”auth_user”和”auth_pass”仍然报错提示修改后的字段名不存在。
由于之前 Naive 代理套的网站配置比较复杂,就没有使用 Caddyfile 启动 caddy 服务器,而是直接使用的 json 格式配置文件。之前使用的时一切正常,现在报错提示字段无效,说明 caddy 服务器已经不支持这两个字段了。
如果将两个字段删除,做不认证的正向代理,启动服务时又会报如下错误:
provision http.handlers.forward_proxy: probe resistance requires authentication
提示正向代理模块是需要认证的。
这似乎成了一个死结,需要认证又不支持用户名密码字段,这种报错要怎么处理呢。
于是尝试使用一个简单的 Caddyfile 启动 Naive/Caddy 服务器,发现可以正常启动。Caddyfile 的内容如下:
{ order forward_proxy before file_server } :443, na.daehub.com { tls /etc/letsencrypt/live/daehub.com/fullchain.pem /etc/letsencrypt/live/daehub.com/privkey.pem forward_proxy { basic_auth user pass hide_ip hide_via probe_resistance } file_server { root /usr/share/nginx/html } }
现在可以确定认证字段以新的字段名供 caddy 使用了。
使用如下命令将 Caddyfile 转换成其内部使用的 json 格式文件:
# caddy fmt --overwrite Caddyfile # caddy adapt Caddyfile > config.json
命令执行完成后,会将可以使用的 Caddyflie 转换成 config.json文件。格式化后的内容如下:
{ "apps": { "http": { "servers": { "srv0": { "listen": [ ":443" ], "routes": [ { "handle": [ { "auth_credentials": [ "ZFhObGNqcHdZWE56" ], "handler": "forward_proxy", "hide_ip": true, "hide_via": true, "probe_resistance": {} }, { "handler": "file_server", "hide": [ "./Caddyfile" ], "root": "/usr/share/nginx/html" } ] } ], "tls_connection_policies": [ { "certificate_selection": { "any_tag": [ "cert0" ] } } ] } } }, "tls": { "certificates": { "automate": [ "na.daehub.com" ], "load_files": [ { "certificate": "/etc/letsencrypt/live/daehub.com/fullchain.pem", "key": "/etc/letsencrypt/live/daehub.com/privkey.pem", "tags": [ "cert0" ] } ] } } } }
可以看出,Caddy 服务器的正向代理模块认证方式已经取消了明文用户名密码配置,转而使用”auth_credentials”字段,字段内容为用户名及密码的加密字符串。
于是就有了 Naive 服务端认证字段报错处理方案:创建一个 Caddyfile 文件(无论是否可以正常启动服务),修改 “basic_auth”中的 user 和 pass 值,然后将这个 Caddyfile 转换成 json 格式,得到”auth_credentials”字段值,再将此字段添加到之前的 json 配置文件中,将报错字段删除即可。
当然,如果网站配置简单,直接使用 Caddyfile 启动的 Naive/Caddy 服务器,则不会遇到此问题。
博主技术和思路都挺不错!
Caddy 有好多人不喜欢, 就是因为经常变来变去 还没有前向兼容
历史上发生过好多次了
https://zelikk.blogspot.com/2024/06/caddy-v282-caddyfile.html
所以, 我遇到这类事件的应对就是 不用新版本 等一段时间 说不定要么修复兼容了 要么文档同步了
再说了, 不用新版也不影响翻墙, 也挺好的. 🙂