自宅サーバーを外部に公開したい、社内システムにリモートからアクセスしたい――そんなとき、ルーターのポートを開放して固定IPを契約する従来の方法はセキュリティリスクとコストの両面で課題を抱えています。Cloudflare Tunnelは、サーバーからCloudflareへアウトバウンド方向だけの接続を張ることで、パブリックIPの露出なしにサービスを公開できる無料のトンネルサービスです。

Cloudflare Tunnelの仕組み

Cloudflare Tunnelは、サーバー側に配置した軽量デーモン「cloudflared」がCloudflareのグローバルネットワークへ**外向きの暗号化接続(QUIC)**を確立する仕組みで動作します。

通信の流れは次のとおりです。

  1. cloudflaredがCloudflareのエッジサーバーへアウトバウンド接続を確立
  2. 外部ユーザーがCloudflareのドメイン(例: app.example.com)へアクセス
  3. Cloudflareエッジが受信したリクエストを、トンネル経由でオリジンサーバーへ転送
  4. オリジンサーバーがレスポンスを返却し、逆ルートで外部ユーザーに到達

従来のポートフォワーディングとの決定的な違いは、ルーターで一切のインバウンドポートを開ける必要がない点です。ファイアウォールの内側からCloudflareへ向かう通信のみを許可すればよいため、ポートスキャンやDDoS攻撃の対象になるリスクを大幅に減らせます。

料金プランと無料枠の範囲

Cloudflare TunnelはCloudflare Zero Trustプラットフォームの一機能として提供されています。個人利用を想定したFreeプランでも制限なくトンネルを作成できます。

項目FreeプランPay-as-you-goEnterprise
月額料金無料$7/ユーザー/月要問い合わせ
Tunnelの作成数無制限無制限無制限
Zero Trust認証ユーザー最大50名無制限無制限
Accessアプリケーション最大50アプリ無制限無制限
Gateway DNSポリシー最大50ポリシーフル機能フル機能
拠点数最大3拠点無制限無制限
SLAなしありカスタム

個人が自宅サーバーの公開やSSHアクセスの用途で使う場合、Freeプランで十分対応できます。50ユーザーを超えるチームでアクセス制御を行う場合にのみ有料プランが必要です。

注意点として、Freeプランの50ユーザー枠を1人でも超過すると、全ユーザー分が課金対象になります(51人目を追加した場合、$7 × 51 = $357/月)。部分的な無料枠の適用はありません。

Tunnel自体の帯域課金やトラフィック従量課金は、どのプランでも発生しません(出典: Cloudflare Zero Trust料金ページ)。

セキュリティと安全性

Cloudflare Tunnelが従来のVPN・ポートフォワーディングと比べて安全とされる根拠は、主に3点あります。

パブリックIPの秘匿

オリジンサーバーのIPアドレスがインターネットに公開されません。攻撃者がDNS逆引きやShodan等のスキャナでサーバーを発見する経路が遮断されます。

アウトバウンド専用接続

cloudflaredはCloudflareへの発信方向のみ接続するため、サーバー側のファイアウォールでインバウンドポートを閉じたまま運用できます。外部から直接サーバーへ到達するルートが存在しないため、不正侵入のアタックサーフェスが大幅に縮小します。

Zero Trust Accessとの連携

Cloudflare Accessを組み合わせると、トンネル経由のアクセスに対してメールアドレスOTP認証外部IdP(Google、GitHub、Okta等)IPアドレス制限などの多層的なアクセス制御を適用できます。Freeプランでも50ユーザーまでAccessポリシーを利用可能です。

個人の自宅サーバー公開においても、Accessを有効にすれば「自分だけがSSHログインできる」「特定のGoogleアカウントだけがWebアプリにアクセスできる」といった制御を数分で実現できます。

cloudflaredのインストール方法

cloudflaredはWindows、macOS、Linux、Docker、Raspberry Pi等の主要プラットフォームに対応しています。

Linux(Debian/Ubuntu)

# リポジトリ追加とインストール
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update && sudo apt install cloudflared

macOS(Homebrew)

brew install cloudflared

Docker

docker pull cloudflare/cloudflared:latest

Windows

公式サイトからMSIインストーラーをダウンロードするか、wingetで導入します。

winget install --id Cloudflare.cloudflared

ダッシュボードからトンネルを作成する手順

