はじめに
Raspberry Piを使っているとローカルに立てたサーバーやポートをネットワーク外から参照したいと思うことがあるのですが、これまではngrokなどを活用してweb上から参照したりしていました。
Tunnlleto(作者のリポジトリ)はオープンソースソフトウェア(MIT)として開発されているRust製のトンネリングツールです。
(技術的な仕様の違いとして、インストールしたPC自体にサーバを立ててる?)
TCPやhttpでの通信をしているポートを指定して外部に公開できます。
環境
- Raspberry Pi 3B+/4B (Raspbian GNU/Linux 10 (buster) armv7l )
- cargo (Rustのビルドツール兼パッケージマネージャー)
$ cargo -V
cargo 1.50.0 (f04e7fab7 2021-02-04)
構築
まずはcargoを入れましょう。
rustup
のインストールと同時に入ります。(公式)
大変時間がかかるのでしばらく待ちましょう。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
入れた後に~/.bachrc
に
export PATH=$PATH:$HOME/.cargo/bin
source "$HOME/.cargo/env"
を雑に追記しました。(sourceで変数の保持をするのって本来の用途からするとどうなんだろう...ここ相談乗って欲しい)
次に、
$ cargo install tunnelto
してTunnelto
をインストールします。
$ tunnelto --help
でオプションの確認ができればインストールできています。
ちなみにLinux向けにアーカイブファイルがリリースされているのですが、バイナリ版だと動いてくれなかったので(armだから?)、cargoを使ってインストールしました。
issueにもRaspi4にUbuntuを入れて運用しているユーザーからもrustup
して入れてねと情報が寄せられていました。
使用する
ss
やnetstat
で外部にトンネリングしたいポートを探して、tunnelto --port 4000
すると、
$ tunnelto --port 4000
%%%%
%%%%
,,,,,,,,,,,,,,
%% ,,,%%%%%%%%%%%%%,,,
#%% ,,%%%%%,,,,,#%%%%,,
,,,,,,#%%,,,,,,, ((
.%%%#%%%%#%
%%%%#
%(%
(%%%(
(( (%%%#%%%%#
,,,,,,,,,,,,,,, %%%
,,%%%%%%,,,#%%%%%,,
%% ,,,%%%%%%%%%%%%%,,,
%%% ,,,,,,,,,,,,,,,
⣷ Success! Remote tunnel created on: https://{yourHost}.tunnelto.dev
=> Forwarding to localhost:4000
Local Inspect Dashboard: http://localhost:XXXXX
と出力され、下部にリクエストとレスポンスが記載されていきます。
{yourHost}を含んだURLが外部トンネリング可能なリンクとなります。
Ctrl+Cで停止します。
通信の保持について
多くの場合Raspberry Piにはsshでアクセスしていることと思いますが、 Tonneltoを動かした状態でexit
(セッションを終了)すると同時にプロセスが落ちます。
そこで私の場合はtmux
で立ち上げてデタッチ後exit
してTunneltoをssh終了後も動かし続けました。
ただしこれは私の理解の浅いところで、しばらくするとセッションが切れてしまうので、Tonneltoとtmuxの仕様の両方の面をもっと勉強してみる必要があります。
通常起動後にバックグラウンドプロセスに送ってみることも試しましたが、こちらはexit
後すぐにトンネリングが切れてしまいました。
公式サイトへの登録で先行サービスのngrokのようにwebサービス上でのステータスが確認しやすくなるのかは追って確認していきます。
なお、サブドメインを立てる値段は$2/monthらしいので競合より安いみたいですね。
その他
mac版はbrewでも入るそうで、一層かんたんに導入できますね。
私の場合はDockerでポート3000に立てたGrafanaを外部公開する目的でTunneltoを使いました。
ngrokではサーバーの立ち上げ後
curl localhost:80/api/tunnels
でpublicに公開されているURLを取得してこれるのですが、Tunneltoにはこの機能はまだありません。
ポートの公開開始時にSuccess! Remote tunnel created on: ~~
が表示されるのにコンソール上のプログレス表示を伴うので、nohup
などで出力すると肝心のURLが標準出力として吐き出されないという困った点があります(これもあって前述のtmuxなどを使った)
これについても何か対応したいとのコメントがissueにありました。
リンク
agrinman/tunnelto(Github)
Tunnel to dev(サービス版公式サイト)