[TCPトンネリング] boreで簡単にセルフホスティング

2022.04.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Introduction

boreとは、TCPトンネリングを用いて
ローカルサーバーを外部向けに公開できるRustで実装されたツールです。
標準的なNAT接続のファイアウォールをバイパスし、
ローカルポートをリモートサーバに公開するTCPトンネルです。
似たようなツールではngrokがあります。  

開発時に、外部サービスのWeb hook機能をテストしたいときなどに便利です。

boreでは、ローカルポートを公開する際にデフォルトのbore.pubドメインだけでなく
自分でホスティングしたサーバ経由でも公開が簡単にできます。

Environment

以下の環境で試しました。
boreはRustのバイナリクレートとして公開されているので、
Rustの環境が必要です。
※ Rustの環境構築についてはこのへん を参照

  • MacBook Pro (13-inch, M1, 2020)
  • OS : MacOS 11.3.1
  • rustup : 1.24.3

Try bore

ローカルポートをbore.pubで公開する

まずはcargoでboreのインストールをします。

% cargo install bore-cli

% bore --version
bore-cli 0.2.3

適当なhttpサーバプログラムを用意します。
ここではnodeを使って4000番ポートで起動するhttpサーバを用意。

// main.js
const http = require("http");
const port = 4000;

const server = http.createServer((request, response) => {
    response.writeHead(200, {
      "Content-Type": "text/html"
    });

    const responseMessage = "hello from bore!";
    response.end(responseMessage);
});

server.listen(port);
console.log(`listening on port: ${port}`);

起動させておきます。

% node main.js
listening on port: 4000

そしてboreを起動。
toオプションではトンネリングするサーバを指定します。
(ここではboreデフォルトのbore.pub)

% bore local 4000 --to bore.pub
2022-04-13T08:33:04.629884Z  INFO bore_cli::client: connected to server remote_port=37687
2022-04-13T08:33:04.629956Z  INFO bore_cli::client: listening at bore.pub:37687

リモートポートとして37687番で起動しています。

http://bore.pub:37687
にアクセスすると、ローカルとおなじようにレスポンスが返ってきます。

boreを使ってセルフホスティング

簡単にローカルポートの公開ができましたが、 
誰でもアクセスできるサーバでトンネリングするのは不安があるかもしれません。
boreでは簡単にトンネリングサーバを構築できます。

今回はEC2インスタンスを起動してそこにトンネリングサーバを用意しましょう。
AWSコンソールからEC2インスタンスを起動したら、sshでログインします。

まずはgccとRust環境をインストール。

% sudo yum install -y gcc
% curl https://sh.rustup.rs -sSf | sh

Rustがインストールできたら、先程と同じくboreをインストール。

% source $HOME/.cargo/env
% cargo install bore-cli

今度はboreをserverモードで起動します。
secretオプションは、認証用の文字列です。
ローカル側で起動したboreでも同じ文字列を指定して認証する必要があります。

% bore server --secret <認証用文字列>
2022-04-14T07:03:09.296697Z  INFO bore_cli::server: server listening addr=0.0.0.0:7835

サーバ側では7835番のポートで起動しました。
なので、セキュリティグループの7835番をあけましょう。

次にローカルでboreを起動します。
toではEC2の公開IPアドレスを指定し、
secretではサーバ側で指定したものと同じ文字列を指定します。

% bore local 4000 --to <EC2のpublic ip> --secret <認証用文字列>
2022-04-14T07:32:10.316721Z  INFO bore_cli::client: connected to server remote_port=42507
2022-04-14T07:32:10.316833Z  INFO bore_cli::client: listening at x.x.x.x:42507

リモートポートが42507番で起動したので、
セキュリティグループの42507番をあけます。

% curl http://<EC2のpublic ip>:42507
hello from bore!

アクセスできました。  

References