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  ```