自宅にサーバーを立てたものの、外部からアクセスする段階でルーターのポート開放やDDNS設定、セキュリティ対策に頭を悩ませるケースは少なくありません。グローバルIPを直接インターネットに公開すれば、ポートスキャンやDDoS攻撃のリスクが常につきまといます。

Cloudflare Tunnelは、自宅サーバー側からCloudflareのエッジネットワークへアウトバウンド接続を確立するだけで、ポート開放を一切せずにHTTP・SSH・RDPなどのサービスを外部に安全公開できる仕組みです。個人利用であれば無料枠の範囲で十分に運用できます。

Cloudflare Tunnelの動作原理

Cloudflare Tunnelでは、自宅サーバー上にインストールした軽量デーモン「cloudflared」がCloudflareのグローバルネットワーク(世界335都市以上に展開)へアウトバウンド専用の暗号化接続を確立します(出典: Cloudflare公式ドキュメント)。

ポート開放方式の通信経路:

外部ユーザー → インターネット → ルーター(ポート開放) → 自宅サーバー

Cloudflare Tunnel方式の通信経路:

外部ユーザー → Cloudflareエッジ ←(アウトバウンド接続)← cloudflared ← 自宅サーバー

cloudflaredはTLS/QUICプロトコルでCloudflareエッジと通信し、デフォルトで4本のコネクションを維持します。外部ユーザーのリクエストはCloudflareエッジが受け取り、暗号化トンネルを経由して自宅サーバーに転送される仕組みです。

この構成により、自宅サーバーのIPアドレスはインターネット上に露出しません。ルーターのファイアウォールはインバウンドを完全に閉じたまま運用できるため、攻撃対象面(アタックサーフェス)が大幅に縮小します。

ポート開放やVPNとの違い

自宅サーバーの外部公開手段を比較すると、Cloudflare Tunnelはセキュリティ・コスト・運用容易性の面で明確な強みを持ちます。

比較観点Cloudflare Tunnelポート開放+DDNSWireGuardTailscalengrok
ルーターのポート開放不要必須必須(UDP 1ポート)不要不要
自宅IPの秘匿Cloudflare CDN経由で秘匿露出する露出するP2P接続で秘匿ngrokエッジ経由で秘匿
DDoS防御Cloudflareが自動緩和なしなしなし有料プランのみ
SSL証明書自動発行・更新自分で管理(Let’s Encrypt等)不要(VPN内通信)自動(MagicDNS)自動
不特定多数への公開対応対応VPN参加者のみFunnel機能で一部対応対応
独自ドメイン必要任意不要不要有料プランで対応
無料枠50ユーザーまで無制限無料OSS(自前構築)100デバイスまで接続数制限あり
向いている用途Webサービス公開全プロトコルチーム内VPNデバイス間VPN開発中の一時公開

ポート開放+DDNSは自宅のグローバルIPが直接露出するため、ポートスキャンやブルートフォース攻撃の対象になりやすく、個人運用ではセキュリティ維持が負担です。

WireGuardはエンドツーエンド暗号化で通信の秘匿性が高い一方、VPN参加者以外にサービスを公開する用途には向きません。

TailscaleはWireGuardベースで導入が容易ですが、主な用途はデバイス間のプライベートネットワーク構築です。Funnel機能で外部公開も可能になりましたが、Cloudflare TunnelほどのCDN・WAF連携はありません。

ngrokは開発時の一時公開に便利ですが、無料枠では接続数やデータ転送に厳しい制限があり、常時稼働の本番用途にはコストがかかります。

Cloudflare Tunnelは「不特定多数へのサービス公開」と「セキュリティ」の両立が求められる自宅サーバー運用に最も適した選択肢の一つです。

料金体系と無料で使える範囲

Cloudflare TunnelはCloudflare Zero Trustプラットフォームの一機能として提供されています(出典: Cloudflare Zero Trust料金ページ)。

プラン月額認証ユーザー上限適した規模
Free無料50ユーザー個人・少人数
Pay-as-you-go$7/ユーザー/月無制限中小チーム
Contractカスタム見積もり無制限大規模組織

個人で自宅サーバーを運用する場合、Freeプランの50ユーザー枠で十分まかなえます。ここでの「ユーザー」はCloudflare Accessの認証ユーザー数を指すため、Webサイトを認証なしで一般公開するだけであればユーザー数の上限は関係しません。

Tunnel自体の利用に追加課金は発生せず、トンネル数に上限もありません。帯域幅に対する明示的な制限もFreeプランには設定されていません。ただし、Cloudflareの利用規約では、Free・Pro・BusinessプランにおいてHTMLコンテンツ以外の大容量ファイル(動画配布等)をCDNキャッシュで大量配信する用途に制限がある点は留意が必要です。大量のメディア配信を想定する場合は、Cloudflare Stream等の専用サービスの利用を検討してください。

