開発環境用のトンネリングツールとそのしくみ（localhost.run編）

この記事は、[IoTLTアドベントカレンダー2019（neo）](https://qiita.com/advent-calendar/2019/iotlt_neo) 23日目の記事です。[^1]

## はじめに

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ローカルサーバーを「ssh」コマンドで公開できるサービス「Serveo」の紹介です。例えばポート「80」のWebサーバーで次のコマンドを実行します。<br>$ ssh -R 80:localhost:80 <a href="https://t.co/wHKbxjd4YT">https://t.co/wHKbxjd4YT</a><br>表示されるURLでアクセスできます。詳細は最新号の特集1（p.56）に掲載！<a href="https://t.co/5eQn6q21QN">https://t.co/5eQn6q21QN</a> <a href="https://t.co/0PBHpHb7J9">pic.twitter.com/0PBHpHb7J9</a></p>&mdash; 日経Linux | ラズパイマガジン (@nikkei_Linux) <a href="https://twitter.com/nikkei_Linux/status/1188719425798590464?ref_src=twsrc%5Etfw">October 28, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ラズパイマガジンの姉妹紙、日経Linux（リナックス） 2019年11月号でも特集されていたらしく、IoT業界でもSSHコマンドで手軽に外部へサービスを公開できる [serveo](http://serveo.net/) についてご存じの方は少なくないのではと思います。

[ngrok](https://ngrok.com/) 同様、センサーのっけたシングルボードコンピューターやプロトタイプを開発用途でサクッと公開できる手段としてとても魅力的なサービスに思えます [^2]。

しかしながら悲しいことに、心ないユーザーのフィッシングサイトへの悪用への影響でサービスが復旧されない日々が続いています [^3]。

そんな serveo のメーリングリストでは「いつ復活するんだ」「来年か、二度と無いんじゃないの」「はやくして。無料でして。やくめでしょ」「俺はマイクラサーバーを公開したいのにどうすればいいんだ」といった悲しみ（？）の声 [^4] が渦巻いているんですが、その中で

```
servero を何に使いたいの？
WebベースのアプリやWebサイトなら http://localhost.run/ でいけるよ
```

といった投稿がありまして。知らないサービスなのでちょっと調べたり比較してみました。

## localhost.run の使い方としくみ

[localhost.run](http://localhost.run/) は serveo と同様に、SSHポートフォワーディングでHTTPポートをトンネリングできる無料のWebサービスです。

### sshポートフォワーディングによるトンネリング

serveo 同様に、手元の端末から

```sh
ssh -R 80:localhost:8080 ssh.localhost.run
```

と、指定のSSHサーバ（ `ssh.localhost.run` ）へポートフォワーディング設定をして接続すると、

```
Connect to http://xxxx-yyyy.localhost.run or https://xxxx-yyyy.localhost.run
```

と、ドメイン（URL）を発行してくれます。

この例であれば、`https://xxxx-yyyy.localhost.run` に外部からアクセスすれば、手元の端末の8080番ポートにHTTPアクセスが転送されてきます。

ちなみに、 **xxxx が手元の端末のユーザー名**、 **yyyy がランダムな文字列になるようです**。ドメイン（URL）は、接続を行うたびに変わります。

### 他のサービスとの違い

ngrok, serveo, localhost.run はそれぞれ（原則）無料で使用できるトンネリングツールですが、ちょっと違いがあるので並べてみます。

||ngrok|serveo|localhost.run|
|---|---|---|---|
|*仕組み*|Long-Lived TCP Connection | SSH Port-Forwarding | SSH Port-Forwarding |
|*転送可能*|<font color="SlateBlue">HTTP(S), TCP</font>|<font color="SlateBlue">HTTP(S), TCP</font>| HTTP(S)のみ |
|複数ポートの<br>転送指定|<font color="SlateBlue">可能</font>|<font color="SlateBlue">可能</font>|不可能|
|*トンネリング用<br>サーバのありか* |<font color="SlateBlue">AWS（リージョン指定可）</font>| ? [^5] | GCP |
|*ドメイン（URL）*|接続のたびに変化|<font color="SlateBlue">ユーザー名・IPごとに固定</font>|接続のたびに変化 |
|*価格*|一部無料|<font color="SlateBlue">無料</font>|<font color="SlateBlue">無料</font>|
|*無料での<br>主な制限*|トンネリング継続時間[^6]、<br>1分間あたりのコネクション数、<br>ドメインの固定<br>など|<font color="SlateBlue">原則なし</font>|<font color="SlateBlue">原則なし</font>|
|*安定性（主観）*|<font color="SlateBlue">良い</font>| 💀 | ？[^7]|

こうして比べてみると、 serveo の復活を待ち望むユーザーが多いのも頷けますね。

でも安定的に使いたいなら、ngrok（課金）な気がします...

## おわりに

serveo のメーリングリストを除いていたら、代替になりそうなサービスがあったので解説してみました。

ぜひお手元でプロトタイピングする際の参考になればと思います。


[^1]: HSTハワイ標準時（GMT-10:00, JST-19:00)
[^2]: ngrok とそのしくみは、ゆるWeb勉強会＠札幌の [開発環境用のトンネリングツールとそのしくみ（ngrok編）](https://speakerdeck.com/gishi_yama/mild-web-sap06) で発表しました
[^3]: serveo のしくみと現状は、 [開発環境用のトンネリングツールとそのしくみ（serveo編）](https://qiita.com/gishi_yama/items/dda41216b2d1b0b36de0) で述べました
[^4]: 意訳ですがそんなノリで、メーリングリストに流れてくるタイトルがだいたい「し、死んでる...」「いつ復活するの」なのがちょっと面白い（恐ろしい）、[Serveo Help and Discussion](https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!forum/serveo) にジョインナウ！
[^5]: AWSだったような気がするんですが（いつか復活することがあれば）調べておきます。
[^6]: ユーザー登録すれば、継続時間の制限は無くなる。
[^7]: [localhost.run](https://twitter.com/localhost_run) のtwitterアカウントによれば、やっぱりフィッシングサイトへの悪用が原因で停止していた期間があるようです。こういうサービスの宿命ですね...