この記事は公開されてから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!
アクセスできました。