脱Tor!寄り道編~ngrok便利すぎ~
前回までのあらすじ
自宅のラズパイ内で稼働するBTCPayを外部に公開する方法を模索し、ついにGCP上の無料マシン+独自ドメイン+ドメイン証明書+tailscale+リバースプロキシで実現しました。
意気揚々と上記②の記事を書き上げたところで、
tanakei氏
から、「ngrokを使えばもっと簡単にできるよ(ヨシッ」とつぶやかれ、試しに使ってみたところ、これまでの苦労はなんだったのかレベルに簡単だった、というのが本記事となります。
ngrokとは
使ってみた感じ、アカウント登録すると無料版でもHTTPSに対応したリバースプロキシを提供してくれるサービス、のようですおそらく。
エンジニアの方には知られているようで、グーグル検索でも日本語記事がザックザク見つかります。
私が前回の記事で説明していたような作業が秒で終わるらしいです。
早速アカウント登録を済ませて、公式サイトの説明書に従って作業してみましょう。
ngrokの導入方法
今回はローカルネットワーク内からラズパイにssh接続して作業します。
ssh ログインID@ラズパイのIPアドレス
管理者(root)になります。
sudo su -
適当なディレクトリに移動します。今回は/home直下で作業します。
cd /home
umbrelは/home/umbrel/umbrel以下をOSのアップデート時にいじくってしまう仕様らしいので、/home/umbrel/umbrel以下は避けて下さい。
ngrokの実行ファイルを入手します。自分の環境に合わせたものを選択します。
私の環境(ラズパイにumbrelOS)ではARM64というファイル名のものです。
wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-arm64.tgz
ファイル名を見てみると拡張子部分が.tgzとなっています。「tar形式で一つのファイルに固めgzip形式で圧縮している」という意味ですので対応した方法で解凍&伸長しましょう。
tar -xzf ngrok-v3-stable-linux-arm64.tgz
するとngrokという名前のファイルが得られます。確認してみましょう。
ls -l
ngrokの使い方
ngrokの公式サイトにログインするとダッシュボード画面となりますが、YourAuthtokenという項目に識別用の番号的なもの(トークン)が表示されます。
あとはYourAuthtoken内に書かれていることを実行するだけです。
まずngrokの実行ファイルがあることを確認します。
ls -l
ファイルがない場合はディレクトリを移動していますので、これまでの作業を参考にngrok実行ファイルがあるディレクトリまで移動してください。
ngrokにトークンを設定します。
./ngrok config add-authtoken [把握したあなたのトークン]
今回はUmbrelのAPPストアで追加したBTCPayを公開したいので、以下を実行します。
./ngrok http 3003
3003というのはBTCPayのポート番号です。
httpsじゃなくていいの?と思うかもしれませんがここはhttpでOKです。
順調にいくと画面に以下の例のような表示がでます。
Forwarding https://43f3-49-98-148-103.jp.ngrok.io -> http://localhost:3003
「https://43f3-49-98-148-103.jp.ngrok.ioであなたのマシンの3003ポートにアクセスできるようにしましたよ」という意味なのですが、なんと必要な作業はこれで終わりです。
上記の例では「https://43f3-49-98-148-103.jp.ngrok.io」をコピーしてブラウザに張り付けると自分のラズパイのBTCPayにアクセスできてしまいます。
追記) バックグラウンドで実行させたままにする
コメント欄でずいずいさんに教えてもらえました。
このままではシェルの操作が返ってこないし、うっかりssh接続に使用しているソフトを終了させるとngrokとの接続が切れてしまいます。
これへの対策は二つあり、
一つは、操作が返ってこないシェルは放置して、別窓でSSH接続し直す。
簡単ですが、sshに使用しているパソコンの電源を落とせません。できれば常時稼働させておくのはラズパイだけにしておきたい。と言う方は次のずいずいさんから教えてもらった方法、
nohupコマンドを使う方法
を使ってみましょう。
ずいずいさんのコメントを引用します。
[nohup]というコマンドを使えば行けるみたいです。
①nohup ./ngrok 3003 ←ngrokをバックグラウンドで動かす
②ignoring input and appending output to 'nohup.out ←なんか返ってくるけど無視
③curl http://localhost:4040/api/tunnels | grep ngrok.io ←アクセス用のアドレスを表示させる
ngrokでたぶんできない事
ポートを跨ぐような使い方はできないようです
試しに80番ポートをngrokで公開し、umbrelダッシュボードから各種APPにアクセスしようとしたところ、画像のようになりました。
APPから発せられる情報を、利用者側が取得できていないのだと思われます。
接続がきれると最初からやり直し
そのためのnohupなんですが、
- 機器のメンテナンスのために再起動を行えば最初からやり直し
- ネットワーク機器を再起動しても最初からやり直し
- 動的IPによるグローバルIPの変化が発生しても最初からやり直し
特に3は問題です。本記事の方法を取りたい人は結構な割合で動的IPと思われるからです。
2も私的には問題です。ネットワーク機器の再起動を定期実行しているからです。
というわけで前回記事の方法は未だ有効だったのです。生き残った!
そのうち続きを書きたいと思います。
ngrok便利すぎ、だけど気になった点
- ngrokに通信の中身を見られてしまうのでは?出資している企業にマイクロソフトなど有名どころが並んでいるものの、ngrokをそこまで信用していいものか。そもそも誰も信じなくていいことが魅力でBTCやUmbrelを始めた訳で。でも便利。
- 「https://43f3-49-98-148-103.jp.ngrok.io」の部分をみるに、「16進数4桁-グローバルIPアドレス.jp.ngrok.io」のようです。16進数4桁ということは65536通りまで追加できる・・・?マシンパワーが許す限り様々なサービスを公開できる・・・?やばい興奮してきた。
グローバルIPが伝わってしまう点が気になる方もいると思いますが、どうせ一日もすれば変化してしまう情報ですので、この点は大した問題にはならないかと思います。
気になる性能は?
動画を用意しましたのでこちらで評価してください。
##動画の貼り方が良く分からないのでyoutubeにアップロードした動画のリンクです。
WEBサイト上に用意した投げ銭ボタンからBTCPayに遷移してインボイスを入手し、ウォレットアプリで支払いをしてます。
LN自体の待ち時間がまだまだありますね。
支払い完了まで10秒くらいかかるのは回線によるところが大きいようです。動画はドコモの4G回線を使用しています。
とはいえ、待ち行列ダメゼッタイな対面レジはともかく、ECサイトやブログの投げ銭のような使い方では及第点だと思います。
何よりもグローバルIPを必要としないという点がアピールポイントです。
どの回線でもインターネットにさえつながれば手元のマシンを公開できますよ!
終わりに
世の中には二種類の人間がいます。
独自の決済手段をもつ人間と持たない人間です。
持たない人間は決済サービスを利用するしかありません。
手数料をとられ続け、決済情報のログにアクセスされてしまうでしょう。
あなたはどちら側の人間ですか?
私がVISAだ!
いや、私がBTCだ!\(@д@)/
素晴らしい記事!何度もラズパイで公開サーバーを建てようと試行錯誤してたのが嘘みたいに簡単に出来ました!ありがとうございます!
TeraTermでSSH接続をして動かしていたのですが、SSHの接続を切るとngrokのフォワーディングも切れるみたいなのでバックグラウンドで常時動かせないかと思い調べてみました。
[nohup]というコマンドを使えば行けるみたいです。
①nohup ./ngrok 3003 ←ngrokをバックグラウンドで動かす
②ignoring input and appending output to 'nohup.out ←なんか返ってくるけど無視
③curl http://localhost:4040/api/tunnels | grep ngrok.io ←アクセス用のアドレスを表示させる