Profile
Back to NewsBack
GitHub Trending 7 min
Reader Mode
Potterli20/trojan-go-fork: 社区trojan-go(欢迎各位给pr和修复bug)

Potterli20/trojan-go-fork: 社区trojan-go(欢迎各位给pr和修复bug)

7 hours ago

Trojan-Go Fork

Go Version</a> License</a>

注意:本项目已通过 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 幂等只跑一次
合并了以下社区贡献者的改进:@fregie、@rezaf28、@lakwsh、@lbsystem。

如发现其他 bug 或新需求,欢迎提交 Issue。


Docker 部署

预构建的 Docker 镜像可从以下仓库获取:

拉取镜像:
# 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"

故障排查

连接失败

症状:客户端无法连接到服务端

排查步骤:

  1. 检查端口监听:
netstat -tlnp | grep trojan
   # 或
   ss -tlnp | grep trojan
  1. 验证证书配置:
- 确保 ssl.cert 和 ssl.key 路径正确 - 检查证书域名与 SNI 是否匹配 - 测试证书有效性:openssl x509 -in cert.pem -text
  1. 检查防火墙规则:
# Linux
   sudo ufw status
   sudo iptables -L -n

# 确保 UDP 443 端口开放(如启用 QUIC)

  1. 查看日志:
{
     "log-level": 0,  // AllLevel - 显示所有日志
     "access-log": "/var/log/trojan-access.log"
   }

QUIC 连接问题

症状:QUIC 隧道无法建立

解决方案:

  1. 确认 UDP 443 端口可用:
nc -uvz your-domain.com 443
  1. 切换拥塞控制算法:
quic:
     congestion: cubic  # 从 bbr 切换到 cubic
  1. 禁用 Brutal 加速(BBR 自带速率控制):
quic:
     brutal-up: 0
     brutal-down: 0
  1. 检查 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
  }
}

性能不佳

症状:速度慢、延迟高

优化建议:

  1. 启用 TCP Fast Open:
"tcp": {
     "fast_open": true
   }
  1. 调整 QUIC 窗口大小(高带宽低延迟网络):
quic:
     initial-stream-window: 262144   # 256KB
     initial-conn-window: 262144
  1. 启用多路复用(高并发场景):
"mux": {
     "enabled": true,
     "idle_timeout": 30,
     "concurrency": 8
   }
  1. 使用 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 交流群。
Chat with me