セットアップ前に用意するもの

Cloudflare Tunnelの構築を始める前に、以下を準備してください。

  • 独自ドメイン: Cloudflare Tunnelの恒久運用には独自ドメインが必須です。年額1,000〜2,000円程度の安価なドメインで問題ありません。Cloudflare Registrarでは原価に近い価格でドメインを取得・維持できます
  • Cloudflareアカウント: dash.cloudflare.com から無料で作成できます
  • DNSのCloudflare移管: ドメインのネームサーバーをCloudflare指定のネームサーバーに変更します。ドメインレジストラの管理画面から設定してください
  • 自宅サーバー: Linux(Ubuntu、Debian、CentOS等)、macOS、Windows、Dockerが動作するマシン。Raspberry Piでも動作します

ドメインなしで動作を試したい場合は、TryCloudflare機能で一時的なトンネルを作成できます(後述)。ただし、ランダムURLが毎回変わるため永続利用には向きません。

cloudflaredのインストール手順

cloudflaredは主要なOS・プラットフォームに対応しています(出典: Cloudflare Downloads)。

Debian / Ubuntu

sudo mkdir -p --mode=0755 /usr/share/keyrings
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 any main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt-get update && sudo apt-get install cloudflared

macOS(Homebrew)

brew install cloudflared

Windows(winget)

winget install Cloudflare.cloudflared

Docker

docker pull cloudflare/cloudflared:latest

インストール後にバージョンを確認して正常動作を検証します。

cloudflared --version

ダッシュボード(GUI)でトンネルを作成する

Cloudflare Zero Trustダッシュボードを使う方法が最も直感的で、初回セットアップにおすすめです。

手順1: Zero Trustダッシュボードにアクセス

one.dash.cloudflare.com にログインし、左メニューの NetworksTunnels を選択します。初回アクセス時は組織名(任意の文字列)の入力とプラン選択(Free)を求められます。

手順2: トンネルの新規作成

「トンネルを追加する」をクリックし、トンネルの種類で Cloudflared を選択します。トンネル名(例: home-server)を入力して次に進むと、インストール用のトークン付きコマンドが表示されます。

手順3: 自宅サーバーでcloudflaredを起動

ダッシュボードに表示されたコマンドを自宅サーバーのターミナルで実行します。

sudo cloudflared service install <YOUR_TUNNEL_TOKEN>

このコマンドにより、cloudflaredがsystemdサービスとして自動登録されます。OS起動時にトンネルが自動的に復旧するため、手動での起動操作は以降不要です。

手順4: Public Hostnameの設定

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

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

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

設定ファイル(CLI)でトンネルを管理する

複数サービスの一括管理や、設定をGitでバージョン管理したい場合はCLI方式が有用です。

Cloudflareへの認証

cloudflared tunnel login

ブラウザが開いてCloudflareアカウントとの認証が行われます。完了すると ~/.cloudflared/cert.pem に証明書が保存されます。

トンネルの作成

cloudflared tunnel create home-server

トンネルIDが発行され、~/.cloudflared/<TUNNEL_ID>.json に認証情報が保存されます。

config.ymlの作成

~/.cloudflared/config.yml を作成し、トンネルのルーティングを定義します。

tunnel: <TUNNEL_ID>
credentials-file: /home/<user>/.cloudflared/<TUNNEL_ID>.json

ingress:
  # Webアプリ
  - hostname: app.example.com
    service: http://localhost:8080
  # SSH
  - hostname: ssh.example.com
    service: ssh://localhost:22
  # NAS(自己署名証明書の場合)
  - hostname: nas.example.com
    service: https://192.168.1.100:443
    originRequest:
      noTLSVerify: true
  # キャッチオールルール(必須)
  - service: http_status:404

ingress セクションで複数のホスト名とローカルサービスの対応を定義します。末尾のキャッチオールルールは必須で、どのホスト名にも一致しないリクエストへのデフォルト応答を指定します。

DNSレコードの登録とトンネル起動

cloudflared tunnel route dns home-server app.example.com
cloudflared tunnel route dns home-server ssh.example.com
cloudflared tunnel route dns home-server nas.example.com
cloudflared tunnel run home-server

Docker Composeによる運用

コンテナ環境でcloudflaredと他のサービスを一緒に管理する構成例です。

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}
    depends_on:
      - webapp

  webapp:
    image: nginx:latest
    expose:
      - "80"

.env ファイルにトンネルトークンを記載します。

TUNNEL_TOKEN=eyJhIjoixxxxxxxxxxxxxxxx

