46个版本
0.8.0-alpha.5 | 2023年10月17日 |
---|---|
0.8.0-alpha.4 | 2023年2月9日 |
0.7.0 | 2022年10月29日 |
0.6.0-alpha.11 | 2022年5月27日 |
0.1.2 | 2021年3月2日 |
#910 in 网络编程
130,806 每月下载
在 snocat-cli 中使用
340KB
9K SLoC
SNOCAT
流式网络覆盖连接仲裁隧道
snocat
是一个框架,用于在经过身份验证和加密的 QUIC 隧道中转发流,从隧道聚合器到动态客户端集合。
与VPN不同,VPN的扩展性是随着连接到同一网络的用户数量垂直扩展的,而 snocat
意图是在网络数量上水平扩展,允许动态配置和选择目标网络,每个目标网络有少量并发用户。
用法
⚠️ 此库正在积极开发中,其API和协议非常不稳定
libsnocat
允许在 snocat
协议之上创建自定义 服务器 和 客户端 应用程序。
这比通过 snocat-cli
可行的配置性和可扩展性更高。
自定义服务器
要创建一个服务器
- 创建一个
quinn
监听端点,称为其driver
- 实现一个
TunnelManager
- 不一定是TCP,你可以转发你想要的任何内容!
- 实现一个 AuthenticationHandler
- 实现一个 Router
- 在您的管理器上实例化一个
TunnelServer
- 由于编写不涉及生命周期或并行性问题的高复杂度
TunnelServer
,我们包含了一个完全异步、面向流的实现,ConcurrentDeferredTunnelServer
,但您可以根据需要构建自己的。
- 由于编写不涉及生命周期或并行性问题的高复杂度
- 将连接转发到您的服务器,并等待优雅关闭
服务器生命周期是流导向的,使用从传入连接到连接事件输出的单子流。
Sync
特性对象充当到各种功能的调度器,依赖于内部可变性来处理调度器中的任何状态更新。
自定义客户端
创建一个客户端
- 创建一个到您的服务器
driver
的quinn
连接 - 实现一个
AuthenticationClient
- 实现一个
RoutingClient
- 将连接从连接转发到您的
RoutingClient
,并等待优雅关闭或quinn::endpoint::Endpoint::wait_idle
。
认证层
认证通过实现认证器的客户端和服务器部分来处理。
AuthenticationHandler
特性执行服务器端认证,而匹配的 AuthenticationClient
特性由客户端调用。
未来计划允许“按名称”调度到认证器,允许在服务器或客户端中注册多个,以便客户端和服务器可以协商兼容的认证方法。
认证提供一个单一、可靠有序的双向流,任一方都可以在任何时候关闭通道以中断认证。
路由层
Routing
是一个术语,用于描述客户端处理服务器提供的流,或服务器处理客户端提供的流。
路由器接收一个流头和路由标识符。如果路由器不识别流头的类型标识,它可以拒绝流,这会使提供方负责关闭流。
流是双向的,一个典型的例子是 snocat-cli
的 TCP 流,它接受一个目标端口,并通过 TCP 将流转发到该端口的 localhost
。
协议
协议的详细信息将在其稳定后发布在 docs/Protocol.md。
开发
对于调试使用,支持 SSLKEYLOGFILE
和 RUST_LOG
参数。
SSLKEYLOGFILE
允许通过 Wireshark TLS 解密和 QUIC 解剖进行拦截。
例如,可以使用以下命令行进行 snocat-cli
调试
SSLKEYLOGFILE=~/keylog.ssl.txt RUST_LOG="trace,quinn=warn,quinn_proto=warn" \
cargo run -- client --authority $SERVER_CERT \
--driver localhost:9090 \
--target $TARGET \
--san localhost
有关进一步开发和贡献指南,请参阅官方项目存储库中的 CONTRIBUTING.md。
第三方依赖
主要使用的 crate 包括用于异步等待能力的 Tokio 堆栈 和 futures-rs,以及用于其 QUIC 实现的 Quinn。
其他各种依赖项在各自的许可证下包括在内,可以在 Cargo.toml 中找到。
依赖项中值得注意的例外是以下 crate 的 MIT 或 MIT OR Apache 2.0 许可证
ring
用于 TLS,在 BoringSSL 变体下分发,采用 ISC-style 宽容许可untrusted
是ring
解析 TLS 所必需的,采用 ISC-style 宽容许可协议发行webpki
用于 TLS WebPKI 证书处理,采用 ISC-style 宽容许可协议发行memchr
、byteorder
、regex-automata
采用 Unlicense OR MIT 许可协议prost
、prost-types
、prost-derive
和prost-build
仅采用 Apache-2.0 许可协议ryu
是由serde_json
用于从 JSON 解析浮点数的必需库,采用 Apache-2.0 或 BSL-1.0 许可协议
有关各个包的许可协议细节以及它们项目网页的链接,请参阅 NOTICE.md。
商标
本项目可能包含项目、产品或服务的商标或标志。Microsoft 商标或标志的授权使用必须遵循 Microsoft 的商标和品牌指南。在修改后的本项目中使用 Microsoft 商标或标志时,不得造成混淆或暗示 Microsoft 的赞助。任何使用第三方商标或标志的行为均受第三方政策的约束。
行为准则
本项目已采用 Microsoft 开源行为准则。有关更多信息,请参阅 行为准则常见问题解答 或联系 [email protected] 以提出任何额外的问题或评论。
许可协议
版权所有(c)微软公司。保留所有权利。
许可协议为以下之一
- Apache 许可协议 2.0(《LICENSE-APACHE》或 http://www.apache.org/licenses/LICENSE-2.0》)
- MIT 许可协议(《LICENSE-MIT》或 http://opensource.org/licenses/MIT》)
由您选择。
贡献
根据贡献者许可协议,任何有意提交并包含在本工作中的贡献(根据 Apache-2.0 许可协议定义),将按照上述协议双许可,不附加任何额外条款或条件。
依赖关系
~15–30MB
~500K SLoC