Skip to content

Commit

Permalink
update docs, config
Browse files Browse the repository at this point in the history
  • Loading branch information
p4gefau1t committed May 18, 2020
1 parent 04b157d commit ff3c500
Show file tree
Hide file tree
Showing 21 changed files with 77 additions and 111 deletions.
47 changes: 27 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
[![Commit](https://img.shields.io/github/last-commit/p4gefau1t/trojan-go)](https://img.shields.io/github/last-commit/p4gefau1t/trojan-go)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/p4gefau1t/trojan-go)](https://img.shields.io/github/commit-activity/m/p4gefau1t/trojan-go)
[![Go Report Card](https://goreportcard.com/badge/github.com/p4gefau1t/trojan-go)](https://goreportcard.com/report/github.com/p4gefau1t/trojan-go)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/p4gefau1t/trojan-go/pulls)

使用Go实现的完整Trojan代理,与Trojan协议以及Trojan-GFW版本的配置文件格式兼容。安全,高效,轻巧,易用。

Expand All @@ -21,11 +22,9 @@

预编译的版本可在 [Release 页面](https://github.com/p4gefau1t/trojan-go/releases)下载。直接运行解压得到的执行文件即可,无其他组件依赖。

跨平台客户端[Trojan-Qt5](https://github.com/Trojan-Qt5/Trojan-Qt5/)已使用Trojan-Go核心,支持目前所有的Trojan-Go扩展特性,界面友好,推荐作为客户端使用
如果你遇到配置和使用方面的问题,发现了软件Bug,或是有更好的想法,欢迎加入Trojan-Go的[Telegram交流反馈群](https://t.me/trojan_go_chat)

[Telegram交流反馈群](https://t.me/trojan_go_chat)

### 下面的说明为简单介绍,完整配置教程和配置介绍参见[Trojan-Go文档](https://p4gefau1t.github.io/trojan-go)
## **下面的说明为简单介绍,完整配置教程和配置介绍参见[Trojan-Go文档](https://p4gefau1t.github.io/trojan-go)**

Trojan-Go支持并且兼容Trojan-GFW的绝大多数功能,包括但不限于:

Expand Down Expand Up @@ -53,18 +52,30 @@ Trojan-Go支持并且兼容Trojan-GFW的绝大多数功能,包括但不限于

- 多平台和多操作系统支持,无特殊依赖

- 多路复用,显著提升并发性能
- 多路复用,降低延迟,提升并发性能

- 自定义路由模块,可实现国内直连/广告屏蔽等功能

- Websocket,用于支持CDN流量中转(基于WebSocket over TLS/SSL)和对抗GFW中间人攻击
- Websocket传输支持,用于实现CDN流量中转(基于WebSocket over TLS/SSL)和对抗GFW中间人攻击

- 自动化HTTPS证书申请,使用ACME协议从Let's Encrypt自动申请和更新HTTPS证书
- 自动化HTTPS证书申请,从Let's Encrypt自动申请和更新HTTPS证书

- TLS指纹伪造,绕过针对TLS Client Hello的特征识别
- TLS指纹伪造,绕过GFW针对TLS Client Hello的特征识别

- 基于gRPC的API支持,支持动态用户管理和流量速度限制

- 服务端支持处理Trojan协议明文(TCP明文传输),以适应前置nginx等服务器的场景

## 图形界面客户端

Trojan-Go服务端可以兼容所有Trojan-GFW的客户端,如Igniter,ShadowRocket等。

下面是支持Trojan-Go扩展特性(Websocket/Mux等)的客户端。

[Trojan-Qt5](https://github.com/Trojan-Qt5/Trojan-Qt5/),跨平台客户端,支持Windows/MacOS/Linux,使用Trojan-Go核心,支持所有Trojan-Go扩展特性。

[Igniter-Go](https://github.com/p4gefau1t/trojan-go-android),Fork自Igniter,将Igniter核心替换为Trojan-Go并做了一定修改,支持所有Trojan-Go扩展特性。

## 使用方法

1. 快速证书配置
Expand Down Expand Up @@ -108,7 +119,7 @@ Trojan-Go支持并且兼容Trojan-GFW的绝大多数功能,包括但不限于
4. 使用Docker部署

```shell
docker run\
docker run \
--name trojan-go \
-d \
-v /etc/trojan-go/:/etc/trojan-go \
Expand All @@ -119,7 +130,7 @@ Trojan-Go支持并且兼容Trojan-GFW的绝大多数功能,包括但不限于
或者

```shell
docker run\
docker run \
--name trojan-go \
-d \
-v /path/to/host/config:/path/in/container \
Expand Down Expand Up @@ -171,7 +182,6 @@ server.json
"key": "your_key.key"
}
}
```

客户端配置文件
Expand Down Expand Up @@ -201,13 +211,13 @@ client.json
sudo ./trojan-go -autocert request
```

向Let's Encrypt申请证书
向Let's Encrypt申请证书
申请过程中,按照ACME协议要求,trojan-go需要和letsencrypt服务器交互,因此需要暂时占用本地443和80端口,此时请暂时关闭nginx,apache,或者trojan等服务。
Linux下,绑定80和443端口需要root权限,因此你需要使用sudo执行trojan-go才能正常证书申请流程。
你也可以指定自定义端口,然后使用nginx等web服务器进行443和80分流,将acme协议代理到自定义端口上
你也可以指定自定义端口,然后使用nginx等web服务器进行443和80分流,将ACME协议流量代理到自定义端口上
如果申请成功,本目录下会得到
Expand Down Expand Up @@ -249,19 +259,19 @@ Trojan-Go支持使用TLS+Websocket承载Trojan协议,使得利用CDN进行流

可以省略```hostname```, 但是服务器和客户端的```path```必须一致。服务器开启Websocket支持后可以同时支持Websocket和一般Trojan流量,未配置Websocket选项的客户端依然可以正常使用。

由于Trojan-GFW版本并不支持Websocket,因此,虽然开启了Websocket支持的服务端可以兼容所有客户端,但是如果要使用Websocket承载流量,请确保双方都使用Trojan-Go。
由于Trojan-GFW版本并不支持Websocket,因此,虽然开启了Websocket支持的Trojan-Go服务端可以兼容所有客户端,但是如果要使用Websocket承载流量,请确保双方都使用Trojan-Go。

### 多路复用

<a name="多路复用"></a>

在很差的网络条件下,一次TLS握手可能会花费很多时间。

Trojan-Go支持多路复用(基于[smux](https://github.com/xtaci/smux))。通过使一个TLS隧道连接承载多个TCP连接的方式,减少TCP和TLS握手带来的延迟,以期提升高并发情景下的性能。
Trojan-Go支持多路复用(基于[smux](https://github.com/xtaci/smux))。通过一个TLS隧道连接承载多个TCP连接的方式,减少TCP和TLS握手带来的延迟,以期提升高并发情景下的性能。

启用多路复用并不会增加你测速得到的链路速度,但会降低延迟,提升大量并发请求时的网络体验,例如浏览含有大量图片的网页等。

注意,这个特性和Trojan-GFW**不兼容**,出于兼容性考虑,这个特性是默认关闭的。你可以通过设置mux选项中的"enabled"字段启用它。如下
注意,这个特性和Trojan-GFW**不兼容**,出于兼容性考虑,这个特性是默认关闭的。你可以通过设置客户端的mux选项"enabled"字段启用它。如下

```json
"mux": {
Expand Down Expand Up @@ -361,11 +371,8 @@ CGO_ENABLE=0 GOOS=linux GOARCH=arm go build -tags "full"

[go-tproxy](https://github.com/LiamHaworth/go-tproxy)

[tcplisten](https://github.com/valyala/tcplisten)

[utls](https://github.com/refraction-networking/utls)


## Stargazers over time

[![Stargazers over time](https://starchart.cc/p4gefau1t/trojan-go.svg)](https://starchart.cc/p4gefau1t/trojan-go)
[![Stargazers over time](https://starchart.cc/p4gefau1t/trojan-go.svg)](https://starchart.cc/p4gefau1t/trojan-go)
4 changes: 2 additions & 2 deletions api/server_test.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package api

import (
context "context"
"context"
"fmt"
"testing"
"time"

"github.com/p4gefau1t/trojan-go/common"
"github.com/p4gefau1t/trojan-go/conf"
"github.com/p4gefau1t/trojan-go/stat/memory"
grpc "google.golang.org/grpc"
"google.golang.org/grpc"
)

func TestServerAPI(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
)

const (
Version = "v0.4.10"
Version = "v0.4.11"
)

type Runnable interface {
Expand Down
4 changes: 2 additions & 2 deletions common/io.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,15 @@ func (r *RewindReader) StopBuffering() {
func (r *RewindReader) SetBufferSize(size int) {
if size == 0 { //disable buffering
if !r.buffered {
panic("already disabled")
panic("reader is already disabled")
}
r.buffered = false
r.buf = nil
r.bufReadIdx = 0
r.bufferSize = 0
} else {
if r.buffered {
panic("is already buffering")
panic("reader is already buffering")
}
r.buffered = true
r.bufReadIdx = 0
Expand Down
2 changes: 0 additions & 2 deletions conf/conf.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ const (

type TLSConfig struct {
Verify bool `json:"verify"`
VerifyHostname bool `json:"verify_hostname"`
CertPath string `json:"cert"`
KeyPath string `json:"key"`
KeyPassword string `json:"key_password"`
Expand All @@ -45,7 +44,6 @@ type TLSConfig struct {
Curves string `json:"curves"`
Fingerprint string `json:"fingerprint"`
ServePlainText bool `json:"serve_plain_text"`
RedirectWithTLS bool `json:"redirect_with_tls"`

ClientHelloID *utls.ClientHelloID
FallbackAddress *common.Address
Expand Down
14 changes: 6 additions & 8 deletions conf/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -356,10 +356,9 @@ func ParseJSON(data []byte) (*GlobalConfig, error) {
KeepAlive: true,
},
TLS: TLSConfig{
Verify: true,
VerifyHostname: true,
SessionTicket: true,
ReuseSession: true,
Verify: true,
SessionTicket: true,
ReuseSession: true,
ALPN: []string{
"http/1.1",
},
Expand All @@ -372,10 +371,9 @@ func ParseJSON(data []byte) (*GlobalConfig, error) {
Websocket: WebsocketConfig{
DoubleTLS: true,
TLS: TLSConfig{
Verify: true,
VerifyHostname: true,
SessionTicket: true,
ReuseSession: true,
Verify: true,
SessionTicket: true,
ReuseSession: true,
},
},
MySQL: MySQLConfig{
Expand Down
2 changes: 1 addition & 1 deletion docs/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ enableMissingTranslationPlaceholders = false
# Source Code repository section
description = "An unidentifiable mechanism that helps you bypass GFW. "
github_repository = "https://github.com/p4gefau1t/trojan-go"
version = "0.4.10"
version = "0.4.11"

# Documentation repository section
# documentation repository (set edit link to documentation repository)
Expand Down
40 changes: 2 additions & 38 deletions docs/content/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,47 +8,11 @@ weight: 10

这里是Trojan-Go的文档,你可以在左侧的导航栏中找到一些使用技巧,以及完整的配置文件说明。

Trojan-Go是使用Go语言实现的完整的Trojan代理,和Trojan协议以及原版的配置文件格式兼容。
Trojan-Go是使用Go语言实现的完整的Trojan代理,和Trojan协议以及原版的配置文件格式兼容。支持并且兼容Trojan-GFW版本的绝大多数功能,并扩展了更多的实用功能。

Trojan-Go的的首要目标是保障传输安全性和隐蔽性。在此前提下,尽可能提升传输性能和易用性。

Trojan-Go支持并且兼容原版Trojan的绝大多数功能,包括但不限于:

- TLS/SSL隧道传输

- 透明代理 (NAT模式,iptables设置参见[这里](https://github.com/shadowsocks/shadowsocks-libev/tree/v3.3.1#transparent-proxy))

- UDP代理

- 对抗GFW被动/主动检测的机制

- MySQL数据库支持

- 流量统计,用户流量配额限制

- 从数据库中的用户列表进行认证

- TCP性能方面的选项,如TCP Fast Open,端口复用等

同时,Trojan-Go还有更多高效易用的功能特性:

- 简易模式,快速部署使用

- Socks5/HTTP代理自动适配

- 多平台和多操作系统支持,无特殊依赖

- 多路复用,显著提升并发性能

- 自定义路由模块,可实现国内直连/广告屏蔽等功能

- Websocket,用于支持CDN流量中转(基于WebSocket over TLS/SSL)和对抗GFW中间人攻击

- 自动化证书申请,使用ACME协议从Let's Encrypt自动申请和更新HTTPS证书

- 基于gRPC的API支持,支持动态用户管理和流量速度限制

如果你遇到配置方面的问题,或是遇到了软件Bug,或是有更好的想法,欢迎加入[Telegram交流反馈群](https://t.me/trojan_go_chat)
如果你遇到配置和使用方面的问题,发现了软件Bug,或是有更好的想法,欢迎加入Trojan-Go的[Telegram交流反馈群](https://t.me/trojan_go_chat)

----

Expand Down
14 changes: 5 additions & 9 deletions docs/content/basic/full-config.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ weight: 30
"dns": [],
"ssl": {
"verify": true,
"verify_hostname": true,
"cert": *required*,
"key": *required*,
"key_password": "",
Expand Down Expand Up @@ -86,7 +85,6 @@ weight: 30
"double_tls": true,
"ssl": {
"verify": true,
"verify_hostname": true,
"cert": "",
"key": "",
"key_password": "",
Expand Down Expand Up @@ -155,14 +153,12 @@ weight: 30

使用DOT可以防止DNS请求泄露,但由于TLS的握手耗费更多时间,查询速度也会有一定的下降,请自行斟酌性能和安全性的平衡。

```buffer_size```为单个连接缓冲区大小,单位KiB,默认32KiB。提升这个数值可以提升网络吞吐量和效率,但是也会增加内存消耗。对于路由器等嵌入式系统,建议根据实际情况,适当减小该数值。
```buffer_size```为单个连接缓冲区大小,单位KiB,默认32KiB。适当提升这个数值可以提升网络吞吐量和效率,但是也会增加内存消耗。对于路由器等嵌入式系统,建议根据实际情况,适当减小该数值。

### ```ssl```选项

```verify```表示客户端(client/nat/forward)是否校验服务端提供的证书合法性,默认开启。出于安全性考虑,这个选项不应该在实际场景中选择false,否则可能遭受中间人攻击。如果使用自签名或者自签发的证书,开启```verify```会导致校验失败。这种情况下,应当保持```verify```开启,然后在```cert```中填写服务端的证书,即可正常连接。

```verify_hostname```表示客户端(client/nat/forward)是否校验服务端提供的证书的Common Name和本地提供的SNI字段的一致性。

服务端必须填入```cert``````key```,对应服务器的证书和私钥文件,请注意证书是否有效/过期。如果使用权威CA签发的证书,客户端(client/nat/forward)可以不填写```cert```。如果使用自签名或者自签发的证书,应当在的```cert```处填入服务器证书文件,否则可能导致校验失败。

```sni```指的是证书的Common Name,如果你使用letsencrypt等机构签名的证书,这里填入你的域名。如果这一项未填,将使用```remote_addr```填充。你应当指定一个有效的SNI(和远端证书CN一致),否则客户端可能无法验证远端证书有效性从而无法连接。
Expand All @@ -189,9 +185,9 @@ weight: 30

一旦指纹的值被设置,```cipher``````curves``````alpn``````session_ticket```等有可能影响指纹的字段将使用该指纹的特定设置覆写。

```plain_http_response```指定了当TLS握手失败时,明文发送的原始数据(原始TCP数据)。这个字段填入该文件路径。推荐使用```fallback_port```而不是该字段。
```plain_http_response```指服务端TLS握手失败时,明文发送的原始数据(原始TCP数据)。这个字段填入该文件路径。推荐使用```fallback_port```而不是该字段。

```fallback_port```指TLS握手失败时,trojan-go将该连接代理到该端口上。这是trojan-go的特性,以便更好地隐蔽Trojan服务器,抵抗GFW的主动检测,使得服务器的443端口在遭遇非TLS协议的探测时,行为与正常服务器完全一致。当服务器接受了一个连接但无法进行TLS握手时,如果```fallback_port```不为空,则流量将会被代理至remote_addr:fallback_port。例如,你可以在本地使用nginx开启一个https服务,当你的服务器443端口被非TLS协议请求时(比如http请求),trojan-go将代理至本地https服务器,nginx将使用http协议明文返回一个400 Bad Request页面。你可以通过使用浏览器访问```http://your_domain_name.com:443```进行验证。
```fallback_port```指服务端TLS握手失败时,trojan-go将该连接代理的端口。这是trojan-go的特性,以便更好地隐蔽Trojan服务器,抵抗GFW的主动检测,使得服务器的443端口在遭遇非TLS协议的探测时,行为与正常服务器完全一致。当服务器接受了一个连接但无法进行TLS握手时,如果```fallback_port```不为空,则流量将会被代理至remote_addr:fallback_port。例如,你可以在本地使用nginx开启一个https服务,当你的服务器443端口被非TLS协议请求时(比如http请求),trojan-go将代理至本地https服务器,nginx将使用http协议明文返回一个400 Bad Request页面。你可以通过使用浏览器访问```http://your_domain_name.com:443```进行验证。

```serve_plain_text```服务端直接是否直接接受TCP连接并处理trojan协议明文。开启此选项后,```ssl```的其他选项将失效,trojan-go将直接处理连入的TCP连接而不使用TLS。此选项的意义在于支持nginx等Web服务器的分流。如果开启,请不要将trojan-go服务对外暴露。

Expand Down Expand Up @@ -261,11 +257,11 @@ Websocket传输是trojan-go的特性。在**正常的直接连接代理节点**

```ssl```如果```double_tls```启用,这个选项用于配置第二层TLS,如果没有填写则使用全局的```ssl```填充。各字段定义与全局```ssl```相同。

```obfuscation_password```指定混淆密码。用于混淆内层连接以降低遭到国内无良CDN运营商识别的概率。如果需要使用混淆,服务端和客户端必须同时设置相同密码。这个选项对性能有一定影响,请自行斟酌安全性和性能的平衡。
```obfuscation_password```指定混淆密码。用于混淆内层连接以避免遭到CDN运营商识别。如果需要使用混淆,服务端和客户端必须设置相同的密码。这个选项对性能有一定影响,请自行斟酌安全性和性能的平衡。

### ```tcp```选项

```no_delay```是否禁用纳格算法(Nagle’s algorithm),即TCP封包是否直接发出而不等待缓冲区填满
```no_delay```TCP封包是否直接发出而不等待缓冲区填满

```keep_alive```是否启用TCP心跳存活检测。

Expand Down
Loading

0 comments on commit ff3c500

Please sign in to comment.