基于 Trojan-Go + Cloudflare 搭建科学上网代理
绝对稳定的科学上网方式: Trojan + WS + CDN

本文将介绍如何使用 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_addrlocal_port 是向外提供服务 (即翻墙) 的地址. 由于我们将使用 Cloudflare 的 CDN 服务, 所以如果你想修改 local_port 你只能从 443, 2053, 2083, 2087, 2096, 8443 这些端口中选择. 这是由于 Cloudflare 对端口的限制. remote_addrremote_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

注意对应地修改 WorkingDirectoryExecStart 项. 由于 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 statusProxied (标识为一朵橙色的云).

配置客户端

以 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

其他客户端也同理. 有些客户端可能不需要填 sniHost 字段, 这样的话这些字段默认与 server 一样.


Last modified on 2023-07-19

Comments Disabled.