開発中のやWebサーバーなどの機能を公開する時、これまでNgrokを使用していた。ローカルで実行するngrokコマンドはNgrokのサーバーとトンネルを確立し、Ngrokが保有するドメインへのアクセスをトンネル経由でローカルへと転送する。ngrokコマンドまで到達した通信は、ngrokコマンド起動時に指定した先へとさらに転送される。Ngrokにはいくつかプランが用意されている。無料であるフリープランも用意されているが、ドメインの固定はできず、またアクセスには警告画面のようなものを表示する。有料プランは、これらの問題は解消されるが、月20ドルだ。正直、高い。もしこれならGoogle Cloud ComputeEngineで無料インスタンスを配備し、sshポートフォワードで転送させるほうが安上りになる。しかし、それだけのためにインスタンスを保守する作業をしたくない。
調べていたところ、Cloudflareは同様の機能 Cloudflare Tunnel
を提供していた。私の場合、既にドメインを保有しており、Cloudflareで管理している。そのため、そのドメインに割り振れるのは都合がよい。今回はこれを試すことにする。
cloudflaredを準備する
Cloudflare Tunnel
を利用するには cloudflared
コマンドが必要だ。まずはこれをインストールする。各環境毎にインストール方法が整備されている1。今回はmacOSにhomebrewを使用してインストールする。
brew install cloudflare/cloudflare/cloudflared
インストールが完了すると cloudflared
コマンドが使用できる。
次にコマンドが認証情報を使用できるようにする。
cloudflared login
実行するとブラウザが開き、認証などを求められる。全ての処理が済むと $HOME/.cloudflared/cert.pem
に認証情報が書き込まれる。
トンネルの作成
次にトンネルを作成する。
cloudflared tunnel create MY_TUNNEL_NAME
成功すると MY_TUNNEL_NAME
というトンネルが作成される。
このトンネルをDNSにひもづける。ドメインを保有しているためこれが出来る。ひもづけたいドメイン名には自分の保有するドメインを指定する。(例: testing.example.com
)
cloudflared tunnel route dns MY_TUNNEL_NAME ひもづけたいドメイン名
トンネルへの接続確認をする
トンネルへの接続確認のための機能が用意されているため、接続確認にはそれを用いる。
cloudflared tunnel run --hello-world MY_TUNNEL_NAME
ひもづけたドメインにアクセスすると、Cloudflareのテストページが表示される。このページはローカルで動作している cloudflared
が返している。
トンネルへ接続する
接続確認が済んだら、あとは接続するのみだ。Cloudflareから受け取った通信を、ローカルのどこに転送するかは --url
で指定する。
ここでは http://localhost:8080
に転送する。
cloudflared tunnel run --url http://localhost:8080 MY_TUNNEL_NAME
基本的な使い方はこれだけだ。
TODO QUICサポート
cloudflaredはQUICをサポートするようになった。minetestはUDPで通信するため、もしかしたらQUICにも対応しているたもと思い試してみたが上手くいかなかった。それはおそらくminetestがQUICをサポートしていないからだろう。この事について後日調査する。
料金
この機能は無料で提供されている。ドメインは自分で準備する必要があり、それは有料だが安いものであれば年間2000円といったところか。だいぶ安い。