Trojan-Go Fork
注意:本项目已通过 AI 辅助修复和修改,当前服务端功能正常,客户端可能存在部分问题。欢迎提交 PR 协助修复。
Trojan-Go Fork 是基于 p4gefau1t/trojan-go 的社区维护分支。由于原项目已停止维护,本 Fork 持续修复 bug、合并社区贡献并改进功能。
目录
- 简易模式(命令行参数) - 配置文件模式 - URL 模式(客户端) - 可移植性 - 简易配置 - WebSocket - HTTP/2 TLS 隧道 - HTTP/3 QUIC 隧道 - 多路复用 - 路由模块 - AEAD 加密 - 传输层插件 - Cloudflare HTTP/3 配置 - CDN 中转配置 - IPv6 专用配置与原版的差异
本 Fork 在原版基础上进行了以下改进和修复:
- [x] 修复多处 data race 风险
- [x] 修复服务端添加用户后 WebSocket 访问无效的问题
- [x] 服务端支持使用 SQLite 实现用户数据持久化(仅 Linux)
- [x] 支持指定转发 buffer 大小及数量限制,更好地控制内存占用
- [x] 修复服务端上行限速无效的问题
- [x] 修复连接转发阻塞导致 goroutine 泄露的问题
- [x] 修复客户端 TCP 和 WebSocket 无法连接的问题
- [x] 新增 TCP Fast Open 支持
- [x] 加固 sniff/rewind 缓冲,增加绝对上限,防止探测阶段缓冲区无界增长
- [x] 修复路由模块正则规则运行时并发写缓存导致的 fatal error(改为启动期预编译)
- [x] 补全 SQLite / MySQL 统计后端的连接与句柄关闭,MySQL 使用带上下文的查询并设置连接池上限
- [x] TLS 服务端关闭时排空待处理连接,QUIC 层改用 quic-go 具体类型消除
any断言 - [x] 新增顶层优雅关闭:
Proxy.Run监听 SIGINT/SIGTERM,收到信号后取消上下文并释放资源。关闭的每个环节(等中继 goroutine 退出、等隧道关闭)各受 5 秒超时兜底,超时或收到二次信号都立即跳过等待继续释放,底层卡死也不会让进程退不出去;关闭错误会经RunAndClose冒泡到退出码,同一transport.Server被多个端点共用时Close幂等只跑一次
如发现其他 bug 或新需求,欢迎提交 Issue。
Docker 部署
预构建的 Docker 镜像可从以下仓库获取:
- Docker Hub:trliwork/trojan-go-fork
- GitHub Container Registry:ghcr.io/potterli20/trojan-go-fork
# Docker Hub
docker pull trliwork/trojan-go-fork:latest
GitHub Container Registry
docker pull ghcr.io/potterli20/trojan-go-fork:latest
Podman
podman pull trliwork/trojan-go-fork:latest
运行容器:
docker run \
--name trojan-go-fork \
-d \
-v /etc/trojan-go-fork/:/etc/trojan-go-fork \
--network host \
ghcr.io/potterli20/trojan-go-fork:latest
或指定自定义配置文件路径:
docker run \
--name trojan-go-fork \
-d \
-v /path/to/host/config:/path/in/container \
--network host \
ghcr.io/potterli20/trojan-go-fork:latest \
/path/in/container/config.json
快速开始
预编译二进制文件可在 Release 页面 下载,解压后直接运行,无其他依赖。
1. 简易模式(命令行参数)
服务端:
sudo ./trojan-go-fork -server -remote 127.0.0.1:80 -local 0.0.0.0:443 \
-key ./your_key.key -cert ./your_cert.crt -password your_password
客户端:
./trojan-go-fork -client -remote example.com:443 -local 127.0.0.1:1080 -password your_password
2. 配置文件模式
./trojan-go-fork -config config.json
3. URL 模式(客户端)
./trojan-go-fork -url 'trojan-go://[email protected]/?type=ws&path=%2Fpath&host=your-site.com'
特性介绍
Trojan-Go Fork 兼容原版 Trojan 协议及配置文件格式。使用以下扩展特性时,请确保通信双方均使用 Trojan-Go Fork。
可移植性
编译得到的单个可执行文件,不依赖其他组件。支持交叉编译,可方便地部署到服务器、PC、树莓派甚至路由器上。
例如,交叉编译一个适用于 mips 处理器、Linux 系统、仅包含客户端功能的版本:
CGO_ENABLED=0 GOOS=linux GOARCH=mips go build -tags "client" -trimpath -ldflags "-s -w -buildid="
简易配置
配置文件兼容原版 Trojan 格式,未指定的字段将使用默认值。
服务端配置 server.json:
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "127.0.0.1",
"remote_port": 80,
"password": ["your_awesome_password"],
"ssl": {
"cert": "your_cert.crt",
"key": "your_key.key",
"sni": "www.your-awesome-domain-name.com"
}
}
客户端配置 client.json:
{
"run_type": "client",
"local_addr": "127.0.0.1",
"local_port": 1080,
"remote_addr": "www.your-awesome-domain-name.com",
"remote_port": 443,
"password": ["your_awesome_password"]
}
同样支持 YAML 格式。以下为等价的客户端配置 client.yaml:
run-type: client
local-addr: 127.0.0.1
local-port: 1080
remote-addr: www.your-awesome-domain-name.com
remote-port: 443
password:
- your_awesome_password
完整配置选项和示例请参考example/目录下的client.json、server.json、client.yaml、server.yaml。
WebSocket
Trojan-Go Fork 支持 TLS + WebSocket 承载 Trojan 协议,可利用 CDN 进行流量中转。
在服务端和客户端配置中同时添加 websocket 选项即可启用:
"websocket": {
"enabled": true,
"path": "/your-websocket-path",
"hostname": "www.your-awesome-domain-name.com"
}
hostname 可以省略,但服务端和客户端的 path 必须一致。开启 WebSocket 后,服务端可同时兼容 WebSocket 和标准 Trojan 流量。
注意:标准 Trojan 不支持 WebSocket。如需使用 WebSocket 承载流量,请确保通信双方均使用 Trojan-Go Fork。
HTTP/2 TLS 隧道
Trojan-Go Fork 支持基于 HTTP/2 协议的 TLS 隧道,提供更好的多路复用性能和兼容性。
启用 HTTP/2 隧道:
"http2": {
"enabled": true,
"host": "www.your-awesome-domain-name.com",
"path": "/h2-tunnel"
}
HTTP/2 隧道特点:
- 原生多路复用:单个连接可并发多个请求,避免队头阻塞
- 头部压缩:HPACK 算法减少传输开销
- 服务器推送:支持服务端主动推送资源(需配合应用层实现)
- 二进制分帧:更高效的数据传输格式
启用 HTTP/2 隧道后,建议使用支持 ALPN 的负载均衡器或 CDN(如 Cloudflare、AWS ALB)。
HTTP/3 QUIC 隧道
Trojan-Go Fork 支持基于 QUIC 协议的 HTTP/3 隧道,提供卓越的弱网性能和连接速度。
启用 QUIC 隧道:
"quic": {
"enabled": true,
"max_idle_timeout": 30,
"max_incoming_streams": 100,
"initial_stream_window": 65535,
"initial_conn_window": 65535,
"alpn": "hq-29",
"congestion": "bbr"
}
QUIC 隧道优势:
- 零 RTT 连接恢复:已建立连接的客户端可立即发送数据
- 改进的拥塞控制:支持 BBR、CUBIC 等算法
- 弱网优化:在高延迟、高丢包环境下表现优异
- 内置加密:TLS 1.3 深度集成,所有流量默认加密
"quic": {
"enabled": true,
"brutal_up": 10, // 上行限速 (Mbps)
"brutal_down": 50, // 下行限速 (Mbps)
"insecure": false // 是否跳过证书验证
}
注意:QUIC 基于 UDP 协议,某些网络环境可能限制 UDP 流量。Brutal 加速仅在 cubic 拥塞控制下有效,BBR 自带速率控制。
详细配置指南请参考 QUIC 使用文档。
多路复用
Trojan-Go Fork 支持基于 smux 的多路复用,通过单条 TLS 连接承载多条 TCP 连接,减少 TLS 握手延迟,提升高并发场景下的性能。
启用多路复用不会提高单链路的测速,但能显著降低大量并发请求时的延迟,例如浏览包含大量图片的网页。
客户端启用多路复用:
"mux": {
"enabled": true
}
只需在客户端启用即可,服务端会自动检测并适配。
路由模块
内置路由模块,支持自定义分流策略。客户端与服务端均可使用。支持三种策略:
| 策略 | 说明 |
|------|------|
| proxy | 代理:通过隧道交给下一层处理(客户端为远程服务端;服务端为出站栈) |
| bypass | 绕过:本地直接连接目标 |
| block | 封锁:直接关闭连接 |
客户端配置示例:
"router": {
"enabled": true,
"bypass": [
"geoip:cn",
"geoip:private",
"full:localhost"
],
"block": [
"cidr:192.168.1.1/24"
],
"proxy": [
"domain:google.com"
],
"default_policy": "proxy"
}
服务端分流(forward_proxy 配合路由)
服务端同样支持路由模块。当服务端配置了 forward_proxy(出站上游 SOCKS5 代理)时,
可以配合路由实现"只允许部分目标地址经过上游转发,其余直连"的分流效果:
- 命中
proxy规则的目标:经forward_proxy上游转发; - 命中
bypass规则(含default_policy)的目标:由本机直连目标,绕过上游; - 命中
block规则的目标:直接拒绝。
"forward_proxy": {
"enabled": true,
"proxy_addr": "127.0.0.1",
"proxy_port": 1080
},
"router": {
"enabled": true,
"domain_strategy": "as_is",
"default_policy": "bypass",
"proxy": [
"cidr:127.0.0.1/32"
]
}
服务端未启用路由时,所有出站流量统一走 forward_proxy(若启用)。
AEAD 加密
支持基于 Shadowsocks AEAD 对 Trojan 协议流量进行二次加密,确保 WebSocket 传输流量不被不可信的 CDN 识别:
"shadowsocks": {
"enabled": true,
"password": "my-password"
}
服务端和客户端必须同时开启并使用相同的密码。
传输层插件
支持可插拔的传输层,兼容 Shadowsocks SIP003 标准的混淆插件。以下为使用 v2ray-plugin 的示例:
注意:此配置仅作演示用途,不保证安全性。
服务端:
"transport_plugin": {
"enabled": true,
"type": "shadowsocks",
"command": "./v2ray-plugin",
"arg": ["-server", "-host", "www.baidu.com"]
}
客户端:
"transport_plugin": {
"enabled": true,
"type": "shadowsocks",
"command": "./v2ray-plugin",
"arg": ["-host", "www.baidu.com"]
}
配置示例
Cloudflare HTTP/3 配置
针对 Cloudflare CDN 优化的 QUIC 配置,提供最佳性能:
客户端配置 (client.yaml):
run-type: client
local-addr: 127.0.0.1
local-port: 10808
remote-addr: your-domain.com
remote-port: 443
quic:
enabled: true
max-idle-timeout: 30
max-incoming-streams: 100
initial-stream-window: 65535
initial-conn-window: 65535
alpn: hq-29
congestion: bbr
insecure: false
ssl:
verify-hostname: true
sni: your-domain.com
key: /path/to/key.pem
cert: /path/to/cert.pem
password:
- your-strong-password
服务端配置 (server.yaml):
run-type: server
local-addr: 0.0.0.0
local-port: 443
password:
- your-strong-password
quic:
enabled: true
max-idle-timeout: 30
max-incoming-streams: 100
initial-stream-window: 65535
initial-conn-window: 65535
alpn: hq-29
congestion: bbr
ssl:
verify-hostname: false
key: /path/to/server.key
cert: /path/to/server.crt
sni: your-domain.com
详细配置请参考 config/cloudflare_quic_client.yaml 和 config/cloudflare_quic_server.yaml。
CDN 中转配置
通过 WebSocket + CDN 实现流量中转,隐藏真实 IP:
服务端配置:
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "127.0.0.1",
"remote_port": 80,
"password": ["your_password"],
"ssl": {
"cert": "fullchain.pem",
"key": "privkey.pem",
"sni": "your-domain.com"
},
"websocket": {
"enabled": true,
"path": "/trojan-ws",
"host": "your-domain.com"
},
"shadowsocks": {
"enabled": true,
"method": "AES-128-GCM",
"password": "ws-password"
}
}
Nginx CDN 配置示例:
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
location /trojan-ws {
proxy_pass http://127.0.0.1:443;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_ssl_server_name on;
}
}
IPv6 专用配置
针对纯 IPv6 网络环境的优化配置:
服务端配置:
{
"run_type": "server",
"local_addr": "::",
"local_port": 443,
"remote_addr": "::1",
"remote_port": 80,
"password": ["your_password"],
"ssl": {
"cert": "fullchain.pem",
"key": "privkey.pem",
"sni": "[::1]"
},
"tcp": {
"fast_open": true
}
}
客户端配置:
{
"run_type": "client",
"local_addr": "::1",
"local_port": 1080,
"remote_addr": "example.com",
"remote_port": 443,
"password": ["your_password"],
"outbound_local_addr": "::",
"tcp": {
"fast_open": true
}
}
构建指南
要求 Go 版本 >= 1.27
使用 Make
git clone https://github.com/Potterli20/trojan-go-fork.git
cd trojan-go-fork
make
make install # 安装 systemd 服务等(可选)
使用 Go 直接编译
git clone https://github.com/Potterli20/trojan-go-fork.git
cd trojan-go-fork
go build -tags "full"
可通过 go-install 快速安装 Go 环境:
>> source <(curl -L https://go-install.netlify.app/install.sh)
交叉编译
Go 支持通过环境变量进行交叉编译:
# 64 位 Windows
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -tags "full"
Apple Silicon (macOS)
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -tags "full"
64 位 Linux
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -tags "full"
故障排查
连接失败
症状:客户端无法连接到服务端
排查步骤:
- 检查端口监听:
netstat -tlnp | grep trojan
# 或
ss -tlnp | grep trojan
- 验证证书配置:
ssl.cert 和 ssl.key 路径正确
- 检查证书域名与 SNI 是否匹配
- 测试证书有效性:openssl x509 -in cert.pem -text
- 检查防火墙规则:
# Linux
sudo ufw status
sudo iptables -L -n
# 确保 UDP 443 端口开放(如启用 QUIC)
- 查看日志:
{
"log-level": 0, // AllLevel - 显示所有日志
"access-log": "/var/log/trojan-access.log"
}
QUIC 连接问题
症状:QUIC 隧道无法建立
解决方案:
- 确认 UDP 443 端口可用:
nc -uvz your-domain.com 443
- 切换拥塞控制算法:
quic:
congestion: cubic # 从 bbr 切换到 cubic
- 禁用 Brutal 加速(BBR 自带速率控制):
quic:
brutal-up: 0
brutal-down: 0
- 检查 ALPN 协商:
openssl s_client -connect your-domain.com:443 -alpn hq-29
WebSocket 访问无效
症状:添加用户后 WebSocket 无法连接
原因:已修复(v0.12.0+),确保使用最新版本
临时方案:
{
"websocket": {
"enabled": true,
"path": "/ws",
"host": "your-domain.com"
},
"ssl": {
"fallback_addr": "127.0.0.1", // HTTP/1.1 回退地址
"fallback_port": 80
}
}
性能不佳
症状:速度慢、延迟高
优化建议:
- 启用 TCP Fast Open:
"tcp": {
"fast_open": true
}
- 调整 QUIC 窗口大小(高带宽低延迟网络):
quic:
initial-stream-window: 262144 # 256KB
initial-conn-window: 262144
- 启用多路复用(高并发场景):
"mux": {
"enabled": true,
"idle_timeout": 30,
"concurrency": 8
}
- 使用 BBR 拥塞控制:
quic:
congestion: bbr
优雅关闭超时
症状:服务停止需要数秒才能完全退出
说明:这是预期行为,每个环节受 5 秒超时兜底
优化:减少空闲连接数量,或使用 QUIC 的零 RTT 特性
图形界面客户端
Trojan-Go Fork 服务端兼容所有原版 Trojan 客户端(如 Igniter、ShadowRocket 等)。以下为支持扩展特性(WebSocket / Mux 等)的客户端:
- Qv2ray:跨平台客户端,支持 Windows / macOS / Linux,使用 Trojan-Go 核心。
- Igniter-Go:Android 客户端,Fork 自 Igniter,支持所有 Trojan-Go 扩展特性。
致谢
本项目基于以下优秀开源项目构建:
如遇到配置或使用问题、发现 bug,或有更好的想法,欢迎加入 Telegram 交流群。