#tcp-port #tcp #tcp-connection #tunnel #proxy-server #client-server #networking

bin+lib bore-cli

一个现代的、简单的Rust TCP隧道,将本地端口暴露给远程服务器,绕过标准的NAT连接防火墙

10个版本

0.5.1 2024年6月11日
0.5.0 2023年4月28日
0.4.1 2022年11月11日
0.4.0 2022年4月22日
0.1.1 2022年4月6日

#860网络编程

Download history • Rust 包仓库 180/week @ 2024-04-25 • Rust 包仓库 230/week @ 2024-05-02 • Rust 包仓库 227/week @ 2024-05-09 • Rust 包仓库 221/week @ 2024-05-16 • Rust 包仓库 400/week @ 2024-05-23 • Rust 包仓库 173/week @ 2024-05-30 • Rust 包仓库 351/week @ 2024-06-06 • Rust 包仓库 362/week @ 2024-06-13 • Rust 包仓库 148/week @ 2024-06-20 • Rust 包仓库 174/week @ 2024-06-27 • Rust 包仓库 206/week @ 2024-07-04 • Rust 包仓库 160/week @ 2024-07-11 • Rust 包仓库 131/week @ 2024-07-18 • Rust 包仓库 140/week @ 2024-07-25 • Rust 包仓库 119/week @ 2024-08-01 • Rust 包仓库 124/week @ 2024-08-08 • Rust 包仓库

每月540次下载

MIT 许可证

33KB
473 代码行

bore

Build status Crates.io

一个现代的、简单的Rust TCP隧道,将本地端口暴露给远程服务器,绕过标准的NAT连接防火墙。 它只做这些:不多也不少。

Video demo

# Installation (requires Rust, see alternatives below)
cargo install bore-cli

# On your local machine
bore local 8000 --to bore.pub

这将把你的本地端口在 localhost:8000 暴露给公网在 bore.pub:<PORT>,端口号随机分配。

类似于 localtunnelngrok,但 bore 旨在成为一个高效、无偏见的工具,用于转发TCP流量,易于安装和自托管,没有附加的装饰。

(bore 总共有大约400行安全、异步的Rust代码,设置非常简单——只需运行一个客户端和服务器的二进制文件即可。)

安装

如果你使用macOS,bore 以Homebrew核心公式打包。

brew install bore-cli

否则,安装bore最简单的方法是从预构建的二进制文件中安装。这些二进制文件可以在发布页面上找到,适用于macOS、Windows和Linux。只需解压缩适合您平台的文件,并将bore可执行文件移动到PATH上的文件夹即可。

您还可以使用Cargo(Rust包管理器)从源代码构建bore。此命令将bore二进制文件安装到用户可访问的路径。

cargo install bore-cli

我们还为每个发布版本发布有版本号的Docker镜像。镜像适用于AMD 64位架构。它们带有特定版本标签,允许您从最小“ scratch”容器中运行静态链接的bore二进制文件。

docker run -it --init --rm --network host ekzhang/bore <ARGS>

详细使用说明

本节介绍了 bore CLI 命令的详细用法。

本地转发

您可以使用 bore local 命令在本地机器上转发端口号。这需要一个位置参数,即要转发的本地端口号,以及一个必须的 --to 选项,用于指定远程服务器的地址。

bore local 5000 --to bore.pub

您可以可选地传递一个 --port 选项来选择要公开的远程端口号,尽管如果该端口不可用,则命令将失败。此外,传递 --local-host 允许您在本地局域网中公开一个不同于回环地址 localhost 的不同主机。

完整的选项如下所示。

Starts a local proxy to the remote server

Usage: bore local [OPTIONS] --to <TO> <LOCAL_PORT>

Arguments:
  <LOCAL_PORT>  The local port to expose

Options:
  -l, --local-host <HOST>  The local host to expose [default: localhost]
  -t, --to <TO>            Address of the remote server to expose local ports to [env: BORE_SERVER=]
  -p, --port <PORT>        Optional port on the remote server to select [default: 0]
  -s, --secret <SECRET>    Optional secret for authentication [env: BORE_SECRET]
  -h, --help               Print help information

自托管

如启动说明中所述,有一个公共的 bore 服务器实例正在运行,地址为 bore.pub。但是,如果您想在您的网络上自托管 bore,可以使用以下命令

bore server

就是这样!服务器在指定地址开始运行后,您可以将 bore local 命令与选项 --to <ADDRESS> 更新,以将本地端口号转发到该远程服务器。

下面显示了 bore server 命令的完整选项。

Runs the remote proxy server

Usage: bore server [OPTIONS]

Options:
      --min-port <MIN_PORT>  Minimum accepted TCP port number [default: 1024]
      --max-port <MAX_PORT>  Maximum accepted TCP port number [default: 65535]
  -s, --secret <SECRET>      Optional secret for authentication [env: BORE_SECRET]
  -h, --help                 Print help information

协议

7835 有一个隐含的 控制端口,用于按需创建新的连接。在初始化时,客户端向 TCP 控制端口上的服务器发送“Hello”消息,请求代理选定的远程端口号。然后服务器响应确认并开始监听外部 TCP 连接。

每当服务器在远程端口上获得连接时,它为该连接生成一个安全的 UUID,并将其发送回客户端。然后客户端打开一个单独的 TCP 流到服务器,并发送一个包含 UUID 的“Accept”消息。然后服务器在两者之间代理两个连接。

出于正确性和避免内存泄漏的原因,服务器仅在 10 秒内存储传入的连接,如果客户端不接受它们,则会丢弃。

身份验证

在自定义部署的 bore server 上,您可以可选地要求一个 密钥 以防止其他人使用服务器。该协议要求客户端通过回答随机挑战来验证对密钥的占有,这些挑战以 HMAC 代码的形式出现。(此密钥仅用于初始握手,默认情况下不会加密其他流量。)

# on the server
bore server --secret my_secret_string

# on the client
bore local <LOCAL_PORT> --to <TO> --secret my_secret_string

如果没有在参数中提供密钥,bore 还会尝试从 BORE_SECRET 环境变量中读取。

致谢

由 Eric Zhang 创建 (@ekzhang1)。许可协议为 MIT

作者感谢 Tokio 项目贡献者和维护者,使他们能够以舒适和高效的方式在 Rust 中编写网络服务。

依赖关系

约 10-20MB
约 273K SLoC