GUIベースで操作する場合の手順です。CLIでの作成も可能ですが、ダッシュボード操作のほうがトンネル管理やルーティング設定が視覚的にわかりやすいためおすすめです。

ステップ1: Cloudflareアカウントとドメインの準備

Cloudflareのアカウントを作成し、所有するドメインをCloudflareのネームサーバーに移管します。ドメインレジストラの管理画面で、ネームサーバーをCloudflareが指定する値(例: xxx.ns.cloudflare.com)に変更してください。

ステップ2: Zero Trustダッシュボードを開く

Cloudflareダッシュボードのサイドメニューから「Zero Trust」に移動します。初回は組織名(任意の文字列)の入力とプラン選択を求められるので、Freeプランを選択します。

ステップ3: トンネルを新規作成

Zero Trustダッシュボードの Networks > Tunnels から「トンネルを追加する」をクリックし、種類として「Cloudflared」を選択します。任意の名前(例: home-server)を入力して保存すると、インストール用のトークンが表示されます。

ステップ4: cloudflaredを起動

表示されたトークンを使い、サーバー上でcloudflaredを起動します。

# 直接起動
cloudflared tunnel run --token <YOUR_TOKEN>

# Docker(デーモン化 + ホストネットワーク)
docker run -d --network host cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <YOUR_TOKEN>

Dockerで--network hostを付けることで、トンネル設定のService欄にlocalhostを指定できるようになります。ブリッジネットワーク(デフォルト)のままだとコンテナ内のlocalhostはホストマシンを指さないため、接続に失敗する原因になります。

ステップ5: パブリックホスト名を追加

トンネルの設定画面で「Public Hostname」タブを開き、ルーティングを追加します。

設定項目記入例(Webサーバー)記入例(SSH)
Subdomainappssh
Domainexample.comexample.com
TypeHTTPSSH
URLlocalhost:8080localhost:22

保存するとCloudflare DNS上にCNAMEレコードが自動作成され、app.example.comへのアクセスがトンネル経由でオリジンサーバーのlocalhost:8080に到達するようになります。

SSH接続を設定する方法

Cloudflare Tunnelを経由してSSH接続を行うには、サーバー側クライアント側の両方に設定が必要です。

サーバー側

前述の手順でPublic Hostnameを追加し、TypeをSSH、URLをlocalhost:22に設定します。SSHデーモン(sshd)が22番ポートで待ち受けていることを確認してください。

クライアント側

クライアントマシンにもcloudflaredをインストールし、SSH configにProxyCommandを追加します。

# ~/.ssh/config
Host ssh.example.com
    ProxyCommand cloudflared access ssh --hostname %h
    User your-username

これで通常のsshコマンドで接続できます。

ssh ssh.example.com

Cloudflare Accessを有効にしている場合、初回接続時にブラウザが開いて認証画面が表示されます。認証が成功するとSSHセッションが開始します。

ドメインなしで使う方法(TryCloudflare)

独自ドメインを持っていない場合でも、TryCloudflareを使えばCloudflare Tunnelの機能を試せます。

cloudflared tunnel --url http://localhost:3000

このコマンドを実行すると、https://ランダム文字列.trycloudflare.comのような一時URLが自動発行され、ローカルの3000番ポートがインターネットに公開されます。

TryCloudflareの仕様をまとめます。

項目内容
ドメイン形式*.trycloudflare.comのランダムサブドメイン
Cloudflareアカウント不要
同時リクエスト上限200(超過時は429エラー)
対応プロトコルHTTP / HTTPSのみ
URL永続性なし(実行のたびに新URLが生成)
SSE(Server-Sent Events)非対応
SLA・稼働保証なし(テスト・開発用途のみ)
アクセス制御適用されない

開発中のWebアプリをチームに共有したり、Webhookの受信テストに一時的に使う用途に向いています。SSHやTCPのトンネルには対応していないため、それらが必要な場合は独自ドメインでのNamed Tunnel構築が必要です(出典: Cloudflare Quick Tunnels)。

対応プロトコルと制限事項

Cloudflare Tunnelがサポートするプロトコルと、利用上の注意点を整理します。

