github.com/ipfans/trojan-go@v0.11.0/docs/content/developer/overview.md (about) 1 --- 2 title: "基本介绍" 3 draft: false 4 weight: 1 5 --- 6 7 Trojan-Go的核心部分有 8 9 - tunnel 各个协议具体实现 10 11 - proxy 代理核心 12 13 - config 配置注册和解析模块 14 15 - redirector 主动检测欺骗模块 16 17 - statistics 用户认证和统计模块 18 19 可以在对应文件夹中找到相关源代码。 20 21 ## tunnel.Tunnel隧道 22 23 Trojan-Go将所有协议(包括路由功能等)抽象为隧道(tunnel.Tunnel接口),每个隧道可开启服务端(tunnel.Server接口)和客户端(tunnel.Client)。每个服务端可以从其底层隧道中,剥离并接受流(tunnel.Conn)和包(tunnel.PacketConn)。客户端可以向底层隧道,创建流和包。 24 25 每个隧道并不关心其下方的隧道是什么,但是每个隧道清楚知道这个它上方的其他隧道的相关信息。 26 27 所有隧道需要下层提供流或包传输支持,或两者都要求提供。所有隧道必须向上层隧道提供流传输支持,但不一定提供包传输。 28 29 隧道可能只有服务端,也可能只有客户端,也可能两者皆有。两者皆有的隧道,可被用于作为Trojan-Go客户端和服务端间的传输隧道。 30 31 注意,请区分Trojan-Go的服务端/客户端,和隧道的服务端/客户端的区别。下面是一个方便理解的图例。 32 33 ```text 34 35 入站 GFW 出站 36 -------->隧道A服务端->隧道B客户端 ----------------> 隧道B服务端->隧道C客户端-----------> 37 (Trojan-Go客户端) (Trojan-Go服务端) 38 39 ``` 40 41 最底层的隧道为传输层,即不从其他隧道获取或者创建流和包的隧道,充当上图中隧道A或者C的角色。 42 43 - transport,可插拔传输层 44 45 - socks,socks5代理,仅隧道服务端 46 47 - tproxy,透明代理,仅隧道服务端 48 49 - dokodemo,反向代理,仅隧道服务端 50 51 - freedom,自由出站,仅隧道客户端 52 53 这几个隧道直接从TCP/UDP Socket创建流和包,不接受为其底层添加的任何隧道。 54 55 其他隧道,只要下层能满足上层对包和流传输的需求,则原则上可以任何方式,任何数量进行组合和堆叠。这些隧道在上图中充当隧道B的角色,他们有 56 57 - trojan 58 59 - websocket 60 61 - mux 62 63 - simplesocks 64 65 - tls 66 67 - router,路由功能,仅隧道客户端 68 69 他们都不关心其下层隧道实现。但可以根据到来的流和包,将其分发给上层隧道。 70 71 例如,在这张图中,是一个典型的Trojan-Go客户端和服务端,各个隧道自下往上堆叠的顺序是: 72 73 - 隧道A: transport->socks 74 75 - 隧道B: transport->tls->trojan 76 77 - 隧道C: freedom 78 79 实际上的隧道堆叠的情况会比这个更复杂一些。通常的入站的隧道是一棵多叉树的形式,而非一条链。具体解释参考下文。 80 81 ## proxy.Proxy代理核心 82 83 代理核心的作用,是监听上述隧道进行组合堆叠并形成的协议栈,将所有的入站协议栈(多个隧道Server的终端节点,见下)中抽取的流和包,以及对应元信息,转送给出站协议栈(一个隧道Client)。 84 85 注意,这里的入站协议栈可以有多个,如客户端可以同时从Socks5和HTTP协议栈中抽取流和包,服务端可以同时从Websocket承载的Trojan协议,和TLS承载的Trojan协议中抽取流和包等。但是出站协议栈只能有一个,如只使用TLS承载的Trojan协议出站。 86 87 为了描述入站协议栈(隧道服务端)的组合和堆叠方式,使用一棵多叉树对所有协议栈进行描述。你可以在proxy文件夹中各组件,看到构建树的过程。 88 89 而出站协议栈则比较简单,使用一个简单列表即可描述。 90 91 所以实际上,对于一个典型的开启了Websocket和Mux的客户端/服务端,上图的隧道堆叠模型为: 92 93 客户端 94 95 - 入站(树) 96 - transport (根) 97 - adapter 能够识别HTTP和Socks流量并分发给上层协议 98 - http (终端节点) 99 - socks(终端节点) 100 101 - 出站(链) 102 - transport (根) 103 - tls 104 - websocket 105 - trojan 106 - mux 107 - simplesocks 108 109 服务端 110 111 - 入站(树) 112 - transport (根) 113 - tls 能够识别HTTP和非HTTP流量并分发 114 - websocket 115 - trojan(终端节点) 116 - mux 117 - simplesocks (终端节点) 118 - trojan 能够识别mux和普通trojan流量并分发(终端节点) 119 - mux 120 - simplesocks (终端节点) 121 122 - 出站(链) 123 - freedom 124 125 注意,代理核心只从隧道构成的树的终端节点抽取流和包,并转送到唯一的出站上。多个终端节点的设计的目的,是使Trojan-Go同时兼容Websocket和Trojan协议入站连接,开启/未开启Mux的入站连接,以及HTTP/Socks5自动识别的功能。每个拥有多个儿子的树上节点,具有精确识别和分发流和包给不同的儿子节点的能力。这符合我们假定每个协议了解其上层承载协议的假设。