前回、ngrokを使ってLinuxサーバにてSSHで外部からアクセスできるように設定しました。このサーバは踏み台としての利用だけでなく、Webサーバのフロントとしても利用したいと思っています。
今回はngrokでSSHサービス以外のサービスにもアクセスできるように、複数トンネルの設定について記載します。
ngrokフリープランの仕様
そもそもngrokフリープラン(無料)では複数トンネルをサポートしているのでしょうか。ngrokのプラン比較ページによると、フリープランでは1プロセスのみの起動制限がありますが、1プロセスあたり4トンネルまでサポートしているようです。そのため、SSH以外にもHTTPも公開できそうです。
複数トンネルの設定方法
では、どのように同時にトンネルを作成するのでしょうか。前回はコマンドベースで1トンネルのみを起動させていました。複数のトンネルの設定を行うには、ngrokの設定ファイル(ngrok.yml
)にトンネルの情報を記載する必要があります。
設定ファイルは、ユーザのカレントディレクトリ配下の「.ngrok2」フォルダにあります。
pwd /home/xxxxx/.ngrok2 $ ls ngrok.yml
現状の設定ファイルの内容はおそらく認証トークンの設定のみとなっていると思います。そこに、SSHとHTTPトンネルの設定を記載します。
authtoken: xxxxxxxxxxxxxxxxxxxx tunnels: ssh-access: addr: 22 proto: tcp web-access: addr: 8080 proto: http
tunnelsセクションの下にトンネルの名前(例:ssh-access)を記載します。トンネルの設定として転送先のポート番号(例:addr: 22)とプロトコル(例:proto: tcp)を指定します。上記の例では、SSH と HTTP (HTTPS) の2つのトンネルの設定を行いました。
以上で、設定は完了です。
複数トンネルの起動
トンネルの起動はngrok start
コマンドで行います。設定ファイルで定義したトンネルを1プロセスですべて起動しています。
ngrok start --all > /dev/null &
起動中のトンネルの情報を確認するためにcurl
コマンドを使ってトンネル情報を取得し、jq
コマンドで整形してみます。
curl -s http://localhost:4040/api/tunnels | jq .tunnels[].public_url "tcp://0.tcp.ngrok.io:15009" "https://7dfb928b4853.ngrok.io" "http://7dfb928b4853.ngrok.io"
コマンドの実行結果として3行(SSH, HTTP, HTTPS)のURIが表示されました。
ngrok起動コマンドの実行に失敗する場合
すでにngrokのプロセスが実行中の場合は以下のエラーメッセージが表示されます。フリープランでは1プロセスしか起動できないためです。
Tunnel session failed: Your account 'xxxxx' is limited to 1 simultaneous ngrok client session.
上記のエラーに直面した場合は、ngrokのプロセスを停止し、複数トンネルの起動コマンドを実行してください。起動中のngrokプロセスの情報はps aux
コマンドで確認できます。
ps aux | grep ngrok xxxxx+ 2187356 0.2 1.0 122508 21192 ? Sl 02:38 0:18 ngrok start --all xxxxx+ 2191548 0.0 0.0 6432 736 pts/0 S+ 04:31 0:00 grep --color=auto ngrok
ngrok
コマンドのプロセスIDを確認(例:2187356)し、kill
コマンドで停止します。
おわりに
1サーバにつき複数のサービスに外部からアクセスしたいケースは多々あると思います。ngrokのフリープランでも最大4トンネルまでサポートしており、わざわざ複数のサーバ筐体を準備しなくてもよいため、十分に開発・検証用途に活用できることがわかりました。