A modern, simple TCP tunnel in Rust that exposes local ports to a remote server, bypassing standard NAT connection firewalls. That's all it does: no more, and no less.
# Installation (requires Rust, see alternatives below)
cargo install bore-cli
# On your local machine
bore local 8000 --to bore.pub
This will expose your local port at localhost:8000
to the public internet at bore.pub:<PORT>
, where the port number is assigned randomly.
Similar to localtunnel and ngrok, except bore
is intended to be a highly efficient, unopinionated tool for forwarding TCP traffic that is simple to install and easy to self-host, with no frills attached.
(bore
totals about 400 lines of safe, async Rust code and is trivial to set up — just run a single binary for the client and server.)
If you're on macOS, bore
is packaged as a Homebrew core formula.
brew install bore-cli
Otherwise, the easiest way to install bore is from prebuilt binaries. These are available on the releases page for macOS, Windows, and Linux. Just unzip the appropriate file for your platform and move the bore
executable into a folder on your PATH.
You also can build bore
from source using Cargo, the Rust package manager. This command installs the bore
binary at a user-accessible path.
cargo install bore-cli
We also publish versioned Docker images for each release. The image is built for an AMD 64-bit architecture. They're tagged with the specific version and allow you to run the statically-linked bore
binary from a minimal "scratch" container.
docker run -it --init --rm --network host ekzhang/bore <ARGS>
This section describes detailed usage for the bore
CLI command.
You can forward a port on your local machine by using the bore local
command. This takes a positional argument, the local port to forward, as well as a mandatory --to
option, which specifies the address of the remote server.
bore local 5000 --to bore.pub
You can optionally pass in a --port
option to pick a specific port on the remote to expose, although the command will fail if this port is not available. Also, passing --local-host
allows you to expose a different host on your local area network besides the loopback address localhost
.
The full options are shown below.
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,