1. Home
  2. /
  3. ネットワーク
  4. /
  5. Cloudflare Tunnelを使って自宅サーバーをポート開放せずに公開する

Cloudflare Tunnelを使って自宅サーバーをポート開放せずに公開する

Cloudflare Tunnelを使って自宅サーバーをポート開放せずに公開する

自宅サーバーを立てていると、外部からアクセスしたい時にポート開放が必要になります。しかし、ポート開放はセキュリティ上のリスクがあるため、できるだけ避けたいものです。そこで、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 provides you with a secure way to connect your resources to Cloudflare without a publicly routable IP address. With Tunnel, you do not send traffic to an external IP — instead, a lightweight daemon in your infrastructure (cloudflared) creates outbound-only connections to Cloudflare's global network. Cloudflare Tunnel can connect HTTP web servers, SSH servers, remote desktops, and other protocols safely to Cloudflare. This way, your origins can serve traffic through Cloudflare without being vulnerable to attacks that bypass Cloudflare.

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は非常に便利なサービスですので、皆様もぜひ使ってみてください。

サイト内の商品リンクは一部アフィリエイトリンクとなっています

関連記事

OpenWebUIとLiteLLMの組み合わせで自分専用LLMコンソールを構築する

OpenWebUIとLiteLLMの組み合わせで自分専用LLMコンソールを構築する

毎月のように最強のLLMが登場する昨今、登場するたびに提供会社のWebUIに慣れるのは大変です。 そこで過去に紹介したLiteLLMとOpenWebUIを組み合わせて様々なLLMサービスを統一したWebコンソール上で利用できるようなサービスを自分用にデプロイしたいと思います。 Open WebUIについて GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) User-friendly AI Interface (Supports Ollama, OpenAI API, ...) - open-webui/open-webui ChatGPTやGeminiなど一般的なLLMのWebサービスUI的な物のオープンソース版です。一般的なチャット、画像等のファイルアップローダー、Web検索(スクレイピングツールの繋ぎ込みが必要)など欲しい機能がひととおり揃っています。(昔はOllma WebUIという名前でした)
Starlink miniを購入したので携帯電波が無い場所でレビュー

Starlink miniを購入したので携帯電波が無い場所でレビュー

Starlink miniが遂に日本で販売開始になりました。米国での販売価格は599ドルなので日本では98,000円くらいになるだろうと思っていたら日本価格は34,800円!ありがとうイーロンマスク。イーロンマスク効果(1ドル60円)のインパクトは非常に大きく衝動買いできる価格になりました。 そして販売直後に販売各社からポイント還元セールが行われるようになりました。 このような経緯で私は楽天市場のヤマダデンキから4427ポイント還元で購入しました。これに追加でJALのマイル等が付きますので実質2万円台での購入になります。