[TCPトンネリング] boreで簡単にセルフホスティング
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!
アクセスできました。