この構成ではcloudflaredコンテナとWebアプリコンテナが同一Dockerネットワーク上で動作するため、ダッシュボードのPublic Hostname設定で http://webapp:80 のようにコンテナ名でサービスを指定できます。

--network host を使う場合はホストマシンの localhost がそのまま参照されるため、localhost:ポート番号 で指定します。ブリッジネットワーク(デフォルト)では localhost がコンテナ自身を指すため、コンテナ名またはホストマシンのIPアドレスを使用してください。

SSH接続をトンネル経由にする

SSHポート(22番)をインターネットに露出させずに、Cloudflare Tunnel経由でSSHアクセスを実現する方法です。

サーバー側

ダッシュボードのPublic Hostnameまたはconfig.ymlで、SSHサービスを追加します。

ingress:
  - hostname: ssh.example.com
    service: ssh://localhost:22

クライアント側

接続元PCにもcloudflaredをインストールし、~/.ssh/config にProxyCommandを設定します。

Host ssh.example.com
    ProxyCommand cloudflared access ssh --hostname %h
    User your-username

以降は通常のsshコマンドで接続できます。

ssh ssh.example.com

ブラウザからのSSHアクセス

Cloudflare Accessで「Browser rendering」を有効にすると、Webブラウザ上でSSHターミナルが利用可能になります。クライアント側にcloudflaredのインストールが不要になるため、出先の端末からブラウザだけでサーバー管理ができます。

Cloudflare Accessで認証を追加する

トンネルで公開したサービスは、デフォルトではURLを知っている全員がアクセスできる状態です。管理画面やSSHなど非公開サービスには、Cloudflare Accessによる認証の追加を強く推奨します。

設定の流れ

  1. Zero Trustダッシュボードで AccessApplicationsAdd an application を選択
  2. Self-hostedを選び、対象ドメイン(例: ssh.example.com)を指定
  3. ポリシーを作成(例: 自分のメールアドレスのみ許可)

利用可能な認証方式

方式概要向いている場面
ワンタイムPIN(メール送信)登録メールアドレスにPINコードを送信個人利用で最も手軽
Google OAuthGoogleアカウントで認証Gmail利用者
GitHub OAuthGitHubアカウントで認証開発者・OSSプロジェクト
SAML / OIDC企業のIdPと連携組織利用

個人運用ではワンタイムPIN認証が最も簡単です。自分のメールアドレスだけをAllowリストに登録すれば、事実上の自分専用アクセス環境になります。Freeプランで50ユーザーまで利用可能です。

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

Cloudflare Tunnelが扱えるプロトコルと制限を整理します。

プロトコルPublic Hostname経由Private Network経由代表的な用途
HTTP / HTTPS対応対応Webアプリ、API
SSH対応対応サーバー管理
RDP対応対応Windowsリモートデスクトップ
TCP(任意ポート)対応対応DB接続、カスタムアプリ
UDP非対応WARP経由で対応VoIP、ゲーム
SMBTCP経由で対応対応ファイル共有

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

UDPトラフィック(ゲームサーバー、VoIP等)はPublic Hostname方式では転送されません。WARP-to-Tunnel構成のプライベートネットワーク経由で扱うか、Cloudflare Spectrum(有料)を利用します。

ドメインなしで試す方法(TryCloudflare)

独自ドメインを持っていなくても、TryCloudflareで一時的にCloudflare Tunnelの動作を体験できます。

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

実行すると https://ランダム文字列.trycloudflare.com のURLが発行され、ローカルの3000番ポートがインターネットに公開されます。Cloudflareアカウントも不要です。

TryCloudflareはHTTP/HTTPSのみ対応で、SSH・TCP等は利用できません。URLは実行のたびに変わり、コマンド停止後は約5分でDNSレコードも削除されます。開発中のWebアプリを一時的にチームに共有する用途や、Webhookの受信テストに便利です。

パフォーマンスの特性と最適化

Cloudflare TunnelはCloudflareエッジを中継する構造上、直接接続と比べてわずかなレイテンシが加算されます。国内のCloudflareエッジ(東京・大阪)を経由する場合、追加レイテンシは通常1〜5ms程度で、通常のWebブラウジングやSSH操作では体感差はほとんどありません。

速度改善のポイント

  • QUICプロトコルの利用: cloudflaredはデフォルトでQUICを使用します。HTTP/2よりヘッドオブラインブロッキングの影響が少なく、多重化通信に有利です
  • Brotli圧縮の有効化: Cloudflareダッシュボードから有効にすると、テキスト系コンテンツの転送量を削減できます
  • CDNキャッシュの活用: 静的ファイル(画像・CSS・JS)はCloudflareのCDNキャッシュが自動適用され、オリジンサーバーの負荷軽減と応答高速化に寄与します
  • cloudflaredの最新版維持: パフォーマンス改善が継続的にリリースされています

