2021/02/02

ngrokで複数トンネルの設定

前回、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トンネルまでサポートしており、わざわざ複数のサーバ筐体を準備しなくてもよいため、十分に開発・検証用途に活用できることがわかりました。