Skip to content

Commit

Permalink
update docs, fix custom proxy
Browse files Browse the repository at this point in the history
  • Loading branch information
p4gefau1t committed Jun 19, 2020
1 parent 9fd62bb commit 46091b0
Show file tree
Hide file tree
Showing 6 changed files with 290 additions and 51 deletions.
3 changes: 3 additions & 0 deletions build/custom.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@ package build
import (
_ "github.com/p4gefau1t/trojan-go/proxy/custom"
_ "github.com/p4gefau1t/trojan-go/tunnel/adapter"
_ "github.com/p4gefau1t/trojan-go/tunnel/dokodemo"
_ "github.com/p4gefau1t/trojan-go/tunnel/freedom"
_ "github.com/p4gefau1t/trojan-go/tunnel/http"
_ "github.com/p4gefau1t/trojan-go/tunnel/mux"
_ "github.com/p4gefau1t/trojan-go/tunnel/router"
_ "github.com/p4gefau1t/trojan-go/tunnel/shadowsocks"
_ "github.com/p4gefau1t/trojan-go/tunnel/simplesocks"
_ "github.com/p4gefau1t/trojan-go/tunnel/socks"
_ "github.com/p4gefau1t/trojan-go/tunnel/tls"
_ "github.com/p4gefau1t/trojan-go/tunnel/tproxy"
_ "github.com/p4gefau1t/trojan-go/tunnel/transport"
_ "github.com/p4gefau1t/trojan-go/tunnel/trojan"
_ "github.com/p4gefau1t/trojan-go/tunnel/websocket"
Expand Down
2 changes: 1 addition & 1 deletion docs/content/advance/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ draft: false
weight: 30
---

这一部分内容将介绍更复杂的Trojan-Go配置方法
这一部分内容将介绍更复杂的Trojan-Go配置方法。对于Trojan-GFW版本不支持和不兼容的功能,将在小节中明确标明。
2 changes: 2 additions & 0 deletions docs/content/advance/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ draft: false
weight: 7
---

### 注意,Trojan-GFW版本不支持这个特性

Trojan-Go使用gRPC提供了一组API,API支持以下功能:

- 用户信息增删改查
Expand Down
208 changes: 208 additions & 0 deletions docs/content/advance/customize-protocol-stack.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
---
title: "自定义协议栈"
draft: false
weight: 8
---

### 注意,Trojan-GFW版本不支持这个特性

Trojan-Go支持用户自定义协议栈。在自定义模式下,Trojan-Go将放弃对协议栈的控制,允许用户操作底层协议栈组合。例如,你可以在一层TLS上再建立一层或更多层TLS;或是使用TLS传输Websocket流量,在Websocket层上再建立一层TLS,在第二层TLS上再使用AEAD进行传输,等等。**如果你不了解网络相关知识,请不要尝试使用这个功能。不正确的配置可能导致Trojan-Go无法正常工作,或是导致性能,安全性方面的问题。**

Trojan-Go将所有协议抽象为隧道,每个隧道可能提供客户端,负责发送;也可能提供服务端,负责接受;或者两者皆提供。自定义协议栈即自定义隧道的堆叠方式。

### 在继续配置之前,请先阅读开发指南中“基本介绍”一节,确保已经理解Trojan-Go运作方式

下面是Trojan-Go支持的隧道和他们的属性:

|隧道 | 需要下层提供流 | 需要下层提供包 | 向上层提供流 | 向上层提供包 | 可以作为入站 | 可以作为出站 |
|-------------------|--------------|-------------|-------------|------------|------------|------------|
|transport | n | n | y | y | y | y |
|dokodemo | n | n | y | y | y | n |
|tproxy | n | n | y | y | y | n |
|tls | y | n | y | n | y | y |
|trojan | y | n | y | n | y | y |
|shadowsocks | y | n | y | n | y | y |
|websocket | y | n | y | n | y | y |
|freedom | n | n | y | y | n | y |
|socks | y | n | y | y | y | n |
|http | y | n | y | n | y | n |
|router | y | y | y | y | n | y |

自定义协议栈的工作方式是,定义树/链上节点并分别它们起名(tag)并添加配置,然后使用tag组成的有向路径,描述这棵树/链。例如,对于一个典型的Trojan-Go服务器,可以如此描述:

入站,一共两条路径,tls节点将自动识别trojan和websocket流量并进行分发

- transport->tls->trojan

- transport->tls->websocket->trojan

出站,只能有一条路径

- freedom

对于入站,你可以描述一条链,一棵树或者有向无环图,对于出站,你只能描述一个链。**注意,每条路径必须以不需要下层提供流或包的隧道开始(transport/tproxy/dokodemo等),必须以能向上层提供包和流的隧道终止(trojan/simplesocks/freedom),且必须确认对应隧道是否可作为出站/入站**

要启用自定义协议栈,将```run_type```指定为custom,此时除```inbound``````outbound```之外的其他选项将被忽略。

下面是一个例子,你可以在此基础上插入或减少协议节点。配置文件为简明起见,使用YAML配置,你也可以使用JSON来配置,作用是等价的。

客户端 client.yaml

```yaml
run-type: custom

inbound:
node:
- protocol: transport
tag: transport
config:
local-addr: 127.0.0.1
local-port: 1080
- protocol: socks
tag: socks
path:
-
- transport
- socks

outbound:
node:
- protocol: transport
tag: transport
config:
remote-addr: you_server
remote-port: 443

- protocol: tls
tag: tls
config:
ssl:
sni: localhost
key: server.key
cert: server.crt

- protocol: trojan
tag: trojan
config:
password:
- 12345678

path:
-
- transport
- tls
- trojan

```

服务端 server.yaml

```yaml
run-type: custom

inbound:
node:
- protocol: websocket
tag: websocket
config:
websocket:
enabled: true
hostname: example.com
path: /ws

- protocol: transport
tag: transport
config:
local-addr: 0.0.0.0
local-port: 443
remote-addr: 127.0.0.1
remote-port: 80

- protocol: tls
tag: tls
config:
ssl:
sni: localhost
key: server.key
cert: server.crt

- protocol: trojan
tag: trojan1
config:
password:
- 12345678

- protocol: trojan
tag: trojan2
config:
password:
- 87654321

path:
-
- transport
- tls
- trojan1
-
- transport客户端 client.yaml

```yaml
run-type: custom
inbound:
node:
- protocol: transport
tag: transport
config:
local-addr: 127.0.0.1
local-port: 1080
- protocol: socks
tag: socks
path:
-
- transport
- socks
outbound:
node:
- protocol: transport
tag: transport
config:
remote-addr: you_server
remote-port: 443
- protocol: tls
tag: tls
config:
ssl:
sni: localhost
key: server.key
cert: server.crt
- protocol: trojan
tag: trojan
config:
password:
- 12345678
path:
-
- transport
- tls
- trojan
```

- tls
- websocket
- trojan2

outbound:
node:
- protocol: freedom
tag: freedom

path:
-
- freedom
```
56 changes: 52 additions & 4 deletions docs/content/developer/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,15 @@ Trojan-Go将所有协议(包括路由功能等)抽象为隧道(tunnel.Tunnel

最底层的隧道为传输层,即不从其他隧道获取或者创建流和包的隧道,充当上图中隧道A或者C的角色。

- transport,TLS和可插拔传输层
- transport,可插拔传输层

- socks,socks5代理,仅隧道服务端

- tproxy,透明代理,仅隧道服务端

- dokodemo,反向代理,仅隧道服务端

- raw,原始TCP/UDP
- freedom,自由出站,仅隧道客户端

这几个隧道直接从TCP/UDP Socket创建流和包,不接受为其底层添加的任何隧道。

Expand All @@ -62,16 +62,64 @@ Trojan-Go将所有协议(包括路由功能等)抽象为隧道(tunnel.Tunnel

- simplesocks

- tls

- router,路由功能,仅隧道客户端

他们都不关心其下层隧道实现。但可以根据到来的流和包,将其分发给上层隧道。

例如,在这张图中,是一个典型的Trojan-Go客户端和服务端,各个隧道自下往上堆叠的顺序是:

- 隧道A: transport->socks

- 隧道B: transport->tls->trojan

- 隧道C: freedom

实际上的隧道堆叠的情况会比这个更复杂一些。通常的入站的隧道是一棵树(或有向无环图)的形式,而非一条链。具体解释参考下文。

## proxy.Proxy代理核心

代理核心的作用,是监听上述隧道进行组合堆叠并形成的协议栈,将所有的入站协议栈(多个隧道Server)中抽取的流和包,以及对应元信息,转送给出站协议栈(一个隧道Client)。
代理核心的作用,是监听上述隧道进行组合堆叠并形成的协议栈,将所有的入站协议栈(多个隧道Server的终端节点,见下)中抽取的流和包,以及对应元信息,转送给出站协议栈(一个隧道Client)。

注意,这里的入站协议栈可以有多个,如客户端可以同时从Socks5和HTTP协议栈中抽取流和包,服务端可以同时从Websocket承载的Trojan协议,和TLS承载的Trojan协议中抽取流和包等。但是出站协议栈只能有一个,如只使用TLS承载的Trojan协议出站。

为了描述入站协议栈(隧道服务端)的组合和堆叠方式,使用一棵多叉树对所有协议栈进行描述。你可以在client/forward/nat/server中看到构建树的过程
为了描述入站协议栈(隧道服务端)的组合和堆叠方式,使用一棵多叉树对所有协议栈进行描述。你可以在proxy文件夹中各组件,看到构建树的过程

而出站协议栈则比较简单,使用一个简单列表即可描述。

所以实际上,对于一个典型的开启了Websocket和Mux的客户端/服务端,上图的隧道堆叠模型为:

客户端

- 入站(树)
- transport (根)
- adapter 能够识别HTTP和Socks流量并分发给上层协议
- http (终端节点)
- socks(终端节点)

- 出站(列表)
- transport (根)
- tls
- websocket
- trojan
- mux
- simplesocks

服务端

- 入站(树)
- transport (根)
- tls 能够识别HTTP和非HTTP流量并分发
- websocket
- trojan(终端节点)
- mux
- simplesocks (终端节点)
- trojan 能够识别mux和普通trojan流量并分发(终端节点)
- mux
- simplesocks (终端节点)

- 出站(列表)
- freedom

注意,代理核心只从隧道构成的树的终端节点抽取流和包,并转送到唯一的出站上。多个终端节点的设计的目的,是使Trojan-Go同时兼容Websocket和Trojan协议入站连接,开启/未开启Mux的入站连接,以及HTTP/Socks5自动识别的功能。每个拥有多个儿子的树上节点,具有精确识别和分发流和包给不同的儿子节点的能力。这符合我们假定每个协议了解其上层承载协议的假设。
Loading

0 comments on commit 46091b0

Please sign in to comment.