プロトコル対応状況用途例
HTTP / HTTPS対応(標準)Webアプリ、API
SSH対応リモートサーバー管理
RDP対応Windowsリモートデスクトップ
TCP対応データベース接続、カスタムアプリ
UDPパブリックホスト名では非対応(WARP-to-Tunnel構成で対応)VoIP、ゲーム
SMB対応(TCP経由)ファイル共有

HTTP以外のプロトコル(SSH、RDP、TCP)を利用する場合、クライアント側にもcloudflaredまたはWARPクライアントの導入が必要です。HTTP/HTTPSのみ、ブラウザから直接アクセスできます。

UDPトラフィックを扱いたい場合(VoIPやゲームなど)は、WARP-to-Tunnel構成でプライベートネットワークを構築する必要があります。Public Hostname経由のルーティングではUDPは転送されません(出典: Cloudflare Tunnel Protocols)。

Minecraftサーバーの公開に関する注意点

MinecraftのJava EditionはTCP(デフォルトポート25565) を使用するため、Cloudflare TunnelのTCPプロキシ機能で技術的には公開できます。ただし、接続するプレイヤー側にもcloudflaredのインストールが必要な点に注意してください。

Cloudflareの旧利用規約Section 2.8(非HTMLトラフィックの制限)は2023年に撤廃されています(出典: Cloudflare Blog)。現在の規約ではトンネル経由のTCPプロキシについて明示的な禁止事項はありませんが、大量のトラフィックを流す場合はアカウント制限を受ける可能性がゼロではありません。

クライアント側に追加ソフトなしでMinecraftサーバーを公開したい場合は、Cloudflare Spectrumが公式の選択肢です。Proプラン($20/月)以上で利用でき、月5GBまでのトラフィックが無料枠に含まれます(超過分は$1.00/GB)。DDoS攻撃トラフィックは非課金です(出典: Cloudflare Spectrum for Minecraft)。

Bedrock EditionはUDPベースのため、Public Hostname経由のCloudflare Tunnelでは対応できません。WARP-to-Tunnel構成のプライベートネットワーク経由で接続するか、Spectrum(UDP対応)の利用が必要です。

VPN・類似サービスとの比較

自宅サーバーへのリモートアクセス手段として、Cloudflare Tunnel以外にも選択肢があります。用途別の特徴を比較します。

観点Cloudflare TunnelTailscaleWireGuard(自前)ngrok
主な用途サービス公開 + リモートアクセスデバイス間VPNデバイス間VPN一時的なトンネル
IPアドレス秘匿あり(Cloudflare CDN経由)なし(P2P接続)なしあり
不特定多数への公開可能不可(メッシュVPN)不可(ポイント接続)可能
DDoS防御あり(Cloudflare WAF活用可)なしなし一部あり
暗号化方式CloudflareエッジでTLS終端エンドツーエンド(P2P)エンドツーエンドngrokエッジでTLS終端
クライアント側ソフトHTTP系は不要 / SSH等は要必要必要HTTP系は不要
無料枠無制限トンネル + 50ユーザー100デバイスまで無料(自前構築)1エージェント
設定の容易さやや簡単簡単やや難非常に簡単

Webサービスやアプリを不特定多数に公開する場合はCloudflare Tunnelが最適です。CDN・WAF・DDoS防御がそのまま適用されるため、別途セキュリティ対策を構築する必要がありません。

一方、チーム内のデバイス間でプライベートネットワークを構築する用途ではTailscaleやWireGuardのほうが適しています。特にTailscaleとWireGuardはP2Pのエンドツーエンド暗号化を採用しており、中間サーバーがトラフィック内容を参照できない設計です。Cloudflare TunnelはCloudflareのエッジサーバーでTLSを終端するため、Cloudflareがトラフィック内容を技術的に参照可能な構造になっています。プライバシーを最優先する用途ではこの違いを考慮してください。

速度とパフォーマンス

Cloudflare Tunnelを経由した通信は、Cloudflareのエッジサーバーを中継するため、直接通信と比べてレイテンシが若干増加します。

コミュニティの実測報告では、通常のWeb閲覧やSSH接続では体感差がほぼないものの、大容量ファイルの転送(数GB単位) では速度低下が顕著になるケースが報告されています。

