0%

Raspberry Piをngrokで公開する - Part4: 有料プランでサブドメインとTCPアドレスを予約する

前回試したのはngrokのFreeプランだったので、2つのクライアントを同時に起動できませんでした。Raspberry Piで起動している複数のサービスのポートをインターネット上に公開したいのでIndividualの有料プランを契約することにします。

プランの変更

あらかじめダッシュボードに表示されるtokenを使いローカルに設定ファイルを作成しておきます。

$ ngrok authtoken xxx
Authtoken saved to configuration file: /home/pi/.ngrok2/ngrok.yml

ngrokのダッシュボードにログインします。BillingタブのPlanセクションに表示されるChange Planボタンをクリックします。Individualプランは年契約で$60を一括で支払います。

ngrok-individual.png

サブドメインの予約

独自ドメインも使えますが、DNSの変更が必要になります。開発環境なのでngrok.ioのサブドメインを使うことにします。通常はサブドメインはランダムで自動的に割り当てられますが、有料プランに変更すると自分で好きな名前を付けることができます。トンネルがオフラインでもサブドメインは確保されます。

Individualプランの場合は3つまでサブドメイン名を予約しておくことが出来ます。Reserved Tunnels画面のReserved DomainセクションにあるNameテキストボックスに予約したいアプリ名などの名前を入力して、Reserve Domainボタンをクリックします。

reserved-domain.png

使い方

DocsCustom subdomain namesセクションに使い方があります。

$ ngrok http -subdomain=inconshreveable 80

HTTPトンネルはSupervisorのサブプロセスとして起動しているので最初に停止しておきます。

$ sudo supervisorctl stop ngrok-http

設定ファイルのcommand行にあるngrokコマンドに--authtokenフラグとあわせて、-subdomainフラグに予約したサブドメイン名を追加します。

/etc/supervisor/conf.d/ngrok-http.conf
[program:ngrok-http]
command=/usr/local/bin/ngrok http --authtoken xxx -subdomain=xxx 3000
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/ngrok-http.log
user=pi

Supervisorの設定ファイルを編集したのでupdateして再起動します。

$ sudo supervisorctl update ngrok-http
ngrok-http: stopped
ngrok-http: updated process group

ダッシュボードのTunnels Onlineセクションに予約されたドメイン名と接続しているクライアントのIPアドレスが表示されます。

reserved-domain-assign.png

リモートホストからcurlでURLを開いてトンネルを確認します。

$ curl http://xxx.ngrok.io
Hello World!

TCPアドレスの予約

SSHのトンネルを使うときは以下のようにTCPアドレスを使います。通常はポート番号はクライアントからトンネルを作成するごとランダムになります。

$ ssh pi@0.tcp.ngrok.io -p 36198

Individualプランの場合は2つまで予約することができます。Reserved Tunnels画面のReserve Addressボタンをクリックするとポート番号を予約することができます。

reserved-address.png

使い方

DocsListening 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アドレスを追加します。

/etc/supervisor/conf.d/ngrok-ssh.conf
[program:ngrok-ssh]
command=/usr/local/bin/ngrok tcp --authtoken xxx --remote-addr 1.tcp.ngrok.io:xxx 22
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/ngrok-ssh.log
user=pi

Supervisorの設定ファイルを編集したのでupdateして再起動します。

$ sudo supervisorctl update ngrok-ssh
ngrok-ssh: stopped
ngrok-ssh: updated process group

ダッシュボードのTunnels Onlineセクションに予約されたTCPアドレスと、接続しているクライアントのIPアドレスが表示されます。

reserved-address-assign.png

この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}

ルートログイン不可、パスワード認証不可にしておきます。

/etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no

最後に設定ファイルをreloadします。

$ sudo service ssh reload