A modern, simple TCP tunnel in Rust that exposes local ports to a remote server, bypassing standard NAT connection firewalls

Overview

bore

Build status Crates.io

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.

Video demo

# Installation (requires Rust)
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:, 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 less than 300 lines of safe, async Rust code and is trivial to set up — just run a single binary for the client and server.)

Detailed Usage

This section describes detailed usage for the bore CLI command.

Local Forwarding

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.

The full options are shown below.

bore-local 0.1.0
Starts a local proxy to the remote server

USAGE:
    bore local [OPTIONS] --to <TO> <LOCAL_PORT>

ARGS:
    <LOCAL_PORT>    The local port to listen on

OPTIONS:
    -h, --help           Print help information
    -p, --port <PORT>    Optional port on the remote server to select [default: 0]
    -t, --to <TO>        Address of the remote server to expose local ports to
    -V, --version        Print version information

Self-Hosting

As mentioned in the startup instructions, there is an public instance of the bore server running at bore.pub. However, if you want to self-host bore on your own network, you can do so with the following command:

bore server

That's all it takes! After the server starts running at a given address, you can then update the bore local command with option --to

to forward a local port to this remote server.

The full options for the bore server command are shown below.

bore-server 0.1.0
Runs the remote proxy server

USAGE:
    bore server [OPTIONS]

OPTIONS:
    -h, --help                   Print help information
        --min-port <MIN_PORT>    Minimum TCP port number to accept [default: 1024]
    -V, --version                Print version information

Protocol

There is an implicit control port at 7835, used for creating new connections on demand. At initialization, the client sends a "Hello" message to the server on the TCP control port, asking to proxy a selected remote port. The server then responds with an acknowledgement and begins listening for external TCP connections.

Whenever the server obtains a connection on the remote port, it generates a secure UUID for that connection and sends it back to the client. The client then opens a separate TCP stream to the server and sends an "Accept" message containing the UUID on that stream. The server then proxies the two connections between each other.

For correctness reasons and to avoid memory leaks, incoming connections are only stored by the server for up to 10 seconds before being discarded if the client does not accept them.

Acknowledgements

Created by Eric Zhang (@ekzhang1). Licensed under the MIT license.

The author would like to thank the contributors and maintainers of the Tokio project for making it possible to write ergonomic and efficient network services in Rust.