大容量ファイル(数GB単位)の転送ではスループット低下が顕著になる場合があります。NASのファイル同期など大容量データの定期転送が主用途の場合、WireGuardやTailscaleの併用も検討してください。

よくある問題と対処法

トンネルがCloudflareに接続できない

  • ファイアウォールでアウトバウンドの7844番ポート(TCP/UDP両方)が許可されているか確認します。QUICはUDP、HTTP/2フォールバック時はTCPを使用します。443番ポート(TCP)はソフトウェア更新やAccess JWT検証用のオプションポートです
  • 企業ネットワーク等でQUICがブロックされている場合は --protocol http2 オプションでHTTP/2にフォールバックできます
  • cloudflared tunnel run --loglevel debug でデバッグログを出力して原因を特定します

502 Bad Gatewayが表示される

  • ローカルサービスが起動しているか確認します(例: curl localhost:8080
  • config.ymlのservice URLでHTTPとHTTPSを間違えていないか確認します
  • Docker環境では localhost がコンテナ自身を指す場合があるため、コンテナ名またはホストIPで指定します

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

  • クライアント側にcloudflaredがインストールされ、~/.ssh/config のProxyCommandが正しいか確認します
  • Cloudflare Accessのポリシーで対象ドメインがAllowされているか確認します
  • sshdが22番ポートで待ち受けていることを ss -tlnp | grep 22 で確認します

オリジンサーバーが自己署名証明書を使用している場合

config.ymlの originRequest セクションに noTLSVerify: true を追加するか、ダッシュボードの設定で「No TLS Verify」を有効にします。

セキュリティ強化の推奨設定

Cloudflare Tunnelは構造的にセキュリティが高い仕組みですが、さらに安全性を高めるための設定があります。

  1. Cloudflare Accessの有効化: 管理画面・SSH・NASなど非公開サービスには必ずAccessの認証を追加してください。トンネルだけでは「URLを知っている全員がアクセスできる」状態です
  2. WAFの活用: CloudflareのFreeプランでもマネージドルールセットが利用可能です。SQLインジェクションやXSSの基本的な防御が追加されます
  3. Botスコアリング: 不要なボットアクセスをCloudflareのBotスコアで自動フィルタリングできます
  4. アクセスログの監視: Zero TrustダッシュボードのLogsセクションで定期的にアクセスパターンを確認し、不審なリクエストを検知します
  5. cloudflaredの更新: ダッシュボードから作成したトンネルは自動更新が有効です。CLI管理の場合は手動で定期更新してください

自宅サーバーの具体的な活用例

Webアプリケーション公開

Next.js、Rails、Django等の自作Webアプリやブログ(WordPress等)をインターネットに公開する最も基本的な用途です。SSL/TLS証明書はCloudflareが自動発行・更新するため、Let’s Encrypt等の設定は不要です。

NASへのリモートアクセス

NextcloudやSynology NASにリモートからアクセスする構成です。NASが自己署名証明書を使用している場合は noTLSVerify: true を設定します。Cloudflare Accessを組み合わせることで、自分だけがアクセスできるプライベートクラウドストレージとして運用できます。

開発環境の一時共有

TryCloudflareを使えば、ローカルの開発サーバーをドメイン不要で即座にチームや顧客に共有できます。

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

ランダムURLが発行され、コマンドを停止するまで有効です。

ホームオートメーションのリモート制御

Home AssistantやNode-REDなどのスマートホーム管理ダッシュボードをCloudflare Tunnel + Access認証で外部公開すれば、外出先からも安全に自宅の機器を管理できます。

まとめ

Cloudflare Tunnelは、自宅サーバーをインターネットに公開する際の「ポート開放」「IPアドレス露出」「DDoSリスク」という3つの課題を同時に解決できるサービスです。Freeプラン(50ユーザーまで無料)で、Webアプリケーション公開・SSH接続・NASリモートアクセスなど幅広いユースケースに対応できます。

導入は5つのステップで完了します。

  1. Cloudflareアカウント作成とドメイン追加
  2. ネームサーバーのCloudflareへの変更
  3. Zero Trustダッシュボードでトンネル作成
  4. 自宅サーバーへのcloudflaredインストール
  5. Public Hostnameでサービスのルーティング設定

Cloudflare Accessを組み合わせれば、認証付きのセキュアなアクセス環境を追加コストなしで構築できます。VPNの構築・管理が不要になり、ブラウザだけで自宅のサーバーにアクセスできる利便性は、一度体験すると手放せません。

公式ドキュメント: Cloudflare Tunnel