無料でセキュア!cloudflaredを使ったリモートアクセス環境の構築術
はじめに
テレワークの普及や、趣味で立ち上げた自宅サーバーへのアクセス需要の高まりにより、リモートアクセスは現代のIT環境において不可欠な技術となりました。しかし、従来のリモートアクセス手法には、常にセキュリティ上の懸念がつきまといます。
最も一般的な方法は、ルーターの「ポート開放」でしょう。特定のポートをインターネットに向けて開くことで、外部から自宅のPCやサーバーにアクセスできるようにする手法です。シンプルである一方、これは自宅の玄関のドアに鍵をかけず、特定の訪問者だけが入ってきてくれることを祈るようなものです。悪意のある攻撃者は常にインターネット上をスキャンしており、開かれたポートは格好の標的となります。ブルートフォース攻撃(総当たり攻撃)や、サービスの脆弱性を突いた攻撃を受けるリスクが飛躍的に高まるのです。
この問題を解決するために「VPN (Virtual Private Network)」を構築する方法もありますが、VPNサーバーのセットアップは専門知識を要し、設定も複雑です。また、維持管理にも手間がかかります。
そこで登場するのが、本記事で徹底解説する Cloudflare Tunnel (旧称: Argo Tunnel) です。Cloudflareが提供するこのサービスは、「ゼロトラストセキュリティ」という現代的な思想に基づいて設計されており、ポートを一切開放することなく、無料で、かつ極めて安全に内部ネットワーク上のリソース(Webサーバー、SSH、リモートデスクトップなど)を外部に公開することを可能にします。
Cloudflare Tunnelは、ローカルサーバーからCloudflareの堅牢なグローバルネットワークへ向けて「アウトバウンド接続」のトンネルを確立します。外部からの着信(インバウンド接続)をすべてブロックしたまま、Cloudflareが仲介役となって安全な通信路を確保するため、攻撃者があなたのサーバーに直接到達する経路が存在しなくなるのです。
この記事では、Cloudflare Tunnelを支えるcloudflared
というコマンドラインツールを使い、リモートアクセス環境をゼロから構築する手順を、初心者の方にも分かりやすく、しかし詳細に解説します。
この記事を読み終える頃には、あなたは以下の知識と技術を習得しているでしょう。
- Cloudflare Tunnelがなぜ安全なのか、その仕組みの理解
- Webサーバーを安全にインターネットへ公開する具体的な手順
- SSHやリモートデスクトップ(VNC/RDP)へ安全にアクセスする方法
- Cloudflare Accessを利用して、特定のユーザーのみにアクセスを許可する強固な認証設定
ポート開放の不安から解放され、無料で実現できる最高レベルのセキュアなリモートアクセス環境を手に入れる旅へ、さあ、出発しましょう。
第1章: Cloudflare Tunnel (cloudflared) とは何か?
具体的な構築手順に入る前に、Cloudflare Tunnelがどのような技術であり、なぜそれが安全なのかを理解することは非常に重要です。この章では、その背景にある「ゼロトラストセキュリティ」という考え方と、Cloudflare Tunnelの具体的な仕組みを解説します。
1-1. ゼロトラストセキュリティという考え方
従来のネットワークセキュリティは、「境界型セキュリティモデル」と呼ばれる考え方が主流でした。これは、社内ネットワーク(信頼できる内部)とインターネット(信頼できない外部)の間にファイアウォールという「城壁」を築き、その城壁の内側は安全地帯とみなすアプローチです。城の周りに堀をめぐらせるイメージから、「城と堀 (Castle and Moat)」モデルとも呼ばれます。
しかし、このモデルは現代の働き方やIT環境にそぐわなくなってきました。クラウドサービスの利用、モバイルデバイスの普及、そしてテレワークの常態化により、「内部」と「外部」の境界は曖昧になりました。自宅やカフェから社内リソースにアクセスする際、その通信は本当に安全でしょうか?一度VPNで城の中に入ってしまえば、そのユーザーは本当に信頼できるのでしょうか?
そこで生まれたのが「ゼロトラスト (Zero Trust)」という考え方です。その名の通り、「誰も、何も信頼しない」ことを前提とします。ゼロトラストの原則は「決して信頼せず、常に検証する (Never Trust, Always Verify)」です。
これは、ネットワークの場所(社内か社外か)に関わらず、リソースへのすべてのアクセス要求を信頼できないものとみなし、その都度、厳格な認証と認可を行うというアプローチです。ユーザーのID、デバイスの状態、アクセス先のアプリケーションといった様々な要素を検証し、許可された最小限の権限のみを与えます。
Cloudflare Tunnelは、このゼロトラストの思想を具現化したサービスの一つなのです。
1-2. Cloudflare Tunnelの仕組み
では、Cloudflare Tunnelはどのようにしてゼロトラストを実現し、ポート開放を不要にしているのでしょうか。その鍵は「アウトバウンド接続」にあります。
従来のポート開放モデルの通信フローは以下の通りです。
- ユーザー (外部) → (インターネット) → 自宅ルーター (グローバルIP) → ローカルサーバー (プライベートIP)
- このフローを実現するため、ルーターは外部からの着信(インバウンド接続)を許可する必要があります。これが攻撃の侵入口となります。
一方、Cloudflare Tunnelの通信フローは全く異なります。
【通信フローの概念図】
[あなたのサーバー] <--(cloudflaredが確立したトンネル)--> [Cloudflareのグローバルネットワーク] <--(HTTPS)--> [ユーザー]
これをステップごとに見ていきましょう。
-
トンネルの確立:
あなたのサーバー(Linux, Windows, Macなど)にcloudflared
という軽量なデーモン(常駐プログラム)をインストールします。このcloudflared
は、起動するとCloudflareの最も近いデータセンターに向けて、アウトバウンド接続を開始します。つまり、サーバー側から外に出ていく接続です。この接続は暗号化され、永続的なトンネルを形成します。ほとんどの家庭用・企業用ファイアウォールは、内部から外部へのアウトバウンド接続を許可しているため、特別な設定変更は不要です。 -
ユーザーからのアクセス:
ユーザーがあなたのサービスに割り当てられたホスト名(例:service.your-domain.com
)にアクセスします。このドメインのDNSはCloudflareに向けられているため、リクエストはまずCloudflareのグローバルネットワーク(エッジ)に到達します。 -
Cloudflareによる中継:
リクエストを受け取ったCloudflareは、それがどのトンネル宛のものかを判断します。そして、ステップ1で確立されている永続的なトンネルを通じて、リクエストをあなたのサーバー上で稼働するcloudflared
に安全に転送します。 -
ローカルサービスへの転送:
cloudflared
は、受け取ったリクエストを、設定に基づいてローカルネットワーク上の適切なサービス(例:localhost:80
のWebサーバー)に転送します。
この仕組みにより、あなたのサーバーやルーターは、インターネットからのいかなるインバウンド接続も受け付ける必要がなくなります。ファイアウォールで全てのポートを閉じたままで、安全にサービスを公開できるのです。攻撃者はあなたのサーバーのグローバルIPアドレスを知ることすらできず、攻撃の糸口を見つけられません。
1-3. Cloudflare Tunnelの主な利点
この画期的な仕組みがもたらすメリットは計り知れません。
-
セキュリティの劇的な向上:
- ポート開放不要: 最大のメリットです。攻撃対象領域(アタックサーフェス)を最小限に抑えます。
- IPアドレスの隠蔽: あなたのサーバーのグローバルIPアドレスは公開されず、CloudflareのIPアドレスが盾となります。
- DDoS攻撃からの保護: Cloudflareの強力なDDoS防御機能が標準で適用されます。
- 暗号化: ユーザーとCloudflare間、Cloudflareとサーバー間の通信はすべてHTTPSで暗号化されます。
-
卓越した利便性:
- グローバルIPアドレス不要: 自宅のインターネット回線が動的IPアドレスであっても問題ありません。
cloudflared
が接続を維持します。 - 複雑な設定が不要: ルーターのポートフォワーディングやDDNS(ダイナミックDNS)の設定から解放されます。
- 無料で利用可能: 独自ドメインさえ持っていれば、Cloudflare Tunnelの基本機能はすべて無料で利用できます。
- マルチプロトコル対応: HTTP/HTTPSだけでなく、SSH, RDP, VNC, SMBなど、任意のTCPプロトコルに対応します。
- グローバルIPアドレス不要: 自宅のインターネット回線が動的IPアドレスであっても問題ありません。
-
パフォーマンス:
- CDN (Content Delivery Network): Cloudflareのグローバルネットワークがキャッシュサーバーとして機能し、静的コンテンツをユーザーの近くから配信することで、Webサイトの表示を高速化します。
このように、Cloudflare Tunnelはセキュリティ、利便性、パフォーマンスの三拍子が揃った、次世代のリモートアクセスソリューションなのです。
第2章: 準備するもの
構築を始める前に、いくつか必要なものを揃えましょう。
2-1. Cloudflareアカウント
当然ながら、Cloudflareのサービスを利用するためにはアカウントが必要です。まだ持っていない場合は、公式サイトからサインアップしてください。Free(無料)プランで、本記事で紹介する機能はすべて利用できます。 クレジットカードの登録も不要です。
2-2. 独自ドメイン
Cloudflare Tunnelを利用するには、あなた自身が所有するドメイン(例: your-domain.com
)が必要です。これは、Cloudflareがあなたのサービスを識別し、DNSレコードを管理するための土台となるからです。
もしドメインを持っていない場合は、お名前.com、Xserverドメイン、Google Domainsなどのドメイン登録サービス(レジストラ)で取得してください。年間1,000円~2,000円程度で取得できるものが多いです。
ドメインを取得したら、そのドメインをCloudflareに登録する作業が必要です。これは、ドメインの管理をレジストラからCloudflareに移すのではなく、「ネームサーバー」をCloudflareが指定するものに変更する作業です。Cloudflareの指示に従って、ドメインを購入したサービスの管理画面でネームサーバー情報を書き換えるだけで完了します。
2-3. リモートアクセスしたいサーバー/PC
トンネルを確立し、サービスを公開する元となるコンピューターです。
- OS: Linux (Debian, Ubuntu, CentOSなど), Windows (10, 11, Server), macOS に対応しています。Raspberry PiのようなARMベースのLinuxでも動作します。
- サービス: 公開したいサービス(例: NginxやApacheなどのWebサーバー、SSHサーバー)が、このコンピューター上で稼働している必要があります。
準備は以上です。それでは、いよいよ構築作業に入りましょう。
第3章: 基本的な構築手順 – Webサーバーを公開する
この章では、最も基本的なユースケースとして、ローカルで稼働しているWebサーバー(例: http://localhost:80
)を、http://sub.your-domain.com
というURLで安全にインターネットへ公開する手順をステップ・バイ・ステップで解説します。
3-1. cloudflaredのインストール
まず、サービスを公開したいサーバーにcloudflared
をインストールします。お使いのOSに合わせて以下のコマンドを実行してください。
Linux (Debian/Ubuntu)
“`bash
CloudflareのパッケージリポジトリGPGキーを追加
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
Cloudflareのパッケージリポジトリを追加
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-get update
sudo apt-get install cloudflared
“`
Linux (CentOS/RHEL/Fedora)
“`bash
RPMパッケージを直接ダウンロードしてインストール
sudo dnf install https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
もしくは yum を使用
sudo yum install https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
“`
macOS (Homebrewを使用)
bash
brew install cloudflare/cloudflare/cloudflared
Windows (Wingetを使用)
PowerShellまたはコマンドプロンプトを開き、以下のコマンドを実行します。
powershell
winget install --id=Cloudflare.cloudflared
インストールが完了したら、バージョンを確認して正しくインストールされたかチェックしましょう。
“`bash
cloudflared –version
例: cloudflared version 2024.1.5 (built 2024-01-26-15:48:47)
“`
3-2. Cloudflareへの認証
次に、cloudflared
をあなたのCloudflareアカウントに紐付けます。以下のコマンドを実行してください。
bash
cloudflared tunnel login
コマンドを実行すると、以下のようなメッセージと共にURLが表示されます。
“`
Please open the following URL and log in with your Cloudflare account:
https://dash.cloudflare.com/argotunnel?callback=…
If the browser loads the page but nothing happens, please attempt to login again.
“`
このURLをコピーしてブラウザで開きます。Cloudflareのログイン画面が表示されるので、ログインしてください。次に、このトンネルで使用するドメインを選択する画面が表示されます。準備した独自ドメインを選択し、「Authorize」をクリックします。
成功すると、ブラウザに「You have successfully logged in」と表示され、ターミナル側には「You have successfully logged into your Cloudflare account.」というメッセージが表示されます。
この操作により、~/.cloudflared/cert.pem
(Windowsの場合は %USERPROFILE%\.cloudflared\cert.pem
) という証明書ファイルが生成されます。これが、あなたのcloudflared
とCloudflareアカウントを繋ぐ鍵となります。
3-3. トンネルの作成
認証が完了したら、次は実際に通信路となる「トンネル」を作成します。トンネルには分かりやすい名前を付けましょう。ここでは my-web-tunnel
という名前にします。
bash
cloudflared tunnel create my-web-tunnel
このコマンドが成功すると、以下のような重要な情報が表示されます。
Tunnel credentials written to /home/user/.cloudflared/a1b2c3d4-e5f6-7890-1234-abcdef123456.json. The tunnel token is also available in the Cloudflare dashboard.
Created tunnel my-web-tunnel with id a1b2c3d4-e5f6-7890-1234-abcdef123456
ここで表示された ID (UUID) と、生成された JSONクレデンシャルファイル (a1b2c3d4-....json
) が非常に重要です。このファイルにはトンネルを認証するための秘密情報が含まれています。
3-4. 設定ファイルの作成
トンネルの具体的な動作(どのホスト名へのアクセスを、どのローカルサービスに転送するか)を定義するために、設定ファイルを作成します。
ホームディレクトリの .cloudflared
フォルダ内に config.yml
という名前でファイルを作成します。(フォルダがない場合は作成してください)
“`bash
Linux/macOS
mkdir -p ~/.cloudflared
nano ~/.cloudflared/config.yml
“`
config.yml
に以下の内容を記述します。
“`yaml
トンネルのUUID(自分のものに書き換える)
tunnel: a1b2c3d4-e5f6-7890-1234-abcdef123456
クレデンシャルファイルのパス(フルパスで指定)
credentials-file: /home/user/.cloudflared/a1b2c3d4-e5f6-7890-1234-abcdef123456.json
イングレス(着信)トラフィックのルーティングルール
ingress:
# ルール1: web.your-domain.com へのアクセスをローカルのポート80へ転送
– hostname: web.your-domain.com
service: http://localhost:80
# ルール2: 上記のルールに一致しないアクセスはすべて404エラーを返す
– service: http_status:404
“`
各項目の意味を解説します。
tunnel
: ステップ3-3で取得したトンネルのUUIDに書き換えます。credentials-file
: ステップ3-3で生成されたJSONクレデンシャルファイルの絶対パスを指定します。user
の部分は自分のユーザー名に書き換えてください。ingress
: トラフィックのルーティングルールを定義するセクションです。ここに複数のルールを記述できます。hostname
: インターネットに公開するホスト名です。web.your-domain.com
の部分を、あなたが使いたいサブドメインと所有ドメインに書き換えます。service
: 転送先のローカルサービスを指定します。http://localhost:80
は「このサーバー自身のポート80で稼働しているHTTPサービス」を意味します。もしWebサーバーが別のポート(例: 8080)で動いているならhttp://localhost:8080
とします。- service: http_status:404
: これは非常に重要な設定です。ingress
の最後に記述する「キャッチオール(catch-all)」ルールです。hostname
で指定した以外のホスト名でこのトンネルにアクセスしようとするリクエストをすべてブロックし、404エラーを返します。これにより、意図しないアクセスの侵入を防ぎます。
3-5. DNSレコードの作成
設定ファイルができたので、次に web.your-domain.com
というホスト名が、作成したトンネルを指すようにDNSレコードを設定します。これもコマンド一発で完了します。
bash
cloudflared tunnel route dns my-web-tunnel web.your-domain.com
このコマンドは、CloudflareのDNS設定に web.your-domain.com
のCNAMEレコードを自動で追加し、それをトンネルのIDに紐付けます。Cloudflareのダッシュボードにログインし、該当ドメインのDNS設定画面を開くと、CNAME web.your-domain.com is managed by Cloudflare
といったレコードが追加されているのが確認できます。
3-6. トンネルの実行とサービス化
すべての準備が整いました。いよいよトンネルを実行します。まずはテストとして手動で実行してみましょう。
bash
cloudflared tunnel --config ~/.cloudflared/config.yml run
config.yml
のパスは環境に合わせて調整してください。成功すると、接続情報がログとして流れ始めます。この状態で、別のPCやスマートフォンのブラウザから https://web.your-domain.com
にアクセスしてみてください。ローカルサーバーで稼働しているWebページが表示されれば成功です!Cloudflareが自動でSSL証明書を発行してくれるため、https://
で安全にアクセスできます。
テストが成功したら、ターミナルを閉じるとトンネルも切れてしまいます。サーバーを再起動した際などにも自動でトンネルが起動するように、cloudflared
をサービスとして登録(永続化)しましょう。
“`bash
サービスとしてインストール(sudoが必要)
sudo cloudflared service install
サービスの起動
sudo systemctl start cloudflared
サーバー起動時に自動で起動するように設定(有効化)
sudo systemctl enable cloudflared
サービスの状態を確認
sudo systemctl status cloudflared
“`
これで、cloudflared
はバックグラウンドで常に動作し、トンネルを維持し続けてくれます。
Windowsの場合は、管理者として開いたPowerShellで以下のコマンドを実行します。
“`powershell
設定ファイルを C:\cloudflared\config.yml などに配置してから実行
cloudflared.exeのあるディレクトリで実行するか、パスを通しておく
cloudflared.exe service install
“`
これで、Windowsのサービス管理画面にCloudflare Tunnel
が登録され、自動で起動するようになります。
以上で、Webサーバーの安全な公開は完了です。ポートは一つも開けていないにも関わらず、独自ドメインでHTTPS化されたWebサイトにアクセスできる環境が手に入りました。
第4章: 応用編 – 様々なプロトコルへのアクセス
Cloudflare Tunnelの真価は、HTTP/HTTPS以外のプロトコルにも対応している点にあります。この章では、エンジニアやサーバー管理者にとって必須とも言えるSSHやリモートデスクトップへの安全なアクセス方法を解説します。
4-1. SSHアクセスの設定
サーバー管理に欠かせないSSH。ポート22を直接インターネットに公開するのは、ブルートフォース攻撃の的になるため非常に危険です。Cloudflare Tunnelを使えば、このSSHポートを閉じたまま、安全にアクセスできます。
ここでは、ローカルのSSHクライアント(ssh
コマンドやTera Termなど)をそのまま使える、最も便利な方法を紹介します。
1. サーバー側の設定追加
まず、サーバーの~/.cloudflared/config.yml
にSSH用のルーティングルールを追記します。
“`yaml
tunnel: a1b2c3d4-e5f6-7890-1234-abcdef123456
credentials-file: /home/user/.cloudflared/a1b2c3d4-e5f6-7890-1234-abcdef123456.json
ingress:
# 既存のWebサーバー設定
– hostname: web.your-domain.com
service: http://localhost:80
# — ここから追記 —
# SSH用の設定
– hostname: ssh.your-domain.com
service: ssh://localhost:22
# — ここまで追記 —
- service: http_status:404
“`
hostname
にはSSH接続用に使用したいホスト名(例: ssh.your-domain.com
)を、service
にはssh://localhost:22
を指定します。もしSSHサーバーが標準の22番以外のポートで稼働している場合は、適宜変更してください(例: ssh://localhost:2222
)。
設定ファイルを変更したら、cloudflared
サービスを再起動して設定を反映させます。
bash
sudo systemctl restart cloudflared
次に、この新しいホスト名をDNSに登録します。
bash
cloudflared tunnel route dns my-web-tunnel ssh.your-domain.com
2. クライアントPC側の設定
次に、接続元となるあなたのPC(クライアントPC)にもcloudflared
をインストールします。(インストール方法は第3章参照)
そして、SSHクライアントの設定ファイル(Linux/macOSでは ~/.ssh/config
)を編集します。
“`
~/.ssh/config ファイルに以下を追記
Host ssh.your-domain.com
HostName ssh.your-domain.com
ProxyCommand /usr/local/bin/cloudflared access ssh –hostname %h
“`
各項目の説明です。
Host
: SSHコマンドで接続先を指定するときのエイリアスです。HostName
: 実際に接続するホスト名を指定します。ProxyCommand
: ここがキモです。 SSH接続を行う際に、まずこのコマンドを実行するよう指示しています。/usr/local/bin/cloudflared
の部分は、あなたの環境のcloudflared
の実行ファイルのパスに置き換えてください。(which cloudflared
コマンドで確認できます。Windowsの場合はC:\path\to\cloudflared.exe
のように指定します)
この設定により、ssh [email protected]
を実行すると、SSHクライアントは直接サーバーに接続しようとするのではなく、まずcloudflared
を起動します。cloudflared
はCloudflare経由で安全なトンネルを確立し、そのトンネルを通じてSSHの通信を中継してくれるのです。
これで設定は完了です。ターミナルからいつも通りにSSHコマンドを叩くだけで、ポート22を閉じたサーバーに安全に接続できます。
bash
ssh <サーバーのユーザー名>@ssh.your-domain.com
4-2. VNC/RDP (リモートデスクトップ) アクセスの設定
GUIベースのリモート操作であるVNC(ポート5900番台)やWindowsのRDP(ポート3389)も、SSHと同様の仕組みで安全に利用できます。
1. サーバー側の設定追加
config.yml
にRDP用のルールを追加します。
“`yaml
…(省略)…
ingress:
# …(省略)…
# RDP用の設定
– hostname: rdp.your-domain.com
service: tcp://localhost:3389
# VNC用の設定 (例)
– hostname: vnc.your-domain.com
service: tcp://localhost:5901
- service: http_status:404
“`
service
には tcp://
を使い、対象のポートを指定します。設定を保存したら、cloudflared
サービスを再起動し、DNSレコードも作成します。
bash
sudo systemctl restart cloudflared
cloudflared tunnel route dns my-web-tunnel rdp.your-domain.com
2. クライアントPC側の接続
RDP/VNCの場合、クライアントPC側で一時的なポートフォワーディングを行います。
クライアントPCのターミナル(WindowsならPowerShell/コマンドプロンプト)で、以下のコマンドを実行します。
“`bash
RDPの場合
cloudflared access tcp –hostname rdp.your-domain.com –url localhost:13389
“`
このコマンドは、rdp.your-domain.com
へのTCP接続を、クライアントPC自身のlocalhost:13389
に転送するリスナーを起動します。(ポート番号 13389
は任意で構いません)
このコマンドを実行したままの状態で、別のリモートデスクトップクライアント(Windows標準の「リモート デスクトップ接続」など)を起動し、接続先に localhost:13389
を指定します。
すると、通信は localhost:13389
→ cloudflared
→ Cloudflare → サーバーのcloudflared
→ サーバーのポート3389
という経路で安全に転送され、リモートデスクトップ画面が表示されます。
4-3. 複数のサービスを1つのトンネルで管理
これまで見てきたように、config.yml
のingress
セクションにルールを追記していくだけで、1つのcloudflared
インスタンス(1つのトンネル)で、Web、SSH、RDPなど、複数の異なるサービスをまとめて管理できます。これは非常に効率的で管理しやすい方法です。
第5章: セキュリティをさらに強化する – Cloudflare Accessの活用
Cloudflare Tunnelだけで十分に安全ですが、セキュリティは常に多層的に考えるべきです。Cloudflare Access を組み合わせることで、あなたのサービスにエンタープライズレベルの認証レイヤーを追加できます。しかも、50ユーザーまで無料で利用可能です。
5-1. Cloudflare Accessとは?
Cloudflare Accessは、ゼロトラスト・ネットワークアクセス(ZTNA)を実現するサービスです。アプリケーション(この場合はCloudflare Tunnelで公開したサービス)の手前に強力な認証ゲートを設置します。
これにより、たとえ web.your-domain.com
のURLを知っている人がいても、あなたが許可したユーザーでなければ、アプリケーションに到達することすらできなくなります。
5-2. アクセスポリシーの設定
設定はすべてCloudflareのダッシュボードから行います。
-
Cloudflareダッシュボードの左側メニューから 「Zero Trust」 を選択します。初回アクセス時は、簡単なセットアップウィザードが表示されるので、指示に従ってチーム名などを設定します。
-
Zero Trustダッシュボードの左側メニューから
Access
->Applications
を選択し、「Add an application」ボタンをクリックします。 -
アプリケーションの種類として 「Self-hosted」 を選択します。
-
アプリケーションの設定:
- Application name: 任意の分かりやすい名前を入力します (例:
My Home Server
)。 - Session Duration: 認証が有効な期間を設定します。
- Application domain: 保護したいホスト名(サブドメイン)を入力します。
web.your-domain.com
を設定してみましょう。 Next
をクリックします。
- Application name: 任意の分かりやすい名前を入力します (例:
-
ポリシーの作成:
ここが認証ルールを定義する最も重要な部分です。- Policy name: ポリシーの名前を入力します (例:
Allow MySelf
)。 -
Action:
Allow
を選択します(このルールに合致するユーザーのアクセスを許可する)。 -
Configure rules (ルールを設定):
どのような条件のユーザーを許可するかを定義します。非常に多くの条件が指定できますが、代表的なものをいくつか紹介します。- Emails: 特定のメールアドレスを指定します。
[email protected]
のように入力すれば、そのメールアドレスを持つ人だけがアクセスできます。 - Email ending in: 特定のドメインのメールアドレスを許可します。
@your-company.com
とすれば、その会社のドメインを持つ人全員が対象になります。 - GitHub / Google Group: 特定のGitHub組織やGoogleグループに所属しているユーザーを許可します。
- IP Ranges: 特定のIPアドレスからのアクセスのみを許可します。
- Country: 特定の国からのアクセスのみを許可/拒否します。
- Emails: 特定のメールアドレスを指定します。
今回は、自分のメールアドレスだけを許可する設定にしてみましょう。「Selector」で「Emails」を選択し、右の入力欄に自分のメールアドレスを入力します。
Next
をクリックし、最後にAdd application
をクリックして完了です。
- Policy name: ポリシーの名前を入力します (例:
5-3. 実際のアクセスフロー
設定が完了したら、ブラウザのシークレットモードなどで https://web.your-domain.com
にアクセスしてみてください。
すると、Webページが表示される代わりに、Cloudflare Accessのログイン画面が表示されます。
ここでメールアドレスを入力すると、そのアドレス宛にワンタイムPINコードが記載されたメールが届きます。そのPINコードを画面に入力して認証が成功すると、初めてWebページが表示されます。
この仕組みにより、以下のような強力な保護が実現します。
- ユーザー名/パスワード方式ではないため、パスワード漏洩のリスクがない。
- 認証はCloudflareが肩代わりするため、アプリケーション側で認証機能を実装する必要がない。
- 不特定多数からのスキャンや攻撃は、アプリケーションに到達する前にすべてブロックされる。
SSHやRDPにも同様にAccessポリシーを適用でき、cloudflared access
コマンドで接続しようとすると、ブラウザが起動して認証を求められるようになります。これこそが、ゼロトラストセキュリティの真髄です。
第6章: トラブルシューティング
設定がうまくいかない場合に確認すべき、よくある問題とその解決策をまとめます。
-
問題: ブラウザでアクセスすると “Error 1033: Argo Tunnel tunnel.id does not exist” と表示される。
- 原因: サーバー側の
cloudflared
サービスが停止しているか、Cloudflareのネットワークに接続できていません。 - 解決策:
- サーバーにログインし、
sudo systemctl status cloudflared
コマンドでサービスがactive (running)
になっているか確認します。停止している場合はsudo systemctl start cloudflared
で起動します。 config.yml
に記述したtunnel
のUUIDやcredentials-file
のパスが正しいか再確認します。- サーバーのファイアウォールが、Cloudflareへのアウトバウンド接続をブロックしていないか確認します。
- サーバーにログインし、
- 原因: サーバー側の
-
問題: ブラウザでアクセスすると “502 Bad Gateway” と表示される。
- 原因: Cloudflareからサーバーの
cloudflared
までは到達できていますが、cloudflared
からローカルのサービス(例: Webサーバー)への接続に失敗しています。 - 解決策:
config.yml
のservice
ディレクティブ(例:http://localhost:80
)が正しいか確認します。ポート番号は合っていますか?- サーバー上で、ローカルサービスが正しく起動しているか確認します。
curl http://localhost:80
やss -lntp | grep 80
などのコマンドで、サービスがポートをリッスンしているか確認できます。
- 原因: Cloudflareからサーバーの
-
問題: DNSレコードが見つからない旨のエラーが出る。
- 原因:
cloudflared tunnel route dns
コマンドが実行されていないか、失敗しています。 - 解決策:
- 再度
cloudflared tunnel route dns <TUNNEL_NAME> <HOSTNAME>
コマンドを実行します。 - CloudflareダッシュボードのDNS設定画面で、対象のCNAMEレコードが正しく作成されているか確認します。
- 再度
- 原因:
-
ログの確認方法:
問題解決の最大のヒントはログにあります。- Linux (systemd):
journalctl -u cloudflared -f
コマンドで、リアルタイムのログを確認できます。 - Windows: イベントビューアーの「Windows ログ」->「アプリケーション」に
cloudflared
からのログが記録されます。
- Linux (systemd):
まとめ
本記事では、Cloudflare Tunnel (cloudflared
) を利用して、無料でセキュアなリモートアクセス環境を構築する方法を網羅的に解説しました。
重要なポイントを振り返りましょう。
- ポート開放は不要:
cloudflared
はアウトバウンド接続のみを利用するため、自宅のルーターやサーバーのファイアウォールでポートを開ける必要がなく、攻撃対象領域を劇的に削減できます。 - ゼロトラストの実現: 通信はすべてCloudflareの堅牢なネットワークを経由し、IPアドレスは隠蔽され、DDoS攻撃からも保護されます。
- 設定はシンプル: 複雑なルーター設定やVPNサーバーの構築は不要で、設定ファイルといくつかのコマンドで実現できます。
- 高い拡張性: Webサーバーだけでなく、SSH、RDP、その他のTCPサービスにも対応し、一元管理が可能です。
- 強固な認証: Cloudflare Accessを組み合わせることで、特定のユーザーのみにアクセスを許可する、エンタープライズレベルの認証を無料で追加できます。
従来のリモートアクセス手法が抱えていたセキュリティリスクや設定の煩雑さから、ついに私たちは解放されました。Cloudflare Tunnelは、個人利用から小規模ビジネスまで、あらゆるシーンでその価値を発揮する、まさにゲームチェンジャーと言える技術です。
この記事を参考に、あなたもぜひ、安全で快適なリモートアクセス環境を手に入れてください。もう、ポート開放の不安に悩まされる日々に戻る必要はないのです。