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 服务器,则不会遇到此问题。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注