0%

Raspberry Piをngrokで公開する - Part3: ngrok 2.0でSSHをトンネルする

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を明示的に指定します。

/etc/supervisor/conf.d/ngrok-ssh.conf
[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