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
所以, 我遇到这类事件的应对就是 不用新版本 等一段时间 说不定要么修复兼容了 要么文档同步了
再说了, 不用新版也不影响翻墙, 也挺好的. 🙂