Files
v2ray_simple/proxy/doc.go
T

115 lines
5.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*Package proxy defines necessary components for proxy.
Layer Definition
目前认为,一个传输过程由四个部分组成,基础连接(udp/tcp),TLS(可选),中间层(ws、grpc、http等,可选),具体协议(socks5vlesstrojan等).
其中,ws和grpc被认为是 高级应用层,http(伪装)属于低级应用层.
TLS - Transport Layer Security 顾名思义TLS作用于传输层,第四层,但是我们tcp也是第四层,所以在本项目中,认为不需要“会话层”,单独加一个专用于tls的层比较稳妥.
正常OSI是7层,我们在这里规定一个 第八层和第九层,第八层就是 vless协议所在位置,第九层就是我们实际传输的承载数据.
New Model - VSI 新的VSI 模型
那么我们提出一个 verysimple Interconnection Model 简称vsi模型。1到4层与OSI相同(物理、链路、网络、传输).
把第五层替换成“加密层”,把TLS放进去;把第六层改为低级应用层,http属于这一层.
第七层 改为高级应用层,ws/grpc 属于这一层, 简称高级层;第八层定为 代理层,vless/trojan 在这层.
第九层为 承载数据层,承载的为 另一大串 第四层的数据.
那么我们verysimple实际上就是 基于 “层” 的架构,或称 可分层结构.
9 client real tcp data
----------------------------------------
8 vless/trojan/socks5
----------------------------------------
7 ws/grpc/quic
----------------------------------------
6 http (headers)
----------------------------------------
5 tls
----------------------------------------
4 tcp/udp/unix domain socket
----------------------------------------
基本上5-8层都是可控的.第四层也可以给出一些参数进行控制,比如在tproxy时。
实际上quic属于一种超级协议,横跨传输层一直到高级层,不过为了分类方便,这里认为它也是一种 高级层.
也就是说,如果遇到横跨多个层的协议,我们认为它属于其中最高的层级。
对应的理想配置文件应该如下.
{
"layer5_settings": { //或者叫 tls_settings
"tls":{"insecure": true},
"utls":{}
},
"layer6_settings": { //或者叫 http_settings
"headers":{}
},
"layer7_settings": { //或者叫 advancedLayer_settings
"ws":{}
},
"layer8_settings": { //或者叫 proxy_settings
"vless":{}
"trojan":{}
},
}
我们项目的文件夹,netLayer 第3,4层,tlsLayer文件夹代表第5层; httpLayer第六层,
ws和grpc文件夹(第七层)proxy文件夹代表第8层.
同级的ws和grpc是独占的,可以都放到一个layer里,然后比如第八层配置了一个vless一个trojan,那么排列组合就是4种,vless+ws, vless+ grpc, trojan+ws, trojan+grpc.
这就大大减轻了各种”一键脚本“的 使用需求,咱们只要选择自己喜欢的各个层,程序自动就为我们生成所有配置.
运行时,如果所有配置都要有,那么就需要多种端口;共用端口的话可以用nginx.
也可以程序指定一种 特定的情况,比如开始运行程序时,冒出交互界面,自己按项选择好后,就自动运行,然后自动生成客户端分享url.
可以在脑海里想象 “穿鞋带” 的画面,有很多洞可以经过,都穿好了,鞋带就系好了。或者手机手势解锁的情况.
这种好处是,每次运行都可以采用不同的配置,不同的uuid,手机一扫码就能连上.
然而,这种“高级模式”是不容易实现,也不好理解的,目前初始阶段先不考虑。
目前的标准模式的配置文件中,整个一个节点的配置完全是扁平化的,所有的层的配置都会在同一级别中。比如tls的配置完全和节点本身的配置放在一起。总之我的思路就是,要不就完全扁平化,要不就完全分层。
本作认为,所有的代理是都可以有tls层,http层和ws/grpc层的,所以就统一嵌入所有的代理协议的配置当中,直接扁平化了.
Contents of proxy package - proxy包内容
接口 ProxyCommon 和 结构 ProxyCommonStruct 给 这个架构定义了标准.
而 Client 和 Server 接口 是 具体利用该架构的 客户端 和 服务端,都位于VSI中的第八层.
使用 RegisterClient 和 RegisterServer 来注册新的实现.
还定义了关于udp 转发到机制,该部分直接参考 各个UDP开头的 部分即可.
Server and Client
我们服务端和 客户端的程序,都是有至少一个入口和一个出口的。入口我们叫做 inServer ,出口我们叫做 outClient.
这两个词的含义和 v2ray的 inbound 和 outbound 是等价的.
在 inServer 中,我们负责监听未知连接;在 outClient 中,我们负责拨号特定目标服务器.
可以用 两种Creator来创建Server和Client.
CreateClientFromMap 和 CreateClientFromURL 实际上是等价的, FromMap 专门支持从json, toml等配置文件中加载.
而且一般来说URL只适用于简单配置,复杂的配置还是要使用到map.
*/
package proxy