ngrokの最新バージョンは2.0.19です。サインアップすると付与されるtokenがすでに2.0になっているため、1.7のクライアントを使ってSSHのトンネルはできません。前回はNode.jsのラッパーを使い、ngrokのバージョンは1.7でした。今回は2.0のバイナリをインストールして、ローカルの無線LANにつながっているRaspberry PiにリモートからSSH接続してみます。
ngrok 2.0.19
Raspberry PiにログインしてダウンロードページからLinux/ARMのバイナリをインストールします。
$ wget https://dl.ngrok.com/ngrok_2.0.19_linux_arm.zip
$ sudo unzip ngrok_2.0.19_linux_arm.zip -d /usr/local/bin
Archive:  ngrok_2.0.19_linux_arm.zip
  inflating: /usr/local/bin/ngrok
$ ngrok version
ngrok version 2.0.19
サインアップするとダッシュボードに表示されるtokenを使い、ローカルに設定ファイルを作成します。
$ ngrok authtoken xxx
Authtoken saved to configuration file: /home/pi/.ngrok2/ngrok.yml
有料プラン
pricingのページによるとFreeプランの場合は同時接続クライアント数が1つです。
- Freeプラン
- 同時接続できるクライアントは1つ
- HTTPS/TCP のトンネルのみ利用可能
Raspberry PiのHTTPとSSHを同時に公開することができません。有料プランにすると同時接続クライアント数が増え、独自ドメインが使えるようになります。一番安いIndividualプランは同時接続クライアント数が3つで$60/年です。$5/月の計算になるので個人の開発環境としてお手頃です。
接続テスト
コマンドからURLを取得
Raspberry Piのシェルでngrokをフォアグラウンドで実行します。ngrok tcp 22とするとSSHの22ポートをトンネルすることができます。
$ ngrok tcp 22
ngrok by @inconshreveable                                       (Ctrl+C to quit)
Tunnel Status                 online
Version                       2.0.19/2.0.19
Web Interface                 http://127.0.0.1:4040
Forwarding                    tcp://0.tcp.ngrok.io:36198 -> localhost:22
Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00
リモートからSSH接続してみます。標準出力されているForwardingのドメイン名とポートを使います。
$ ssh pi@0.tcp.ngrok.io -p 36198
ダッシュボードからURLを取得
ngrokのダッシュボードのTunnels Onlineセクションに現在接続しているクライアントの情報とトンネルのURLが表示されます。
#	URL	Client IP
0	tcp://0.tcp.ngrok.io:36198	126.229.158.108
Supervisor
ngrokのSSHトンネルをSupervisorを使いデモナイズします。IoTプロダクション環境向けのngrok linkというサービスも開始しているように、ngrokを使うとコネクテッドデバイスの管理が簡単になります。Raspberry Piの電源を入れるとngrokのSSHトンネルが開始するようにしておけば、ダッシュボードからURLを確認してリモートからSSH接続ができるようになります。
設定
Supervisorの設定ファイルを作成し、commandにngrokの22ポートのトンネルを指定します。また--authtokenフラグでtokenを明示的に指定します。
[program:ngrok-ssh]
command=/usr/local/bin/ngrok tcp 22 --authtoken xxx
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/ngrok.log
user=pi
rereadして作成した設定ファイルをSupervisorに読み込ませます。
$ sudo supervisorctl reread
ngrok-ssh: available
addでSupervisorのサブプロセスにngrokを追加します。
$ sudo supervisorctl add ngrok-ssh
ngrok-ssh: added process group
$ sudo supervisorctl status ngrok-ssh
ngrok                            RUNNING    pid 2504, uptime 0:00:18
サブプロセスに追加した後にconfを編集すると、updateが必要なので忘れないようにします。
$ sudo supervisorctl update ngrok-ssh
テスト
Supervisorからngrokを起動した後も、ngrokコマンドを直接実行した場合と同様にngrokのダッシュボードのTunnels Onlineセクションにオンラインのクライアント情報が表示されます。
#	URL	Client IP
0	tcp://0.tcp.ngrok.io:39016	126.229.158.108
このURLとポートを使い、リモートからRaspberry PiにSSH接続します。
$ ssh pi@0.tcp.ngrok.io -p 39016