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 在 网络编程
每月540次下载
33KB
473 代码行
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上的文件夹即可。
您还可以使用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