速度を改善するためのポイントをまとめます。

  • cloudflaredのプロトコルをQUICにする(デフォルトで有効):TCP接続よりヘッドオブラインブロッキングの影響が小さい
  • cloudflaredを最新版に保つ:パフォーマンス改善が継続的にリリースされている
  • Cloudflareのエッジとの地理的距離:日本国内のサーバーであれば東京リージョンのエッジが自動選択されるため問題になりにくい
  • 同時接続数の管理cloudflaredのレプリカ(複数インスタンス)を起動すると負荷分散が可能

Cloudflare Tunnelの帯域には公式な上限値は公開されておらず、Freeプランでも意図的なスロットリングは行われていないとされています。ただし、Freeプランではリクエストボディのサイズ上限が約100MBに設定されています(Proプランは200MB、Businessプランは500MB)。大容量ファイルのアップロードがあるサービスでは、この制限に注意が必要です。

また、1つのトンネルあたりの同時接続数は100コネクションが上限です。各コネクション上では数千リクエスト/秒の多重化が可能なため、通常のWebサービスでは問題になりませんが、高トラフィックな環境では最大25レプリカまでcloudflaredインスタンスを並列起動して負荷を分散できます(出典: Cloudflare Tunnel capacity)。

cloudflaredの自動起動とサービス登録

サーバーの再起動後もトンネルを維持するために、cloudflaredをシステムサービスとして登録します。

systemdでの登録(Linux)

sudo cloudflared service install <YOUR_TOKEN>
sudo systemctl enable cloudflared
sudo systemctl start cloudflared

Dockerの場合

docker run--restart unless-stoppedを追加します。

docker run -d --restart unless-stopped --network host \
  cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <YOUR_TOKEN>

Docker Composeの場合

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    network_mode: host
    command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN}

アクセス制限の設定(Cloudflare Access)

トンネルで公開したサービスに認証を追加する手順です。

ステップ1: Accessアプリケーションの作成

Zero Trustダッシュボードの Access > Applications から「Add an application」をクリックし、「Self-hosted」を選択します。

ステップ2: ポリシーの設定

アプリケーションドメイン(例: ssh.example.com)を指定し、許可するユーザーの条件を設定します。

設定例:

ルール種別条件効果
AllowEmails ending in @example.com特定ドメインのメールアドレスのみ許可
AllowGitHub Organization: my-orgGitHub組織のメンバーのみ許可
BlockCountry: 特定の国国単位でブロック

Freeプランでは、メールアドレスへのワンタイムパスワード送信による認証が利用できます。Google、GitHub、OktaなどのIdP連携もFreeプランで設定可能です。

トラブルシューティング

トンネルが接続されない

  • cloudflaredのログを確認:cloudflared tunnel run --loglevel debug --token <TOKEN>
  • ファイアウォールでUDP 7844番ポート(QUIC)の送信がブロックされていないか確認
  • QUICがブロックされている環境では--protocol http2オプションでフォールバック可能

Public Hostnameにアクセスしても502エラーが返る

  • オリジンサーバーが起動しているか確認
  • Tunnel設定のService URLが正しいか確認(Dockerの場合host.docker.internalや実IPが必要な場合がある)
  • HTTPS接続の場合、オリジンが自己署名証明書を使っている場合は「No TLS Verify」オプションを有効にする

SSH接続がタイムアウトする

  • クライアント側にcloudflaredがインストールされているか確認
  • ~/.ssh/configのProxyCommandが正しいか確認
  • Cloudflare AccessのポリシーでSSHが許可されているか確認

まとめ

Cloudflare Tunnelは、パブリックIPを露出させずにサーバーをインターネットに公開できるサービスです。Freeプランでもトンネル数に制限がなく、50ユーザーまでのアクセス制御も無料で利用できるため、個人の自宅サーバー運用から小規模チームのリモートアクセスまで幅広く対応します。

導入時のポイントを振り返ります。

  • ドメインをCloudflareのネームサーバーに移管し、Zero TrustダッシュボードからGUIでトンネルを作成
  • SSHやRDPはクライアント側にもcloudflaredが必要
  • ドメインなしでもTryCloudflareで一時トンネルを作成可能
  • Webサービスの公開にはCDN・WAF・DDoS防御がそのまま適用される
  • VPNの代替としても機能するが、メッシュネットワーク構築が主目的ならTailscaleが向いている

セキュリティ対策を別途構築する手間を省きつつ、自宅のサーバーやローカル環境をインターネットに安全に公開できる仕組みとして、Cloudflare Tunnelは有力な選択肢です。