前回試したのはngrokのFreeプランだったので、2つのクライアントを同時に起動できませんでした。Raspberry Piで起動している複数のサービスのポートをインターネット上に公開したいのでIndividualの有料プランを契約することにします。
プランの変更
あらかじめダッシュボードに表示されるtokenを使いローカルに設定ファイルを作成しておきます。
$ ngrok authtoken xxx |
ngrokのダッシュボードにログインします。BillingタブのPlanセクションに表示されるChange Plan
ボタンをクリックします。Individualプランは年契約で$60を一括で支払います。
サブドメインの予約
独自ドメインも使えますが、DNSの変更が必要になります。開発環境なのでngrok.io
のサブドメインを使うことにします。通常はサブドメインはランダムで自動的に割り当てられますが、有料プランに変更すると自分で好きな名前を付けることができます。トンネルがオフラインでもサブドメインは確保されます。
Individualプランの場合は3つまでサブドメイン名を予約しておくことが出来ます。Reserved Tunnels画面のReserved DomainセクションにあるNameテキストボックスに予約したいアプリ名などの名前を入力して、Reserve Domain
ボタンをクリックします。
使い方
DocsのCustom subdomain namesセクションに使い方があります。
$ ngrok http -subdomain=inconshreveable 80 |
HTTPトンネルはSupervisorのサブプロセスとして起動しているので最初に停止しておきます。
$ sudo supervisorctl stop ngrok-http |
設定ファイルのcommand
行にあるngrokコマンドに--authtoken
フラグとあわせて、-subdomain
フラグに予約したサブドメイン名を追加します。
[program:ngrok-http] |
Supervisorの設定ファイルを編集したのでupdateして再起動します。
$ sudo supervisorctl update ngrok-http |
ダッシュボードのTunnels Onlineセクションに予約されたドメイン名と接続しているクライアントのIPアドレスが表示されます。
リモートホストからcurlでURLを開いてトンネルを確認します。
$ curl http://xxx.ngrok.io |
TCPアドレスの予約
SSHのトンネルを使うときは以下のようにTCPアドレスを使います。通常はポート番号はクライアントからトンネルを作成するごとランダムになります。
$ ssh pi@0.tcp.ngrok.io -p 36198 |
Individualプランの場合は2つまで予約することができます。Reserved Tunnels画面のReserve Address
ボタンをクリックするとポート番号を予約することができます。
使い方
DocsのListening on a reserved remote addressセクションに使い方があります。
$ ngrok tcp --remote-addr 1.tcp.ngrok.io:20301 22 |
最初にSupervisorのサブプロセスを停止します。
$ sudo supervisorctl stop ngrok-ssh |
設定ファイルのcommand
行にあるngrokコマンドに--authtoken
フラグとあわせて、--remote-addr
フラグに予約したTCPアドレスを追加します。
[program:ngrok-ssh] |
Supervisorの設定ファイルを編集したのでupdateして再起動します。
$ sudo supervisorctl update ngrok-ssh |
ダッシュボードのTunnels Onlineセクションに予約されたTCPアドレスと、接続しているクライアントのIPアドレスが表示されます。
このTCPアドレスを使ってローカルネットワークにあるRaspberry PiにリモートからSSH接続ができるようになります。
$ ssh pi@1.tcp.ngrok.io -p xxx |
SSH接続の確認ができたら一度ログアウトします。 ssh-copy-idコマンドなどを使いSSHクライアントの公開鍵をコピーします。
$ ssh-copy-id -i ~/.ssh/id_rsa.pub pi@1.tcp.ngrok.io -p xxx |
リモートからSSH接続をするのでsshdの設定を変更します。最初にバックアップをします。
$ sudo cp /etc/ssh/sshd_config{,.orig} |
ルートログイン不可、パスワード認証不可にしておきます。
PermitRootLogin no |
最後に設定ファイルをreloadします。
$ sudo service ssh reload |