Comments
  • Connection keeps closing

    Connection keeps closing

    I'm testing a neural network on google colab. I put the output through bore and it closes the connection every minute for some reason. It also sometimes just closes the tunnel without informing the user

    INFO proxy{id=0f4b7534-baa4-480e-b6c3-4993e9744751}: bore_cli::client: connection exited image

    opened by bropines 15
  • Add `scoop` under Installation instructions

    Add `scoop` under Installation instructions

    Hi,

    Thank you for making bore and also hosting the http://bore.pub service.

    I have packaged bore to be installable on Windows using the Scoop CLI installer and added it to my kulfi-scoop bucket.

    I was wondering if we could add that as one of the sources for installing bore on Windows?

    Thanks again!

    opened by Animesh-Ghosh 10
  • I could not figure out how to start a boron server on the local network with the selected address and port

    I could not figure out how to start a boron server on the local network with the selected address and port

    ~ % bore server 2022-09-16T17:46:16.464695Z INFO bore_cli::server: server listening addr=0.0.0.0:7835

    `~ % bore local 1234 --to 0.0.0.0:7835 Error: could not connect to 0.0.0.0:7835:7835

    Caused by: failed to lookup address information: nodename nor servname provided, or not known `

    opened by DmitrySorda 10
  • GitHub actions CI/CD releases

    GitHub actions CI/CD releases

    Adds CI and CD using GitHub releases. Closes #6

    Will create a new release when a new v* tag is pushed. You can see it here:

    https://github.com/praveenperera/bore/tree/github-actions-ci-cd

    opened by praveenperera 10
  • Add nix flake via NCI

    Add nix flake via NCI

    Added a nix flake which can be used to build, run and enter a development shell environment with all the needed dependencies.

    All the nix stuff are dynamically generated from the Cargo.toml so there shouldn't be any burden on future maintainers from this change.

    opened by Kranzes 6
  • Add a Dockerfile for building a container image

    Add a Dockerfile for building a container image

    Inspired by https://github.com/ekzhang/bore/issues/6#issuecomment-1094206675.

    Furthermore, It would be convenient to provide bore image in public registry (e.g. Docker Hub, Github Packages Registry) such that people can immediately pull and run it in cloud/container environments.

    Usage

    Build image

    $ docker build -t bore .
    

    Launch a container (e.g. a bore server)

    $ docker run bore --port 7835:7835 server
    2022-04-10T08:30:32.286590Z  INFO bore_cli::server: server listening addr=0.0.0.0:7835
    

    Image Size

    REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
    bore            latest    8f459317dfed   15 minutes ago   75.1MB
    
    opened by jihchi 6
  • Minimum port is ignored if port on local is 0

    Minimum port is ignored if port on local is 0

    Hello, I was trying to add option for max port however I discovered issue and wanted to discuss it before any action.

    When you set minimum port on server and the client send wanted port using -p option the server correctly check if it's in range or not.

    But when the port is set to 0 (or not given) by local the check is skipped because of condition:

    if port != 0 && port < self.min_port {
    

    Port is selected by TcpListener from tokio which is bypassing the setting.

    The simplest solution that came to my mind is to generate random port on server within given range so currently MIN_PORT and 65535

    What do you think?

    opened by BxOxSxS 5
  • installation via brew

    installation via brew

    Hello, I really love the project; Thanks for crafting it 🙂

    Is any chance to make it possible to install via brew?

    This will be helpful to reduce the installation friction, especially for non Rust developers.

    opened by Kikobeats 4
  • Support reading client/server secret from an environment variable

    Support reading client/server secret from an environment variable

    This PR adds env feature to clap for defining custom variables to read the values of --secret arguments from the environment.

    • BORE_SECRET: sets the client/server secret

    closes #17

    opened by orhun 4
  • Firewall/NGINX configuration on the server

    Firewall/NGINX configuration on the server

    Thanks so much for this wonderful tool, and for the excellent example of a simple and useful Rust codebase.

    I'm not totally familiar with how tunnels work, and so it may be that this is an easy question to answer: but how does one set this up when using a firewall (UFW) and NGINX on the server-side? Do I need to expose just the control port in the NGINX configuration, or will there be issues when attempting to open a new tunnel?

    Thanks again for the excellent software!

    opened by breezykermo 4
  • Compiling error: there is no argument named ...

    Compiling error: there is no argument named ...

    Compiling with cargo install bore-cli prints out a few there is no argument named errors. This is running on a fresh ubuntu (version 20.04) within a container, with only Rust installed.

    root@96d3d25c45a9:/# cargo install bore-cli
        Updating crates.io index
      Installing bore-cli v0.2.1
       Compiling libc v0.2.122
       Compiling proc-macro2 v1.0.37
       Compiling version_check v0.9.4
       Compiling unicode-xid v0.2.2
       Compiling autocfg v1.1.0
       Compiling cfg-if v1.0.0
       Compiling syn v1.0.91
       Compiling typenum v1.15.0
       Compiling memchr v2.4.1
       Compiling log v0.4.16
       Compiling lazy_static v1.4.0
       Compiling smallvec v1.8.0
       Compiling parking_lot_core v0.9.2
       Compiling serde_derive v1.0.136
       Compiling scopeguard v1.1.0
       Compiling cc v1.0.73
       Compiling serde v1.0.136
       Compiling subtle v2.4.1
       Compiling adler v1.0.2
       Compiling once_cell v1.10.0
       Compiling gimli v0.26.1
       Compiling serde_json v1.0.79
       Compiling hashbrown v0.11.2
       Compiling heck v0.4.0
       Compiling anyhow v1.0.56
       Compiling pin-project-lite v0.2.8
       Compiling rustc-demangle v0.1.21
       Compiling termcolor v1.1.3
       Compiling textwrap v0.15.0
       Compiling ansi_term v0.12.1
       Compiling bytes v1.1.0
       Compiling ryu v1.0.9
       Compiling strsim v0.10.0
       Compiling bitflags v1.3.2
       Compiling itoa v1.0.1
       Compiling cpufeatures v0.2.2
       Compiling hex v0.4.3
       Compiling tracing-core v0.1.24
       Compiling sharded-slab v0.1.4
       Compiling thread_local v1.1.4
       Compiling generic-array v0.14.5
       Compiling proc-macro-error-attr v1.0.4
       Compiling proc-macro-error v1.0.4
       Compiling lock_api v0.4.7
       Compiling miniz_oxide v0.4.4
       Compiling indexmap v1.8.1
       Compiling backtrace v0.3.64
       Compiling tracing-log v0.1.2
       Compiling tracing-subscriber v0.3.11
       Compiling object v0.27.1
       Compiling os_str_bytes v6.0.0
       Compiling quote v1.0.17
       Compiling num_cpus v1.13.1
       Compiling getrandom v0.2.6
       Compiling socket2 v0.4.4
       Compiling mio v0.8.2
       Compiling atty v0.2.14
       Compiling signal-hook-registry v1.4.0
       Compiling parking_lot v0.12.0
       Compiling addr2line v0.17.0
       Compiling dashmap v5.2.0
       Compiling block-buffer v0.10.2
       Compiling crypto-common v0.1.3
       Compiling digest v0.10.3
       Compiling sha2 v0.10.2
       Compiling hmac v0.12.1
       Compiling tracing-attributes v0.1.20
       Compiling clap_derive v3.1.7
       Compiling tokio-macros v1.7.0
       Compiling tokio v1.17.0
       Compiling tracing v0.1.33
       Compiling clap v3.1.8
       Compiling uuid v0.8.2
       Compiling bore-cli v0.2.1
    error: there is no argument named `message`
      --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/bore-cli-0.2.1/src/client.rs:47:73
       |
    47 |             Some(ServerMessage::Error(message)) => bail!("server error: {message}"),
       |                                                                         ^^^^^^^^^
    
    error: there is no argument named `to`
      --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/bore-cli-0.2.1/src/client.rs:55:29
       |
    55 |         info!("listening at {to}:{remote_port}");
       |                             ^^^^
    
    error: there is no argument named `remote_port`
      --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/bore-cli-0.2.1/src/client.rs:55:34
       |
    55 |         info!("listening at {to}:{remote_port}");
       |                                  ^^^^^^^^^^^^^
    
    error: there is no argument named `to`
       --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/bore-cli-0.2.1/src/client.rs:120:52
        |
    120 |     .with_context(|| format!("could not connect to {to}:{port}"))
        |                                                    ^^^^
    
    error: there is no argument named `port`
       --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/bore-cli-0.2.1/src/client.rs:120:57
        |
    120 |     .with_context(|| format!("could not connect to {to}:{port}"))
        |                                                         ^^^^^^
    
    error: could not compile `bore-cli` due to 5 previous errors
    warning: build failed, waiting for other jobs to finish...
    error: failed to compile `bore-cli v0.2.1`, intermediate artifacts can be found at `/tmp/cargo-installwbzfEn`
    
    Caused by:
      build failed
    
    opened by Ecoleaf1 4
  • tracing colors cannot be suppressed

    tracing colors cannot be suppressed

    I am running bore to expose local ports to a remote Windows server and it works quite well, thank you!

    The only annoyance I have noticed that log/tracing colors do not seem to be able to be turned off, which make the log files look funny when for example wrapping bore in WinSW (for running as a Windows service).

    image

    I tried NO_COLOR, that only affects the help colors; but that does not affect tracing: https://github.com/tokio-rs/tracing/issues/2388.

    Opening this issue to make you aware of that so it could be fixed when there is a fix in tokio tracing. :)

    opened by ciis0 1
  • Device or resource busy (os error 16)

    Device or resource busy (os error 16)

    It's a powerpc32 NAS. i cross compiled a static link bore for it.

    When run bore local 9090 --to bore.pub. The program exited with:

    Error: could not connect to bore.pub:7835
    
    Caused by:
        Device or resource busy (os error 16)
    

    Have tried my own server. Failed the same.

    maybe a memory issues?

    root@OpenWrt:/data# time -f "Maximum resident set size (kbytes): %Mkb" ./bore-
    s local 9090 --to bore.pub
    Error: could not connect to bore.pub:7835
    
    Caused by:
        Device or resource busy (os error 16)
    Command exited with non-zero status 1
    Maximum resident set size (kbytes): 10832kb
    

    while free tell me:

    root@OpenWrt:~# free -h
                  total        used        free      shared  buff/cache   available
    Mem:         251876      105792       22672       15704      123412       82060
    Swap:             0           0           0
    

    Also, i ran with strace:

    brk(NULL)                               = 0x10adb000
    brk(0x10adbe94)                         = 0x10adbe94
    uname({sysname="Linux", nodename="OpenWrt", ...}) = 0
    set_tid_address(0x10adb068)             = 14094
    set_robust_list(0x10adb070, 12)         = 0
    rt_sigaction(SIGRTMIN, {sa_handler=0x101b6d60, sa_mask=[], sa_flags=SA_SIGINFO}, NULL, 8) = 0
    rt_sigaction(SIGRT_1, {sa_handler=0x101b6e50, sa_mask=[], sa_flags=SA_RESTART|SA_SIGINFO}, NULL, 8) = 0
    rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
    ugetrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
    readlink("/proc/self/exe", "/data/bore-s", 4096) = 12
    brk(0x10afce94)                         = 0x10afce94
    brk(0x10afd000)                         = 0x10afd000
    mprotect(0x10336000, 106496, PROT_READ) = 0
    poll([{fd=0, events=0}, {fd=1, events=0}, {fd=2, events=0}], 3, 0) = 0 (Timeout)
    rt_sigaction(SIGPIPE, {sa_handler=SIG_IGN, sa_mask=[PIPE], sa_flags=SA_RESTART}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
    rt_sigaction(SIGSEGV, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
    rt_sigaction(SIGSEGV, {sa_handler=0x1018cd30, sa_mask=[], sa_flags=SA_ONSTACK|SA_SIGINFO}, NULL, 8) = 0
    rt_sigaction(SIGBUS, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
    rt_sigaction(SIGBUS, {sa_handler=0x1018cd30, sa_mask=[], sa_flags=SA_ONSTACK|SA_SIGINFO}, NULL, 8) = 0
    sigaltstack(NULL, {ss_sp=NULL, ss_flags=SS_DISABLE, ss_size=0}) = 0
    mmap2(NULL, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xb7c01000
    mprotect(0xb7c01000, 4096, PROT_NONE)   = 0
    sigaltstack({ss_sp=0xb7c02000, ss_flags=0, ss_size=16384}, NULL) = 0
    openat(AT_FDCWD, "/proc/self/maps", O_RDONLY|O_CLOEXEC) = 3
    ugetrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
    fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
    read(3, "00100000-00103000 r-xp 00000000 "..., 1024) = 478
    close(3)                                = 0
    sched_getaffinity(14094, 32, [0])       = 4
    getrandom("\xdf\xc5\x06\x68\xd3\xdf\x1a\xa4\xac\x73\x7e\x68\xf7\x02\xb8\xac", 16, GRND_NONBLOCK) = 16
    openat(AT_FDCWD, "/proc/self/cgroup", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
    read(3, "0::/services/dropbear/instance1\n", 8192) = 32
    read(3, "", 8192)                       = 0
    close(3)                                = 0
    sched_getaffinity(0, 128, [0])          = 4
    epoll_create1(EPOLL_CLOEXEC)            = 3
    eventfd2(0, EFD_CLOEXEC|EFD_NONBLOCK)   = 4
    epoll_ctl(3, EPOLL_CTL_ADD, 4, {EPOLLIN|EPOLLRDHUP|EPOLLET, {u32=0, u64=2147483648}}) = 0
    fcntl64(3, F_DUPFD_CLOEXEC, 3)          = 5
    clock_gettime64(CLOCK_MONOTONIC, {tv_sec=694316, tv_nsec=987092879}) = 0
    futex(0x10353c08, FUTEX_WAKE_PRIVATE, 2147483647) = 0
    mmap2(NULL, 2101248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xb7a00000
    mprotect(0xb7a01000, 2097152, PROT_READ|PROT_WRITE) = 0
    clone(child_stack=0xb7bffcd0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tid=[14095], tls=0xb7c07640, child_tidptr=0xb7c001d8) = 14095
    clock_gettime64(CLOCK_MONOTONIC, {tv_sec=694316, tv_nsec=990417119}) = 0
    mmap2(NULL, 2101248, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xb77ff000
    mprotect(0xb7800000, 2097152, PROT_READ|PROT_WRITE) = 0
    clone(child_stack=0xb79fecd0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tid=[14096], tls=0xb7a06640, child_tidptr=0xb79ff1d8) = 14096
    write(4, "\0\0\0\0\0\0\0\1", 8)         = 8
    futex(0x10adf144, FUTEX_WAIT_BITSET_PRIVATE, 0, NULL, FUTEX_BITSET_MATCH_ANY) = 0
    write(4, "\0\0\0\0\0\0\0\1", 8)         = 8
    futex(0x10adf238, FUTEX_WAKE_PRIVATE, 2147483647) = 0
    futex(0x10adf1c8, FUTEX_WAKE_PRIVATE, 1) = 1
    futex(0x10adf144, FUTEX_WAIT_BITSET_PRIVATE, 1, NULL, FUTEX_BITSET_MATCH_ANY) = 0
    futex(0xb79ff1d8, FUTEX_WAIT, 14096, NULL) = 0
    write(2, "Error: ", 7Error: )                  = 7
    write(2, "could not connect to bore.pub:78"..., 34could not connect to bore.pub:7835) = 34
    write(2, "\n\nCaused by:", 12
    
    Caused by:)          = 12
    write(2, "\n", 1
    )                       = 1
    write(2, "    ", 4    )                     = 4
    write(2, "Device or resource busy", 23Device or resource busy) = 23
    write(2, " (os error ", 11 (os error )             = 11
    write(2, "16", 216)                       = 2
    write(2, ")", 1))                        = 1
    write(2, "\n", 1
    )                       = 1
    sigaltstack({ss_sp=NULL, ss_flags=SS_DISABLE, ss_size=16384}, NULL) = 0
    munmap(0xb7c01000, 20480)               = 0
    exit_group(1)                           = ?
    +++ exited with 1 +++
    
    opened by shyn 0
  • Change server behavior when port by local is set to 0

    Change server behavior when port by local is set to 0

    Server will search for unused port within range of min_port and assign it to local If there is no available port it will throw an error

    Resolves #23 and gives easy way to implement max port which is my next plan

    I tested it on linux and windows and everything seems to work great. If the quality of the code needs to be tweaked feel free to tell me. I am quite new to rust. Unfortunately I'm going away for the weekend so most likely I will be able to do possible corrections on Monday or Tuesday

    opened by BxOxSxS 2
Releases(v0.4.1)
  • v0.4.1(Nov 11, 2022)

    This version adds the simple feature of reading the remote server address from the BORE_SERVER environment variable, rather than passing it in as the argument --to in the CLI.

    There were also minor chores: updated the dependencies, and the CLI has a slightly different look (less colors, more man page-like) due to using clap v4.

    image

    What's Changed

    • Support reading remote server address from an environment variable (#45) by @calfzhou in https://github.com/ekzhang/bore/pull/46

    New Contributors

    • @calfzhou made their first contribution in https://github.com/ekzhang/bore/pull/46

    Full Changelog: https://github.com/ekzhang/bore/compare/v0.4.0...v0.4.1

    Source code(tar.gz)
    Source code(zip)
    bore-v0.4.1-aarch64-apple-darwin.tar.gz(939.01 KB)
    bore-v0.4.1-arm-unknown-linux-gnueabi.tar.gz(1.76 MB)
    bore-v0.4.1-armv7-unknown-linux-gnueabihf.tar.gz(1.74 MB)
    bore-v0.4.1-i686-pc-windows-msvc.zip(612.43 KB)
    bore-v0.4.1-i686-unknown-linux-musl.tar.gz(1.97 MB)
    bore-v0.4.1-x86_64-apple-darwin.tar.gz(936.12 KB)
    bore-v0.4.1-x86_64-pc-windows-msvc.zip(650.26 KB)
    bore-v0.4.1-x86_64-unknown-linux-musl.tar.gz(1.84 MB)
  • v0.4.0(Apr 22, 2022)

    This release of bore finally distributes the CLI via prebuilt binaries! If you scroll down to the "Assets" attached to the release, you can now download bore and install instantly it by just adding a single file to your PATH. No need to build from source using Rust (cargo install) anymore. Big thanks to @praveenperera for making this happen.

    image

    This release also makes internal improvements, using the tokio-util codec library to avoid possibly unbounded memory usage if a malicious client were to stream arbitrarily long frames to the server.

    What's Changed

    • Fix Windows cargo test by @BxOxSxS in https://github.com/ekzhang/bore/pull/35
    • use framed codecs to avoid unbounded buffer by @cedric05 and @ekzhang in https://github.com/ekzhang/bore/pull/33
    • GitHub actions CI/CD releases by @praveenperera in https://github.com/ekzhang/bore/pull/10

    New Contributors

    • @BxOxSxS made their first contribution in https://github.com/ekzhang/bore/pull/35
    • @cedric05 made their first contribution in https://github.com/ekzhang/bore/pull/33
    • @praveenperera made their first contribution in https://github.com/ekzhang/bore/pull/10

    Full Changelog: https://github.com/ekzhang/bore/compare/v0.3.0...v0.4.0

    Source code(tar.gz)
    Source code(zip)
    bore-v0.4.0-aarch64-apple-darwin.tar.gz(846.90 KB)
    bore-v0.4.0-arm-unknown-linux-gnueabi.tar.gz(1.69 MB)
    bore-v0.4.0-armv7-unknown-linux-gnueabihf.tar.gz(1.67 MB)
    bore-v0.4.0-i686-pc-windows-msvc.zip(609.91 KB)
    bore-v0.4.0-i686-unknown-linux-musl.tar.gz(1.88 MB)
    bore-v0.4.0-x86_64-apple-darwin.tar.gz(893.07 KB)
    bore-v0.4.0-x86_64-pc-windows-msvc.zip(642.98 KB)
    bore-v0.4.0-x86_64-unknown-linux-musl.tar.gz(1.74 MB)
  • v0.3.0(Apr 14, 2022)

    This release makes it possible for bore to expose any address on your local area network, not just localhost. For example, if you have an ssh daemon running on a computer on your network at 192.168.0.22:22, then you could forward that using something like:

    bore local 22 --local-host 192.168.0.22 --to bore.pub
    

    Then, using the port returned, you could connect to your printer from the public Internet with ssh bore.pub:<PORT>.

    We also now allow the secret to be passed in via the BORE_SECRET environment variable, and the package has been updated to depend on a minimal set of features in tokio, which should make build times slightly shorter.

    Standalone binary builds are in development but not complete yet.

    What's Changed

    • Add a configuration to allow forward to a different local host by @antoniomika in https://github.com/ekzhang/bore/pull/15
    • Deps: minimize Tokio features by @Some-Dood in https://github.com/ekzhang/bore/pull/25
    • Support reading client/server secret from an environment variable by @orhun in https://github.com/ekzhang/bore/pull/18

    New Contributors

    • @antoniomika made their first contribution in https://github.com/ekzhang/bore/pull/15
    • @Some-Dood made their first contribution in https://github.com/ekzhang/bore/pull/25

    Full Changelog: https://github.com/ekzhang/bore/compare/v0.2.3...v0.3.0

    Source code(tar.gz)
    Source code(zip)
  • v0.2.3(Apr 11, 2022)

    This release makes it possible to run bore from a 6 MB Docker image using a single command.

    docker run -it --init --rm --network host ekzhang/bore <ARGS>
    

    The image is built for multiple platforms (amd64, arm64) and contains a single statically-linked binary executable. They're published on Docker Hub with version tags like ekzhang/bore:latest, ekzhang/bore:0.2, and ekzhang/bore:0.2.3.

    Releasing standalone binary builds is planned starting with bore v0.3.0.

    What's Changed

    • Minor grammar fix. by @arizzubair in https://github.com/ekzhang/bore/pull/5
    • Add a Dockerfile for building a container image by @jihchi in https://github.com/ekzhang/bore/pull/8

    New Contributors

    • @arizzubair made their first contribution in https://github.com/ekzhang/bore/pull/5
    • @jihchi made their first contribution in https://github.com/ekzhang/bore/pull/8

    Full Changelog: https://github.com/ekzhang/bore/compare/v0.2.1...v0.2.3

    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(Apr 9, 2022)

    What's Changed

    • Improve stability by exiting immediately on common errors by @ekzhang in https://github.com/ekzhang/bore/pull/2
    • Add LICENSE by @orhun in https://github.com/ekzhang/bore/pull/3
    • Add integration tests for auth and end-to-end proxying by @ekzhang in https://github.com/ekzhang/bore/pull/4

    New Contributors

    • @orhun made their first contribution in https://github.com/ekzhang/bore/pull/3

    Full Changelog: https://github.com/ekzhang/bore/compare/v0.2.0...v0.2.1

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Apr 8, 2022)

    What's Changed

    • Add optional secret for authenticating clients by @jtroo and @ekzhang in https://github.com/ekzhang/bore/pull/1
    • Better error messages for connection failures

    New Contributors

    • @jtroo made their first contribution in https://github.com/ekzhang/bore/pull/1

    Full Changelog: https://github.com/ekzhang/bore/compare/v0.1.1...v0.2.0

    Source code(tar.gz)
    Source code(zip)
Owner
Eric Zhang
Student at Harvard, competitive programmer, researcher in systems & programming languages. Previously @get-convex @jumptrading @scaleapi @NVIDIA.
Eric Zhang
Transforms UDP stream into (fake) TCP streams that can go through Layer 3 & Layer 4 (NAPT) firewalls/NATs.

Phantun A lightweight and fast UDP to TCP obfuscator. Table of Contents Phantun Latest release Overview Usage 1. Enable Kernel IP forwarding 2. Add re

Datong Sun 782 Dec 30, 2022
A multi-connection TCP reverse proxy server and client.

tprox A multi-connection TCP reverse proxy. The tprox server is able to proxy multiple incoming connections to the tprox client over a single TCP conn

Mohammed Ajmal Siddiqui 4 Sep 21, 2022
Tunnel TCP traffic through SOCKS5 or HTTP using a TUN interface.

tun2proxy Tunnel TCP traffic through SOCKS5 or HTTP on Linux. Authentication not yet supported. Error handling incomplete and too restrictive. Build C

B. Blechschmidt 34 Nov 29, 2022
Expose local age identities to remote machines via SSH

age-plugin-remote TBD Design Notes Proxy identities act as bearer tokens. A proxy identity is only "active" if the authority provides it when starting

null 6 Aug 19, 2022
Proxy sentry request to a sentry server using a tunnel/proxy endpoint

Sentry Tunnel This is a proxy that forwards tunneled sentry requests to the real sentry server. The implementation is based on the explanation provide

Paul FLORENCE 14 Dec 20, 2022
An asynchronous dumb exporter proxy for prometheus. This aggregates all the metrics and exposes as a single scrape endpoint.

A dumb light weight asynchronous exporter proxy This is a dumb lightweight asynchronous exporter proxy that will help to expose multiple application m

Dark streams 3 Dec 4, 2022
A fast and stable reverse proxy for NAT traversal, written in Rust

rathole A fast and stable reverse proxy for NAT traversal, written in Rust rathole, like frp, can help to expose the service on the device behind the

Yujia Qiao 4.6k Dec 30, 2022
Reliable p2p network connections in Rust with NAT traversal

Reliable p2p network connections in Rust with NAT traversal. One of the most needed libraries for any server-less / decentralised projects

MaidSafe-Archive 948 Dec 20, 2022
Reliable p2p network connections in Rust with NAT traversal

Reliable p2p network connections in Rust with NAT traversal. One of the most needed libraries for any server-less, decentralised project.

MaidSafe-Archive 948 Dec 20, 2022
Tiny CLI application in rust to scan ports from a given IP and find how many are open. You can also pass the amount of threads for that scan

Port Scanner A simple multi-threaded port scanner written in Rust. Usage Run the port scanner by providing the target IP address and optional flags. $

nicolas lopes 4 Aug 29, 2023
A simple tcp server that written in rustlang

rust_tcp A simple tcp server that written in rustlang How to build In the root dir cargo run Then you can do a test by using telnet as a client telne

null 1 Oct 25, 2021
An easy-to-use tunnel to localhost built in Rust. An alternative to ngrok and frp.

rslocal English | 中文 What is rslocal? Rslocal is like ngrok built in Rust, it builds a tunnel to localhost. Project status support http support tcp su

saltbo 220 Jan 7, 2023
A tcp proxy server/client which exchange the data in temp files

ftcp A tcp proxy server/client which exchange the data in temp files 通过在临时文件中交换数据来进行TCP代理的一个服务端/客户端 学校内网中有针对教学楼的防火墙导致教室电脑难以上网( 但学校内建有公共ftp服务器,因此就有了这个借

Daile Liu 2 Feb 17, 2022
Simple SSH, TELNET connection manager written in rust

gcoma gcoma or Geri's Connection Manager is a small project, that I started to learn rust. The goal of this project is to create a MTPuTTY like cli ap

Bak Gergely János 2 Sep 30, 2022
Send files over TCP. Quick and simple. Made in Rust.

SFT Multithreaded utility to send files over TCP. The sender writes a header containing the filename, and then the contents of the file, buffered, to

Orel 0 Dec 24, 2021
Simple utility to ping a TCP port.

TcpPing Simple utility to ping a TCP port. Example > tcpping 1.1.1.1 53 -b en0 -i 1 -t 4 Connected to 1.1.1.1:53 in 21 ms Connected to 1.1.1.1:53 in 3

null 11 Nov 24, 2022
A simple cross-platform remote file management tool to upload and download files over HTTP/S

A simple cross-platform remote file management tool to upload and download files over HTTP/S

sexnine 13 Dec 30, 2022
A generic Rust based Bigtable connection library implemented using gRPC

A generic Rust based Bigtable connection library refactored out the solana mono-repo so that can be shared for different applications.

Lijun Wang 3 Sep 25, 2022
Lightweight p2p library. Support build robust stable connection on p2p/distributed network.

Chamomile Build a robust stable connection on p2p network features Support build a robust stable connection between two peers on the p2p network. Supp

CympleTech 94 Jan 6, 2023