
Rustで書かれたシンプルなTCPトンネル。ローカルポートをリモートサーバーに公開し、NATファイアウォールをバイパスします。軽量で自己ホスト可能、インストールも簡単です。
Rust で書かれた、モダンでシンプルな TCP トンネル。ローカルポートをリモートサーバーに公開し、標準的な NAT 接続ファイアウォールをバイパスします。これだけです。それ以上でもそれ以下でもありません。

# Installation (requires Rust, see alternatives below)
cargo install bore-cli
# On your local machine
bore local 8000 --to bore.pub
これにより、ローカルポート localhost:8000 が、公開インターネット上の bore.pub:<PORT> に公開されます(ポート番号はランダムに割り当てられます)。
localtunnel や ngrok と似ていますが、bore は非常に効率的で、TCP トラフィックを転送するための意見を持たないツールで、インストールが簡単でセルフホストも容易、余計な機能は一切ありません。
(bore は安全で非同期な Rust コード約400行で構成され、セットアップはクライアントとサーバーのバイナリを1つ実行するだけと非常に簡単です。)
bore は Homebrew の core formula としてパッケージ化されています。
brew install bore-cli
bore は AUR で bore として入手可能です。
yay -S bore # or your favorite AUR helper
bore は gentoo-zh オーバーレイで入手可能です。
sudo eselect repository enable gentoo-zh
sudo emerge --sync gentoo-zh
sudo emerge net-proxy/bore
それ以外の場合、bore をインストールする最も簡単な方法は、ビルド済みバイナリを使用することです。これらは macOS、Windows、Linux 向けに リリースページ で入手できます。お使いのプラットフォームに適したファイルを解凍し、bore 実行ファイルを PATH 上のフォルダに移動するだけです。
Rust パッケージマネージャーである Cargo を使用して、ソースから bore をビルドすることもできます。このコマンドは、ユーザーがアクセス可能なパスに bore バイナリをインストールします。
cargo install bore-cli
各リリースごとにバージョン管理された Docker イメージも公開しています。イメージは AMD 64 ビットアーキテクチャ向けにビルドされています。特定のバージョンでタグ付けされており、最小限の "scratch" コンテナから静的リンクされた bore バイナリを実行できます。
docker run -it --init --rm --network host ekzhang/bore <ARGS>
このセクションでは、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 <TO> <LOCAL_PORT>
Arguments:
<LOCAL_PORT> The local port to expose [env: BORE_LOCAL_PORT=]
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, --help Print help
起動手順で述べたように、bore.pub で公開インスタンスが稼働しています。ただし、自身のネットワークで bore をセルフホストしたい場合は、次のコマンドで実行できます。
bore server
これだけです!サーバーが特定のアドレスで起動したら、bore local コマンドに --to <ADDRESS> オプションを指定して、ローカルポートをこのリモートサーバーに転送できます。
制御サーバーとトンネルに異なる IP アドレスを指定することも可能です。この設定は、制御サーバーをプライベートネットワークに置き、トンネル接続をパブリックインターフェース経由で許可したい場合や、その逆の場合に便利です。
bore server コマンドの完全なオプションは以下に示します。
Runs the remote proxy server
Usage: bore server [OPTIONS]
Options:
--min-port <MIN_PORT> Minimum accepted TCP port number [env: BORE_MIN_PORT=] [default: 1024]
--max-port <MAX_PORT> Maximum accepted TCP port number [env: BORE_MAX_PORT=] [default: 65535]
-s, --secret <SECRET> Optional secret for authentication [env: BORE_SECRET]
--bind-addr <BIND_ADDR> IP address to bind to, clients must reach this [default: 0.0.0.0]
--bind-tunnels <BIND_TUNNELS> IP address where tunnels will listen on, defaults to --bind-addr
-h, --help Print help
暗黙の 制御ポート が 7835 に存在し、オンデマンドで新しい接続を作成するために使用されます。初期化時に、クライアントは TCP 制御ポートを介してサーバーに "Hello" メッセージを送信し、選択したリモートポートのプロキシを要求します。サーバーは確認応答を返し、外部 TCP 接続のリッスンを開始します。
サーバーがリモートポートで接続を取得すると、その接続に対して安全な UUID を生成し、クライアントに送り返します。クライアントはサーバーに別の TCP ストリームを開き、そのストリーム上で UUID を含む "Accept" メッセージを送信します。サーバーはその後、2つの接続を互いにプロキシします。
正確性の理由とメモリリークを避けるため、着信接続はサーバーによって最大10秒間保存され、クライアントが受け入れない場合は破棄されます。
bore server のカスタムデプロイメントでは、オプションで シークレット を要求して、サーバーが他の人に使用されるのを防ぐことができます。プロトコルでは、クライアントが HMAC コードの形式でランダムなチャレンジに応答することにより、各 TCP 接続でシークレットの保持を確認する必要があります。(このシークレットは初期ハンドシェイクにのみ使用され、デフォルトではそれ以上のトラフィックは暗号化されません。)
# on the server
bore server --secret my_secret_string
# on the client
bore local <LOCAL_PORT> --to <TO> --secret my_secret_string
引数にシークレットが指定されていない場合、bore は BORE_SECRET 環境変数からの読み取りも試みます。
Eric Zhang (@ekzhang1) によって作成されました。 MIT ライセンス の下で提供されています。
著者は、Rust で人間工学に基づいた効率的なネットワークサービスを書くことを可能にしてくれた Tokio プロジェクトの貢献者とメンテナーに感謝します。