自宅サーバーを立てていると、外部からアクセスしたい時にポート開放が必要になります。しかし、ポート開放はセキュリティ上のリスクがあるため、できるだけ避けたいものです。そこで、Cloudflare Tunnelを使って自宅サーバーをポート開放せずに公開する方法を紹介します。
今回公開するもの
今回はMinecraftサーバーのDynmapを公開します。
DynmapとはMinecraftサーバーのプラグインでゲームのワールドデータをWebブラウザで閲覧できるようにするものです。ワールドデータを手軽に俯瞰してみることができますのでMinecraftサーバーを運用する方はまず入れることが多いプラグインです。
MinecraftサーバーにDynmapのプラグインを入れると、ポート番号8123
でWebサーバーが立ち上がります。これをCloudflare Tunnelを使って公開します。
また同じファミリー製品であるCloudflare Accessを使って、特定のユーザーのみアクセスできるようにします。
Cloudflare Tunnelとは

Cloudflare Tunnel · Cloudflare Zero Trust docs
Cloudflare Tunnelは、Cloudflareのネットワークを使って自宅サーバーを公開するためのサービスです。自宅サーバーにCloudflareと接続するためのデーモンをインストールし、Cloudflareのネットワークを経由してサーバーにアクセスできるようになります。またポート開放をせずに済むという特徴からグローバルIPがないマンション共有回線やCATV回線などでもサーバー公開が可能になります。
アクセスの入り口はCloudflareさんなのでDDoS攻撃やセキュリティ上のリスクなどはある程度良い感じに対応してもらえます。素朴に家のルーターをポート開放する場合と比べると格段にセキュリティが向上します。
Cloudflare TunnelはCloudflare Zero Trustファミリーの1サービスです。Cloudflare Zero TrustはFree Planが非常に充実しており、個人利用範囲内であれば無料で利用できます。
Cloudflare Tunnelの設定
Cloudflareのアカウントを所持していて、DNSの利用をしている前提で話を進めていきます。例ではこのブログと同じドメインであるynr.jpを利用しています。
Cloudflareの管理コンソールにログインして、Zero Trust > ネットワーク > Tunnels に遷移します。
「トンネルを作成する」ボタンで遷移してトンネルの種類で「Cloudflared」を選択してください。
Cloudflaredをインストールする環境を選択してセットアップします。Linux環境であればDockerを利用するのが一番楽だと思います。コマンド一発で終わりますし、アップデート作業も楽です。
接続が完了したらどのURLとポートに通信を転送するかの設定を行います。接続完了後に自動遷移した記憶ですが、Tunnels画面で設定したいトンネルの右端…から「設定」でも追加できます。
「パブリック ホスト名を追加する」から設定に入れます。パブリックホスト名が外部からアクセスするURLになります。この場合は「minecraft-map.ynr.jp」にアクセスするとDynmapが表示されるようになります。
サービスにはDynmapが立ち上がっているURLとポート番号を指定します。この場合は「http://192.168.11.5:8123」です。先ほどCloudflaredをインストールしたサーバーからこのURLがアクセス可能かどうか確認してから登録してください。
この設定で「ホストを保存」すると、自宅外でも先ほど設定したホスト名でDynmapにアクセスできるようになります。
Cloudflare Tunnelの良いところはHTTPSの証明書関連も自動でよしなに行ってくれるところです。Dynmapを宅内でアクセスするときはサービス登録したとおりHTTPでのアクセスですが、外部公開のアドレスはHTTPSでアクセスできます。
証明書更新作業等もすべて自動で行われます。
Cloudflare Accessでアクセス制限
不特定多数に公開するのであればこのままでも良いですが、このDynmapは特定のユーザーのみアクセスできるようにしたいと思います(このMinecraftサーバーが友人と遊ぶ用のクローズドサーバーなので)。
Cloudflare Accessを使うと非常に簡単にGoogleログイン等でのアクセス制限をつけることができます。今回はGoogleアカウントでアクセス制限をつけてみます。
Tunnelと同じくZero TrustにあるAccessに遷移してアプリケーションから「アプリケーションを追加する」を選択します。
アプリケーションの種類は「セルフホスト」を選択します。
アプリケーション名は任意の分かりやすい名前を設定します。セッション時間は再ログインが必要になるまでの時間です。今回Dynmapのようにセキュリティ強度が必要ではない場合は1ヶ月等にした方が利便性は良いと思います。
パブリックホスト名は先ほどTunnelで設定した物と同じです。例では「minecraft-map.ynr.jp」
Accessポリシーでポリシーを作成もしくは既存ポリシーを選択します。このポリシーでログインできるユーザーを定義します。ポリシー名は任意の名前を設定します。「ルールを追加」の部分でセレクターを「Emails」にしてログインするユーザーのgmailアドレスを指定します(複数可)。
もし、Google Workspaceを利用していてGoogle Groupを構築しているのであれば、セレクターを「Google Group」にして値をグループメールアドレスにすることでGoogleグループに所属しているかどうかで制御可能になります。
ログイン方法を選択します。「利用可能なすべてのプロバイダーを受け入れる」のチェックを外してGoogleやGoogle WorkspaceのみにすることでGoogleログインのみに制限できます。
仮にGoogle以外のどのメールアドレスでもログインを受け入れたい場合はOne-time PINを選択することでメールにワンタイムコードが送信されてそのコードでログインするといった事も可能です。
個人的なオススメとしてはログイン手法は1つのみにして「インスタント認証」を有効にすることでシームレスにGoogleログイン画面に遷移できるのでおすすめです。
Googleログインなどが表示されていない場合は「ログイン方法を追加」から任意のログイン手法を追加できます。
その他設定はデフォルトのままで「保存」を押します。
保存後先ほど設定したパブリックホスト名、今回の例では「minecraft-map.ynr.jp」にアクセスするとCloudflare Accessのサインイン画面に遷移します。
Googleを選択すると見慣れたいつものGoogleログイン画面、「インスタント認証」を有効にしている場合は初手この画面に遷移しますのでログインすることでページが見られるようになると思います。
Cloudflare Tunnel設定時にアクセス制限を行う
Cloudflare Tunnelを作成してからAccessの設定を行うという順番でしたが、この順番だとAccessの設定を行っている間は無防備にアクセスが可能になってしまいます。
その対策としてCloudflare Tunnelの設定時にアクセス制限を行うことができます。
Cloudflare Tunnelの設定画面でパブリックホスト名を設定する際に「その他のアプリケーション設定」から「Accessによる保護」を有効化してホスト名を保存します。
この状態ではパブリックホスト名にアクセスしてもサイトにアクセスすることはできません。その間に安心してCloudflare Accessの設定を行えます。
注意点としては「Accessによる保護」が有効になっている場合、単純にCloudflare Accessを設定するだけではまだBad Gatewayでアクセスできません。
先ほどのCloudflare Tunnelの「Accessによる保護」の設定箇所でプルダウンからCloudflare Accessのアプリケーション名が選択できます。ここを選択することでアクセス可能になります。
まとめ
無料でお手軽、そしてセキュアに自宅サーバーのサービスを外部に公開することができるCloudflare Tunnel。もちろん、自宅サーバー以外にもクラウド環境やVPS環境でもCloudflareのネットワークを経由することでセキュアにサービスを公開できます。
欠点を挙げるのであれば、Cloudflare Tunnelを使うと若干ページを開く際の遅延が発生します。やはり通信を中継するという性質上この遅延は仕方がないものです。
その遅延さえ許容できるのであればCloudflare Tunnelは非常に便利なサービスですので、皆様もぜひ使ってみてください。