github.com/ipfans/trojan-go@v0.11.0/docs/content/advance/customize-protocol-stack.md (about) 1 --- 2 title: "自定义协议栈" 3 draft: false 4 weight: 8 5 --- 6 7 ### 注意,Trojan不支持这个特性 8 9 Trojan-Go允许高级用户自定义协议栈。在自定义模式下,Trojan-Go将放弃对协议栈的控制,允许用户操作底层协议栈组合。例如 10 11 - 在一层TLS上再建立一层或更多层TLS加密 12 13 - 使用TLS传输Websocket流量,在Websocket层上再建立一层TLS,在第二层TLS上再使用Shadowsocks AEAD进行加密传输 14 15 - 在TCP连接上,使用Shadowsocks的AEAD加密传输Trojan协议 16 17 - 将一个入站Trojan的TLS流量解包后重新用TLS包装为新的出站Trojan流量 18 19 等等。 20 21 **如果你不了解网络相关知识,请不要尝试使用这个功能。不正确的配置可能导致Trojan-Go无法正常工作,或是导致性能和安全性方面的问题。** 22 23 Trojan-Go将所有协议抽象为隧道,每个隧道可能提供客户端,负责发送;也可能提供服务端,负责接受;或者两者皆提供。自定义协议栈即自定义隧道的堆叠方式。 24 25 ### 在继续配置之前,请先阅读开发指南中“基本介绍”一节,确保已经理解Trojan-Go运作方式 26 27 下面是Trojan-Go支持的隧道和他们的属性: 28 29 | 隧道 | 需要下层提供流 | 需要下层提供包 | 向上层提供流 | 向上层提供包 | 可以作为入站 | 可以作为出站 | 30 | ----------- | -------------- | -------------- | ------------ | ------------ | ------------ | ------------ | 31 | transport | n | n | y | y | y | y | 32 | dokodemo | n | n | y | y | y | n | 33 | tproxy | n | n | y | y | y | n | 34 | tls | y | n | y | n | y | y | 35 | trojan | y | n | y | y | y | y | 36 | mux | y | n | y | n | y | y | 37 | simplesocks | y | n | y | y | y | y | 38 | shadowsocks | y | n | y | n | y | y | 39 | websocket | y | n | y | n | y | y | 40 | freedom | n | n | y | y | n | y | 41 | socks | y | y | y | y | y | n | 42 | http | y | n | y | n | y | n | 43 | router | y | y | y | y | n | y | 44 | adapter | n | n | y | y | y | n | 45 46 自定义协议栈的工作方式是,定义树/链上节点并分别它们起名(tag)并添加配置,然后使用tag组成的有向路径,描述这棵树/链。例如,对于一个典型的Trojan-Go服务器,可以如此描述: 47 48 入站,一共两条路径,tls节点将自动识别trojan和websocket流量并进行分发 49 50 - transport->tls->trojan 51 52 - transport->tls->websocket->trojan 53 54 出站,只能有一条路径 55 56 - router->freedom 57 58 对于入站,从根开始描述多条路径,组成一棵**多叉树**(也可以退化为一条链),不满足树性质的图将导致未定义的行为;对于出站,必须描述一条**链**。 59 60 每条路径必须满足这样的条件: 61 62 1. 必须以**不需要下层提供流或包**的隧道开始(transport/adapter/tproxy/dokodemo等) 63 64 2. 必须以**能向上层提供包和流**的隧道终止(trojan/simplesocks/freedom等) 65 66 3. 出站单链上,隧道必须都可作为出站。入站的所有路径上,隧道必须都可作为入站。 67 68 要启用自定义协议栈,将```run_type```指定为custom,此时除```inbound```和```outbound```之外的其他选项将被忽略。 69 70 下面是一个例子,你可以在此基础上插入或减少协议节点。配置文件为简明起见,使用YAML进行配置,你也可以使用JSON来配置,除格式不同之外,效果是等价的。 71 72 客户端 client.yaml 73 74 ```yaml 75 run-type: custom 76 77 inbound: 78 node: 79 - protocol: adapter 80 tag: adapter 81 config: 82 local-addr: 127.0.0.1 83 local-port: 1080 84 - protocol: socks 85 tag: socks 86 config: 87 local-addr: 127.0.0.1 88 local-port: 1080 89 path: 90 - 91 - adapter 92 - socks 93 94 outbound: 95 node: 96 - protocol: transport 97 tag: transport 98 config: 99 remote-addr: you_server 100 remote-port: 443 101 102 - protocol: tls 103 tag: tls 104 config: 105 ssl: 106 sni: localhost 107 key: server.key 108 cert: server.crt 109 110 - protocol: trojan 111 tag: trojan 112 config: 113 password: 114 - 12345678 115 116 path: 117 - 118 - transport 119 - tls 120 - trojan 121 122 ``` 123 124 服务端 server.yaml 125 126 ```yaml 127 run-type: custom 128 129 inbound: 130 node: 131 - protocol: websocket 132 tag: websocket 133 config: 134 websocket: 135 enabled: true 136 hostname: example.com 137 path: /ws 138 139 - protocol: transport 140 tag: transport 141 config: 142 local-addr: 0.0.0.0 143 local-port: 443 144 remote-addr: 127.0.0.1 145 remote-port: 80 146 147 - protocol: tls 148 tag: tls 149 config: 150 remote-addr: 127.0.0.1 151 remote-port: 80 152 ssl: 153 sni: localhost 154 key: server.key 155 cert: server.crt 156 157 - protocol: trojan 158 tag: trojan1 159 config: 160 remote-addr: 127.0.0.1 161 remote-port: 80 162 password: 163 - 12345678 164 165 - protocol: trojan 166 tag: trojan2 167 config: 168 remote-addr: 127.0.0.1 169 remote-port: 80 170 password: 171 - 87654321 172 173 path: 174 - 175 - transport 176 - tls 177 - trojan1 178 - 179 - transport 180 - tls 181 - websocket 182 - trojan2 183 184 outbound: 185 node: 186 - protocol: freedom 187 tag: freedom 188 189 path: 190 - 191 - freedom 192 ```