#tunnel #connection #stream #quic #numbers #streaming #target

nightly snocat

流式网络覆盖连接仲裁隧道

46个版本

0.8.0-alpha.52023年10月17日
0.8.0-alpha.42023年2月9日
0.7.0 2022年10月29日
0.6.0-alpha.112022年5月27日
0.1.2 2021年3月2日

#910 in 网络编程

Download history 38975/week @ 2024-03-14 37217/week @ 2024-03-21 48483/week @ 2024-03-28 41749/week @ 2024-04-04 45375/week @ 2024-04-11 47697/week @ 2024-04-18 42862/week @ 2024-04-25 37665/week @ 2024-05-02 41512/week @ 2024-05-09 40508/week @ 2024-05-16 31057/week @ 2024-05-23 31765/week @ 2024-05-30 30800/week @ 2024-06-06 33333/week @ 2024-06-13 31712/week @ 2024-06-20 30471/week @ 2024-06-27

130,806 每月下载
snocat-cli 中使用

MIT/Apache

340KB
9K SLoC

SNOCAT

流式网络覆盖连接仲裁隧道

Crates.io docs.rs License: MIT License: Apache 2.0

snocat 是一个框架,用于在经过身份验证和加密的 QUIC 隧道中转发流,从隧道聚合器到动态客户端集合。

与VPN不同,VPN的扩展性是随着连接到同一网络的用户数量垂直扩展的,而 snocat 意图是在网络数量上水平扩展,允许动态配置和选择目标网络,每个目标网络有少量并发用户。

用法

⚠️ 此库正在积极开发中,其API和协议非常不稳定

libsnocat 允许在 snocat 协议之上创建自定义 服务器客户端 应用程序。

这比通过 snocat-cli 可行的配置性和可扩展性更高。

自定义服务器

要创建一个服务器

  • 创建一个 quinn 监听端点,称为其 driver
  • 实现一个 TunnelManager
    • 不一定是TCP,你可以转发你想要的任何内容!
  • 实现一个 AuthenticationHandler
  • 实现一个 Router
  • 在您的管理器上实例化一个 TunnelServer
    • 由于编写不涉及生命周期或并行性问题的高复杂度 TunnelServer,我们包含了一个完全异步、面向流的实现,ConcurrentDeferredTunnelServer,但您可以根据需要构建自己的。
  • 将连接转发到您的服务器,并等待优雅关闭

服务器生命周期是流导向的,使用从传入连接到连接事件输出的单子流。

Sync 特性对象充当到各种功能的调度器,依赖于内部可变性来处理调度器中的任何状态更新。

自定义客户端

创建一个客户端

  • 创建一个到您的服务器 driverquinn 连接
  • 实现一个 AuthenticationClient
  • 实现一个 RoutingClient
  • 将连接从连接转发到您的 RoutingClient,并等待优雅关闭或 quinn::endpoint::Endpoint::wait_idle

认证层

认证通过实现认证器的客户端和服务器部分来处理。

AuthenticationHandler 特性执行服务器端认证,而匹配的 AuthenticationClient 特性由客户端调用。

未来计划允许“按名称”调度到认证器,允许在服务器或客户端中注册多个,以便客户端和服务器可以协商兼容的认证方法。

认证提供一个单一、可靠有序的双向流,任一方都可以在任何时候关闭通道以中断认证。

路由层

Routing 是一个术语,用于描述客户端处理服务器提供的流,或服务器处理客户端提供的流。

路由器接收一个流头和路由标识符。如果路由器不识别流头的类型标识,它可以拒绝流,这会使提供方负责关闭流。

流是双向的,一个典型的例子是 snocat-cli 的 TCP 流,它接受一个目标端口,并通过 TCP 将流转发到该端口的 localhost

协议

协议的详细信息将在其稳定后发布在 docs/Protocol.md


开发

对于调试使用,支持 SSLKEYLOGFILERUST_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 的 MITMIT OR Apache 2.0 许可证

  • ring 用于 TLS,在 BoringSSL 变体下分发,采用 ISC-style 宽容许可
  • untrustedring 解析 TLS 所必需的,采用 ISC-style 宽容许可协议发行
  • webpki 用于 TLS WebPKI 证书处理,采用 ISC-style 宽容许可协议发行
  • memchrbyteorderregex-automata 采用 Unlicense OR MIT 许可协议
  • prostprost-typesprost-deriveprost-build 仅采用 Apache-2.0 许可协议
  • ryu 是由 serde_json 用于从 JSON 解析浮点数的必需库,采用 Apache-2.0BSL-1.0 许可协议

有关各个包的许可协议细节以及它们项目网页的链接,请参阅 NOTICE.md

商标

本项目可能包含项目、产品或服务的商标或标志。Microsoft 商标或标志的授权使用必须遵循 Microsoft 的商标和品牌指南。在修改后的本项目中使用 Microsoft 商标或标志时,不得造成混淆或暗示 Microsoft 的赞助。任何使用第三方商标或标志的行为均受第三方政策的约束。

行为准则

本项目已采用 Microsoft 开源行为准则。有关更多信息,请参阅 行为准则常见问题解答 或联系 [email protected] 以提出任何额外的问题或评论。

许可协议

版权所有(c)微软公司。保留所有权利。

许可协议为以下之一

由您选择。

贡献

根据贡献者许可协议,任何有意提交并包含在本工作中的贡献(根据 Apache-2.0 许可协议定义),将按照上述协议双许可,不附加任何额外条款或条件。

依赖关系

~15–30MB
~500K SLoC