ngrok をセルフホストできる・でも DNS が大事

ngrok というサービスを使うと、ローカルホストのポートと ngrok とのトンネルを作ってくれて、サブドメイン形式の URL を発行してもらえる。このサービスを使う方法は以前紹介した。

この ngrok、どうやらセルフホスティングできるらしいので調べてみたのだが、結果からいうと実現できなかった。今日の記事は特に成果のないメモ。

セルフホスト ngrok の要件

クラウド VM なんかに ngrok.io 相当のサイトを構築して、自分だけの ngrok を立てられる。サーバサイドとなる ngrok は ngrokd と命名されている。

やり方などは以下のページ群を見れば分かるだろう。

セルフホスト ngrok サーバを構築するには、example.com という独自ドメインと、*.example.com というワイルドカード DNS を登録しないといけない。

この「ワイルドカード DNS」というモノは、DNS サービスによっては対応していないところがあり、例えば無料ドメインの Freenom が提供する DNS では、ワイルドカード DNS は作成できなかった。

自分が使っている DNS サービスでいうと、Value Domain はワイルドカード DNS が登録できるようだが、Freenom で取得しているドメインを Value Domain の DNS で管理するための設定が面倒臭そうだったので、諦めてしまった。

ということで、セルフホスト ngrok 用の独自ドメインと、それに対応するワイルドカード DNS が登録できるようなクラウドプロバイダを選択しないと、簡単に操作できないワケだ。よく使われているのは AWS とか GCP とからしい。API で DNS 設定も出来たりするからその方が良いのだろうな。無料のサービスだけで何とかするのは厳しそうだ。


んで、DNS が解決したあとは、SSL 証明書が必要になる。DNS と同じく、ワイルドカード対応の SSL 証明書を取得する必要がある。Let's Encrypt でもワイルドカード証明書を作ることはできるが、DNS レコードで所有を証明しないといけないので、やはり DNS サービスは使いやすいモノが良いだろう。

ちなみに、SSL 証明書は自己署名証明書でも動かせるようだ。


ワイルドカードなサブドメインに対応した DNS と SSL 証明書を準備できたら、いよいよ ngrokd の準備となる。ngrok は Go 言語ベースなのだが、あまり新しすぎる Go 環境だと動かないらしいので注意。

あまりGoが新しいとエラーになるので、Go1.7をインストールする。

ココまでやって、ようやくホスティングできる感じ。面倒臭い…。

Docker で構築する

ちなみに、ngrok 自体を Docker イメージで利用することもできる。

ngrokd も Docker イメージとして用意できるようだ。

このコメントによると。

FROM alpine:latest

WORKDIR /opt
ADD ngrokd device.key device.crt ./

EXPOSE 80
EXPOSE 443
EXPOSE 4443

ENTRYPOINT ["./ngrokd","-tlsKey","device.key","-tlsCrt","device.crt","-domain","yourdomain.com"]
env GOOS=linux GOARCH=amd64 make release-server
cp bin/ngrokd
docker build . -t yourname/ngrok:latest
docker push yourname/ngrok:latest

On the server, just execute docker run -d --restart=always -p 80:80 -p 443:443 -p 4443:4443 yourname/ngrok:latest.

…こんな感じで作れるらしい。

Awesome Tunneling

ローカルホストのポートを直接開けてサイトを公開するのって、色々と難易度高いので、ngrok みたいなトンネリングを利用して公開できるのは手軽だが、ngrok 自体のセルフホスティングはなかなか面倒だった。

ngrok 以外の「トンネリング」関係の情報は、以下の Awesome Tunneling にまとまっている。

メモ終わり。