自宅サーバーやローカルの開発環境を外部に公開したいとき、従来はポート開放やVPN構築が必要でした。しかし、それにはセキュリティリスクやルーター設定の煩雑さが伴います。

そこで注目されているのがCloudflare Tunnel(旧称Argo Tunnel)です。ポートを一切開放せずに、ローカルで動いているWebアプリケーションをインターネットに安全に公開できる仕組みですね。

この記事では、Cloudflare Tunnelの基本的な仕組みから実際の設定手順、そして具体的な活用シーンまで、一通り紹介してみたいと思います。

Cloudflare Tunnelの基本的な仕組み

Cloudflare Tunnelは、ローカル環境にインストールしたcloudflaredというデーモンが、Cloudflareのエッジネットワークとの間に暗号化されたアウトバウンド接続を確立する仕組みです。

ポイントは「アウトバウンド」という部分でして、サーバー側からCloudflareに向かって接続を張りに行くので、インバウンドのポート開放が不要になります。外部からの通信はすべてCloudflareのCDNを経由してトンネルに流れてくるため、オリジンサーバーのIPアドレスが直接露出することもありません。

一般的なリバースプロキシとの違いは、ファイアウォールやNATの内側にあるサーバーでも、追加のネットワーク設定なしで公開できる点です。これは結構大きなメリットだと感じました。

Cloudflare Tunnelのセットアップ手順

実際の設定はそこまで複雑ではありません。大まかな流れを見ていきましょう。

1. cloudflaredのインストール

まずはcloudflaredをインストールします。Linux、macOS、Windowsそれぞれにパッケージが用意されていて、Dockerイメージもあります。

# Debian/Ubuntu
curl -L https://pkg.cloudflare.com/cloudflared-stable-linux-amd64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb

# macOS
brew install cloudflared

2. Cloudflareアカウントへの認証

インストール後、cloudflared tunnel loginを実行するとブラウザが開いて、Cloudflareアカウントとの紐付けが行われます。認証が完了すると証明書ファイルがローカルに保存されるので、以降の操作でこれが使われることになります。

3. トンネルの作成と設定

トンネルを作成して、ローカルサービスとDNSレコードを紐付けます。

# トンネル作成
cloudflared tunnel create my-tunnel

# 設定ファイル(~/.cloudflared/config.yml)
tunnel: <トンネルID>
credentials-file: ~/.cloudflared/<トンネルID>.json

ingress:
  - hostname: app.example.com
    service: http://localhost:3000
  - service: http_status:404

# DNS設定
cloudflared tunnel route dns my-tunnel app.example.com

# 起動
cloudflared tunnel run my-tunnel

これだけで、app.example.comにアクセスするとローカルの3000番ポートに繋がるようになります。SSL証明書もCloudflareが自動で処理してくれるので、Let’s Encryptの設定も不要です。

Cloudflare Tunnelの主な活用シーン

実際にどんな場面で使えるのか、いくつか具体的なケースを挙げてみます。

自宅サーバーの公開

自宅のNASやRaspberry Piで動かしているサービスを外出先からアクセスしたい場合、これまではSSHトンネリングやダイナミックDNSを使うのが一般的でした。Cloudflare Tunnelなら、ISPの制限やCGNATの影響を受けずに公開できます。

開発環境の一時的な共有

チームメンバーやクライアントにローカルの開発中サイトを見せたい場面は結構あると思います。ngrokの代替として使えて、しかも無料プランでも利用可能なのがありがたいところですね。

マイクロサービスのゼロトラスト接続

Cloudflare Accessと組み合わせると、社内アプリケーションへのアクセスにVPNを使わずにゼロトラストモデルを実現できます。従来型のVPNは「一度接続したら何でもアクセスできる」という問題がありましたが、アプリケーション単位でアクセス制御できるのは大きな進歩です。

ngrokやtailscaleとの違い

似たようなツールとしてngrokやtailscaleがよく比較されます。それぞれの特徴を整理してみました。

ngrokは手軽さが魅力で、1コマンドで一時的なURLを発行できます。ただし、独自ドメインの利用や常時稼働には有料プランが必要になりますね。

tailscaleはWireGuardベースのメッシュVPNで、デバイス間の直接接続に強みがあります。ただし、一般公開ではなくプライベートネットワーク構築が主な用途です。

Cloudflare Tunnelは、CloudflareのCDN・WAF・DDoS対策をそのまま利用できる点が最大の差別化ポイントかなと思います。パフォーマンスとセキュリティを両立させたい場合は、かなり有力な選択肢になるでしょう。

Cloudflare Tunnelのセキュリティ面で気をつけたいこと

便利な仕組みですが、いくつか注意点もあります。

まず、Cloudflare Tunnelを使うということは、すべての通信がCloudflareを経由するということです。E2E暗号化されているとはいえ、トラフィックの可視性をCloudflareに委ねることになるので、コンプライアンス要件が厳しい環境では検討が必要かもしれません。

また、cloudflaredのcredentialsファイルが漏洩すると、トンネルを乗っ取られるリスクがあります。ファイルの権限管理やシークレット管理ツールとの連携は忘れずに設定しておきたいところです。

さらに、Cloudflare Accessを併用しない場合、トンネルで公開したサービスは誰でもアクセスできる状態になります。認証の仕組みは必ず別途用意しましょう。

Cloudflare Tunnelの料金体系

Cloudflare Tunnelの基本機能は無料プラン(Free)で利用可能です。以前はArgo Smart Routingの有料オプションとセットでしたが、現在は切り離されています。

ただし、Cloudflare Accessのポリシー管理やログの詳細分析など、エンタープライズ向け機能を使うにはZero Trustプラン(Teams Standard以上)が必要になってきます。個人利用や小規模プロジェクトなら、無料の範囲で十分カバーできるはずです。

まとめ

Cloudflare Tunnelは、ポート開放やVPN構築の手間を省きつつ、CDN・WAF・DDoS対策を自動的に適用できる便利なツールです。自宅サーバーの公開から開発環境のセキュアな共有まで、幅広い用途で活用できます。

特に、ISPの制限でポート開放ができない環境や、セキュリティ要件が厳しいプロジェクトでは、検討する価値が十分にあると感じました。公式ドキュメント(Cloudflare Tunnel Docs)も充実しているので、興味のある方は一度試してみてはいかがでしょうか。