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

bin+lib borev6-cli

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

4 个版本

0.5.3 2023 年 7 月 31 日
0.5.2 2023 年 7 月 31 日
0.5.1 2023 年 7 月 31 日
0.5.0 2023 年 7 月 31 日

#18 in #tcp-port

MIT 许可证

34KB
460

INFO:这是一个非官方仓库,它仅支持 IPv6 网络。

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 上的文件夹中。

您还可以使用 Rust 包管理器 Cargo 从源代码构建 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

这就是全部!服务器在指定地址启动后,您可以使用带有选项 --to <ADDRESS>bore local 命令将本地端口转发到该远程服务器。

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 码的形式)来验证在每次 TCP 连接上拥有该秘密。(此秘密仅用于初始握手,默认情况下不会加密后续流量。)

# 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–24MB
~296K SLoC