Caddy 的安装 Link to heading

首先安装标准的 caddy,执行以下命令:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

这里的 Caddy 需要 caddy-trojan 和 klzgard 修改的 forwardproxy 两个插件。

首先需要安装最新的 go,Debian 通过 sudo apt install golang 安装的不够新,编译的时候会出现 crypto/ecdh: package crypto/ecdh is not in GOROOT 的问题。

因此,我们需要去 go 官网 下载,移动至 ~ 目录下并解压,之后修改 ~/.config/fish/config.fish,添加以下两行:

set -gx GOPATH $HOME/go
set -gx PATH $GOPATH/bin $PATH

从而添加 go 的环境变量。

然后根据 klzgard 给出的 教程,依次执行以下命令:

git clone https://github.com/klzgrad/forwardproxy.git
cd forwardproxy
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest # 编译安装 xcaddy
xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=$PWD --with github.com/imgk/caddy-trojan

之后,在 forwardproxy 目录下就能看到名为 caddy 的可执行文件,替换掉 /usr/bin/caddy

sudo chmod +x /usr/bin/caddy
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/caddy # 使得 caddy 能监听低位端口如 443

Caddy 配置 Link to heading

这里我使用的是免费的 eu.org 的域名,托管于 cloudfare,请添加解析,将 naive.example.eu.orgtro.example.eu.org 添加 A 解析,指向你部署 trojan 与 naiveproxy 的服务器的 ipv4 地址,最好是一个服务器一组子域名,naive-v6.example.eu.org 域名添加 AAAA 解析,指向服务器的 ipv6 地址,否则 caddy 无法为这些域名自动申请 ssl 证书。

修改 ~/caddy/Caddyfile 为以下内容:

{
    order trojan before file_server
    servers :4443 {
        listener_wrappers {
            trojan
        }
    }
    log {
        output file /var/log/caddy/default.log {
            roll_size 10MiB
        }
    }
    trojan {
        caddy
        no_proxy
        users yiwei tro_passwd123
    }
}
tro.gr-jp.eg.com {
    reverse_proxy https://tro-gr-jp.eg.com:4443
}
fava.gr-jp.eg.com {
    reverse_proxy 127.0.0.1:5000
}
:443, naive-gr-jp.eg.com {
    tls [email protected]
    route {
        forward_proxy {
            basic_auth yiwei passwd123
            hide_ip
            hide_via
            probe_resistance
        }
        file_server {
            root /usr/share/caddy
        }
    }
}
:4443, tro-gr-jp.eg.com {
tls [email protected]
    route {
        trojan {
            connect_method
            websocket
        }
    }
    file_server {
        root /usr/share/caddy
    }

}

注意上面的 reverse_proxy 中,如果是要访问 qBittorrent 的 webui,那么应该使用 http 而不是 https。(暂定)

请自行修改 trojanuser 部分对应的用户名和密码,以及 naivebaic_auth 部分对应的用户名和密码。

caddy 申请的证书位于 /var/lib/caddy/.local/share/caddy 目录,可以通过 sudo journalctl -fu caddy 实时查看 systemd 管理的 caddy 的日志。

然后执行以下命令,即可运行 caddy。

sudo systemctl restart caddy

安装与配置 vless + reality Link to heading

执行以下命令以安装最新的 xray:

sudo su # 切换到 root
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install --beta

由于我们这里选择使用特斯拉的域名进行伪装,因此不需要申请 ssl 证书,将 /usr/local/etc/xray/config.json 修改为以下内容:

{
    "log": {
        "loglevel": "warning"
    },
    "routing": {
        "domainStrategy": "IPIfNonMatch",
        "rules": [
            {
                "type": "field",
                "ip": [
                    "geoip:cn",
                    "geoip:private"
                ],
                "outboundTag": "block"
            }
        ]
    },
    "inbounds": [
        {
            "listen": "0.0.0.0",
            "port": 8443,
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "xxx",
                        "flow": "xtls-rprx-vision"
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "tcp",
                "security": "reality",
                "realitySettings": {
                    "dest": "www.tesla.com:443",
                    "serverNames": [
                        "tesla.com"
                    ],
                    "privateKey": "xxx",
                    "shortIds": [
                        "6ba85179e30d4fc2"
                    ]
                }
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls",
                    "quic"
                ]
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "tag": "direct"
        },
        {
            "protocol": "blackhole",
            "tag": "block"
        }
    ]
}

config.json 需要自行修改的部分与 基于 Xray 搭建 reality 中所说的内容一致,主要就是 idshotdIdsprivateKey 这几项。

Shadowrocket 的使用 Link to heading

添加 trojan 节点 Link to heading

如图下所示:

MI8PGTcp9dxg2az

地址端口密码 以及 SNI 都需要设置成自己在 Caddyfile 中设置的。

添加 naive 节点 Link to heading

naive 的设置是类似的:

kOd7qly6UM45jIs

生成 shadowrocket 订阅 Link to heading

这里我实际上是手动添加了节点之后,例如批量选中 trojan 节点进行复制,在 vscode 上观察发现,trojan 的链接格式比较简单,而 vless 和 naiveproxy 则比较复杂,分别将这些链接进行 base64 编码,将编码后的内容存入 gist 的文件中,例如 tro-base64.yaml,shadowrocket 添加订阅就能识别 tro-base64.yaml 的 raw link,一言以蔽之,shadowrocket 添加订阅必须是 base64 编码之后的 trojan 或者 vless 或者 naiveproxy 链接格式。

更新 Link to heading

目前 klzgard 的魔改版 forward-proxy 存在比较严重的内存泄漏问题,因此 Caddyfile 暂时不配置 naiveproxy 的相关内容,同时只执行 xcaddy build --with github.com/imgk/caddy-trojan,即只编译包含 caddy-trojan 插件的 caddy 可执行文件。