ekzhang/bore
GitHub: ekzhang/bore
一个用 Rust 编写的轻量级 TCP 隧道工具,可将本地端口暴露到公网,轻松穿透 NAT 和防火墙限制。
Stars: 10904 | Forks: 474
# bore
[](https://github.com/ekzhang/bore/actions)
[](https://crates.io/crates/bore-cli)
一个现代、简单的 Rust TCP 隧道工具,可以将本地端口暴露给远程服务器,从而绕过标准的 NAT 连接防火墙。**这就是它的全部功能:不多也不少。**

```
# 安装(需要 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技术, 内网穿透, 反向代理, 可视化界面, 开源, 异步编程, 本地开发, 端口转发, 网络安全, 网络流量审计, 自托管, 请求拦截, 边界突破, 远程访问, 通知系统, 隐私保护, 隧道工具, 零配置