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
34KB
460 行
INFO:这是一个非官方仓库,它仅支持 IPv6 网络。
bore
使用 Rust 编写的现代简单 TCP 隧道,将本地端口暴露给远程服务器,绕过标准的 NAT 连接防火墙。 这就是它能做的:不多也不少。
# 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>
,端口号是随机分配的。
类似于 localtunnel 和 ngrok,但 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