ekzhang/bore

GitHub: ekzhang/bore

一个用 Rust 编写的轻量级 TCP 隧道工具,可将本地端口暴露到公网,轻松穿透 NAT 和防火墙限制。

Stars: 10904 | Forks: 474

# bore [![构建状态](https://img.shields.io/github/actions/workflow/status/ekzhang/bore/ci.yml)](https://github.com/ekzhang/bore/actions) [![Crates.io](https://img.shields.io/crates/v/bore-cli.svg)](https://crates.io/crates/bore-cli) 一个现代、简单的 Rust TCP 隧道工具,可以将本地端口暴露给远程服务器,从而绕过标准的 NAT 连接防火墙。**这就是它的全部功能:不多也不少。** ![视频演示](https://i.imgur.com/vDeGsmx.gif) ``` # 安装(需要 Rust,见下方替代方案) cargo install bore-cli # 在本地机器上 bore local 8000 --to bore.pub ``` 这会将您的本地端口 `localhost:8000` 暴露到公共互联网上的 `bore.pub:`,其中端口号是随机分配的。 类似于 [localtunnel](https://github.com/localtunnel/localtunnel) 和 [ngrok](https://ngrok.io/),不同之处在于 `bore` 旨在成为一种高效、无偏见(unopinionated)的 TCP 流量转发工具,安装简单,易于自托管,没有任何花哨的功能。 (`bore` 总共约 400 行安全、异步的 Rust 代码,设置非常简单 —— 只需为客户端和服务器运行单个二进制文件。) ## 安装 ### macOS `bore` 已作为 Homebrew 核心公式打包。 ``` brew install bore-cli ``` ### Linux #### Arch Linux `bore` 可在 AUR 中以 `bore` 名称获取。 ``` yay -S bore # or your favorite AUR helper ``` #### Gentoo Linux `bore` 可在 [gentoo-zh](https://github.com/microcai/gentoo-zh) overlay 中获取。 ``` sudo eselect repository enable gentoo-zh sudo emerge --sync gentoo-zh sudo emerge net-proxy/bore ``` ### 二进制分发 否则,安装 bore 最简单的方法是使用预构建的二进制文件。这些文件可在 [发布页面](https://github.com/ekzhang/bore/releases) 上找到,适用于 macOS、Windows 和 Linux。只需解压适合您平台的文件,并将 `bore` 可执行文件移动到 PATH 中的文件夹即可。 ### Cargo 您也可以使用 Rust 包管理器 [Cargo](https://doc.rust-lang.org/cargo/) 从源代码构建 `bore`。此命令将 `bore` 二进制文件安装到用户可访问的路径。 ``` cargo install bore-cli ``` ### Docker 我们还为每个版本发布版本化的 Docker 镜像。该镜像专为 AMD 64 位架构构建。它们使用特定版本进行标记,并允许您从最小的“scratch”容器中运行静态链接的 `bore` 二进制文件。 ``` docker run -it --init --rm --network host ekzhang/bore ``` ## 详细用法 本节介绍 `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 Arguments: The local port to expose [env: BORE_LOCAL_PORT=] Options: -l, --local-host The local host to expose [default: localhost] -t, --to Address of the remote server to expose local ports to [env: BORE_SERVER=] -p, --port Optional port on the remote server to select [default: 0] -s, --secret Optional secret for authentication [env: BORE_SECRET] -h, --help Print help ``` ### 自托管 如启动说明所述,在 `bore.pub` 上运行着一个公共的 `bore` 服务器实例。但是,如果您想在自己的网络上自托管 `bore`,可以使用以下命令: ``` bore server ``` 就是这样!在服务器于给定地址启动运行后,您可以使用 `--to
` 选项更新 `bore local` 命令,以将本地端口转发到此远程服务器。 可以为控制服务器和隧道指定不同的 IP 地址。此设置适用于您可能希望控制服务器位于私有网络上,同时允许通过公共接口进行隧道连接的情况,反之亦然。 `bore server` 命令的完整选项如下所示。 ``` Runs the remote proxy server Usage: bore server [OPTIONS] Options: --min-port Minimum accepted TCP port number [env: BORE_MIN_PORT=] [default: 1024] --max-port Maximum accepted TCP port number [env: BORE_MAX_PORT=] [default: 65535] -s, --secret Optional secret for authentication [env: BORE_SECRET] --bind-addr IP address to bind to, clients must reach this [default: 0.0.0.0] --bind-tunnels IP address where tunnels will listen on, defaults to --bind-addr -h, --help Print help ``` ## 协议 在 `7835` 端口有一个隐式的 _控制端口_,用于按需创建新连接。在初始化时,客户端在 TCP 控制端口上向服务器发送“Hello”消息,请求代理选定的远程端口。然后服务器响应确认并开始监听外部 TCP 连接。 每当服务器在远程端口上获得连接时,它会为该连接生成一个安全的 [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) 并将其发送回客户端。然后客户端打开一个单独的 TCP 流连接到服务器,并在该流上发送包含 UUID 的“Accept”消息。之后,服务器在两个连接之间进行代理。 为了确保正确性并避免内存泄漏,如果客户端不接受传入连接,服务器仅将其存储最多 10 秒,之后将其丢弃。 ## 认证 在自定义部署的 `bore server` 上,您可以选择要求一个 _secret_(密钥),以防止他人使用该服务器。协议要求客户端通过以 HMAC 代码形式回答随机质询,在每个 TCP 连接上验证其拥有该密钥。(此密钥仅用于初始握手,默认情况下不对进一步的流量进行加密。) ``` # 在服务器上 bore server --secret my_secret_string # 在客户端上 bore local --to --secret my_secret_string ``` 如果参数中不存在密钥,`bore` 也将尝试从 `BORE_SECRET` 环境变量中读取。 ## 致谢 由 Eric Zhang ([@ekzhang1](https://twitter.com/ekzhang1)) 创建。根据 [MIT 许可证](LICENSE) 授权。 作者感谢 [Tokio](https://tokio.rs/) 项目的贡献者和维护者,是他们使得用 Rust 编写符合人体工程学且高效的网络服务成为可能。
标签:CLI, NAT 穿透, ngrok 替代, Rust, TCP 隧道, WiFi技术, 内网穿透, 反向代理, 可视化界面, 开源, 异步编程, 本地开发, 端口转发, 网络安全, 网络流量审计, 自托管, 请求拦截, 边界突破, 远程访问, 通知系统, 隐私保护, 隧道工具, 零配置