本文将介绍如何使用 Cloudflare 的 CDN 服务来代理 Trojan-Go, 从而得到一个"永不失效" (在 Cloudflare 不被封锁的情况下) 的梯子.
前置条件
首先你需要
- 一个 Debian/Ubuntu 服务器, 并且可以使用 SSH 连接上
- 一个域名
- 一个 Cloudflare 账号
这个服务器即使被墙也没关系, 我们会使用 Cloudflare 的 CDN 服务作为中转, 只要 Cloudflare 的服务不被封锁, 我们的梯子就不会失效. 但要注意, 在部署时你仍需要使用 SSH 连接上服务器, 所以如果你的服务器已经不幸被 GFW 完全封锁, 你需要使用一个代理连接上你的服务器; 或者关闭你的服务器, 等待 GFW 取消对你的服务器的封锁 (通常需要 1 周到 1 月).
服务器的系统也可以不是 Debian/Ubuntu, 只需要在安装各种软件时按照官方文档进行对应的安装即可.
搭建一个 HTTP 网站
我们使用 Caddy 搭建一个 HTTP 网站作为 Trojan-Go 的伪装站, 当外部访问我们的服务但使用的不是 Trojan-Go 协议或密码错误时, Trojan-Go 会自动代理到这个 HTTP 网站. 这时在外部看来, Trojan-Go 服务就是一个普通的 HTTPS 网站.
首先安装 Caddy (参考 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
然后编辑 Caddyfile:
sudo vi /etc/caddy/Caddyfile
Caddyfile 示例:
:80 {
respond "Hello world"
}
使用 systemctl
启动 caddy 服务:
sudo systemctl start caddy
使用 curl 检查 HTTP 服务器是否正常工作:
curl localhost
返回 Hello world
说明服务器正常工作.
你也可以搭建一个更逼真的伪装站, 例如搭建一个网盘服务或者一个流媒体服务等, 也可以使用别人的 HTTP 网站
下载 Trojan-Go
到 Trojan-Go 的 Github Release 页面找到对应的架构 (多数服务器为 linux-amd64
架构), 右键复制地址, 然后使用 wget 下载:
wget https://github.com/p4gefau1t/trojan-go/releases/download/v0.10.6/trojan-go-linux-amd64.zip
解压压缩包并删除压缩包:
unzip trojan-go-linux-amd64.zip -d trojan-go
rm trojan-go-linux-amd64.zip
签发 TLS 证书
首先将你的域名添加到 Cloudflare 上, 具体操作可以参考官方文档. 如果你没有域名, 可以选择直接在 Cloudflare 上注册一个.
然后在 Cloudflare 上, 进入 Websites -> [你的域名] -> SSL/TLS -> Origin Server
, 选择 Create Certificate
, 创建一个证书, 创建的选项可以选择 Private key type: ECC
, Hostnames: [填入你想用于代理的子域名]
, Certificate Validity: 15 years
. 本篇教程中假设你的域名是 example.com
, 你选择的代理子域名是 tunnel.example.com
.
签发成功后, 将证书和私钥分别复制到 Trojan-Go 的文件夹下:
cd trojan-go
vi server.pem # 填入 pem 格式的证书
vi server.key # 填入 private key
注意当你离开签发成功的界面后, Cloudflare 不会保存你的私钥, 所以如果你丢失了私钥, 你必须重新创建证书.
配置 Trojan-Go
在 Trojan-Go 文件夹下创建并编辑配置文件:
cp example/server.json .
vi server.json
配置文件示例如下:
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "localhost",
"remote_port": 80,
"password": [
"your_password"
],
"ssl": {
"cert": "server.pem",
"key": "server.key",
"sni": "tunnel.example.com"
},
"websocket": {
"enabled": true,
"path": "/ws",
"host": "tunnel.example.com"
}
}
其中 local_addr
和 local_port
是向外提供服务 (即翻墙) 的地址. 由于我们将使用 Cloudflare 的 CDN 服务, 所以如果你想修改 local_port
你只能从 443, 2053, 2083, 2087, 2096, 8443
这些端口中选择. 这是由于 Cloudflare 对端口的限制. remote_addr
和 remote_port
是伪装站的地址, 这里填入我们之前搭建的简易网站 localhost:80
.
注意你需要将 password
项填入一个强密码, 你可以使用 openssl 命令生成:
openssl rand -hex 16
紧接着 ssl
项用来指定我们的证书, 注意你需要将 sni
项修改为你创建证书时填入的子域名. websocket
项指定了开启 websocket 功能, 这是我们能使用 Cloudflare 代理的核心. 注意修改 host
为你的子域名 (和 sni
项一致). 此外 Trojan-Go 的官方文档指出 path
字段应使用较长的字符串, 可以使用生成随机字符串拼接到 /ws
后来实现这一点.
运行 Trojan-Go
我们使用 systemd 来管理 Trojan-Go 的运行, 首先创建一个 systemd unit 文件:
sudo vi /etc/systemd/system/trojan-go.service
参考以下内容填入:
[Unit]
Description=Trojan-Go - An unidentifiable mechanism that helps you bypass GFW
Documentation=https://p4gefau1t.github.io/trojan-go/
After=network.target nss-lookup.target
[Service]
User=nobody
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
WorkingDirectory=/home/helium7/trojan-go
ExecStart=/home/helium7/trojan-go/trojan-go -config server.json
Restart=on-failure
RestartSec=10s
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
注意对应地修改 WorkingDirectory
和 ExecStart
项. 由于 systemd 的限制, ExecStart 项中的命令必须是绝对路径.
如果你在
server.json
中填入的证书路径是绝对路径, 那么你可以省略WorkingDirectory
项.
然后启动 Trojan-Go 服务, 并设置开机自启:
sudo systemctl start trojan-go
sudo systemctl enable trojan-go
# 查看服务状态
sudo systemctl status trojan-go
如果服务运行失败, 可以使用 journalctl
查看错误日志:
sudo journalctl -fu trojan-go
配置 Cloudflare 的 DNS
在 Cloudflare 上, 进入 Websites -> [你的域名] -> DNS
, 添加一条 DNS 记录, 类型为 A
, 名称为你的子域名, IPv4 地址为你的服务器的公网 IP 地址. 确保 DNS 记录的 Proxy status
为 Proxied
(标识为一朵橙色的云).
配置客户端
以 Clash 为例, 在 proxies
中填写以下配置:
- name: proxy-name
type: trojan
server: tunnel.example.com
port: 443
password: your_password
sni: tunnel.example.com
network: ws
ws-opts:
path: "/ws"
headers:
Host: your-domain-name.com
其他客户端也同理. 有些客户端可能不需要填 sni
或 Host
字段, 这样的话这些字段默认与 server
一样.
Last modified on 2023-07-19
Comments Disabled.