bore
Tunnel local services to the internet
TLDR
Expose a local port to a remote Bore server
Start a Bore server
Display help
SYNOPSIS
The bore command operates primarily in client and server modes.
Client mode: bore local [OPTIONS] <LOCAL_PORT>
bore local --to <HOST>:<PORT> [OPTIONS] <LOCAL_PORT>
Server mode: bore server [OPTIONS]
bore server --port <SERVER_PORT> [OPTIONS]
Additional subcommands include bore help and bore version.
PARAMETERS
local <LOCAL_PORT>
Starts the client, exposing a local service running on <LOCAL_PORT> to the remote server.
server
Starts the bore server daemon, listening for incoming client connections.
--to <HOST>:<PORT>
(Client) Specifies the address and port of the remote bore server to connect to.
--port <PORT>
(Client) Requests a specific public port on the remote server for the tunnel. If omitted, a random port is assigned.
(Server) Specifies the port the bore server will listen on. Default is 7878.
--auth <TOKEN>
(Client/Server) An authentication token for secure connections. Required if the server is configured with --auth.
--secret <TOKEN>
(Server) A secret key used to generate and validate authentication tokens for clients. Used in conjunction with --auth.
--json
Outputs logs and operational information in JSON format.
--verbose
Enables verbose logging for more detailed diagnostic output.
DESCRIPTION
bore is an open-source, self-hosted reverse proxy that enables secure and fast TCP tunneling from a public server to a local machine. Written in Rust for performance and reliability, it allows users to expose local services (like web servers, databases, or development environments) to the internet without complex network configurations. Unlike many proprietary tunneling services, bore emphasizes a straightforward, self-hostable model, giving users full control over their infrastructure. It's particularly useful for development purposes, demonstrating local applications, or accessing services behind firewalls or NAT. The command operates by establishing a persistent connection to a remote bore server, through which incoming connections are forwarded to a specified local port. This makes bore an excellent alternative to tools like ngrok for those who prefer an open-source and self-managed solution.
CAVEATS
bore primarily functions as a client-server pair, requiring a publicly accessible bore server instance to be running for tunneling to occur. While it offers an --auth mechanism, exposing local services to the internet always carries inherent security risks; ensure the exposed service is adequately secured. The availability of requested public ports on the remote server may be limited or blocked by network firewalls. bore is designed for TCP port forwarding and does not provide a full VPN solution, nor does it inherently encrypt all traffic unless underlying protocols (like HTTPS) are used.
INSTALLATION
bore can be installed via Cargo (Rust's package manager) using cargo install bore-cli. Pre-compiled binaries are also available for various platforms on its GitHub releases page.
TYPICAL WORKFLOW
First, a bore server must be run on a publicly accessible machine: bore server --port 7878. Then, from your local machine, expose a service: bore local 8000 --to <YOUR_SERVER_IP>:7878. The server will then assign a public URL or port to access your local service.
HISTORY
bore was created by Eric Zhang (ekzhang) and first appeared around late 2021 / early 2022. Developed using Rust, it quickly gained traction as a lightweight, performant, and self-hostable alternative to commercial tunneling services like ngrok or more complex ssh -R configurations. Its design prioritizes simplicity and ease of setup, making it popular among developers for quickly exposing local development servers or services to the public internet without relying on third-party infrastructure.