Cloudflare TunnelとSSHで実現する次世代のリモートアクセス環境構築
1. はじめに:リモートアクセスのパラダイムシフト
現代の働き方において、リモートアクセスはもはや特別なものではなく、日常業務に不可欠なインフラとなりました。開発者、システム管理者、あるいは自宅のサーバーにアクセスしたいホビーユーザーまで、多くの人々が日々、遠隔地にあるコンピュータに接続しています。このリモートアクセスを実現する伝統的な手法として、VPN(Virtual Private Network)や、ルーターのポートフォワーディング(ポート開放)が広く利用されてきました。
しかし、これらの従来手法には、無視できない課題がいくつも存在します。
- 設定の複雑さ: VPNサーバーの構築や、ルーターのポートフォワーディング設定は、専門知識を要し、初心者にとってはハードルが高い作業です。設定ミスは、セキュリティホールに直結する危険性をはらんでいます。
- セキュリティリスク: インターネットにポートを公開するという行為は、それ自体が攻撃対象領域(アタックサーフェス)を広げることを意味します。悪意のある第三者によるポートスキャン、脆弱性を狙った攻撃、総当たり攻撃(ブルートフォースアタック)などのリスクに常に晒されることになります。VPNも、認証情報が漏洩すれば不正アクセスの入り口となり得ます。
- ネットワーク環境への依存: 自宅のインターネット回線が動的IPアドレスであったり、マンションの共有回線やスマートフォンのテザリングのようにCG-NAT(Carrier-Grade NAT)環境下にあったりすると、外部から直接アクセスするための設定が非常に困難、あるいは不可能になるケースがあります。
- パフォーマンスの問題: VPNを経由する通信は、一度VPNサーバーに集約されるため、遅延(レイテンシー)が増加する傾向にあります。特に、地理的に離れた場所にあるVPNサーバーを利用する場合、その影響は顕著になります。
これらの課題を背景に、近年「ゼロトラスト(Zero Trust)」というセキュリティモデルが注目を集めています。「何も信頼しない(Never Trust, Always Verify)」を基本原則とし、社内ネットワークであろうと外部ネットワークであろうと、すべてのアクセス要求を信頼せず、その都度厳格に検証・認証するという考え方です。
このゼロトラストの理念を具現化し、従来のリモートアクセスの課題を根本から解決するソリューションとして登場したのが、Cloudflare Tunnelです。Cloudflare Tunnelは、Cloudflareが提供するゼロトラストプラットフォームの中核機能の一つであり、サーバー側にインバウンドのポートを開けることなく、安全なアウトバウンド接続のみで外部からのアクセスを実現します。
この記事では、この画期的なCloudflare Tunnelと、古くから信頼性の高いリモートシェルとして利用されてきたSSH(Secure Shell)を組み合わせることで、いかにして安全で、快適で、そして驚くほど簡単に次世代のリモートアクセス環境を構築できるかを、詳細な手順とともに解説します。
対象読者としては、以下のような方を想定しています。
- 自宅やオフィスのサーバーに、安全かつ簡単にリモートアクセスしたい開発者・エンジニア。
- 従来のVPNやポート開放のセキュリティに不安を感じているシステム管理者。
- CG-NAT環境下で、外部からのサーバーアクセスを諦めていたホビーユーザーや学生。
- ゼロトラストセキュリティの具体的な実装方法に興味がある方。
この記事を読み終える頃には、あなたはグローバルIPアドレスやファイアウォールの設定に頭を悩ませることなく、独自のドメイン名を使って、世界中のどこからでも安全に自分のサーバーへSSH接続できるようになっているでしょう。さあ、リモートアクセスの新しい常識を体験する旅を始めましょう。
2. Cloudflareとは何か? – CDNだけではない多機能プラットフォーム
「Cloudflare」と聞くと、多くの人はWebサイトのパフォーマンスを向上させるCDN(Content Delivery Network)や、DDoS攻撃からサイトを守るセキュリティサービスを思い浮かべるでしょう。もちろんそれらはCloudflareの主要なサービスですが、現在のCloudflareはそれだけにとどまらない、包括的なネットワーク・セキュリティプラットフォームへと進化を遂げています。
その進化の象徴とも言えるのが、「Cloudflare Zero Trust」です。これは以前「Cloudflare for Teams」という名称で提供されていたサービス群で、企業や個人がゼロトラストセキュリティモデルを容易に導入できるように設計されています。このプラットフォームは、アプリケーションへのアクセス制御、セキュアなWebゲートウェイ、ブラウザ分離など、多岐にわたる機能を提供しますが、その中でも特に重要なコンポーネントが本記事の主役である「Cloudflare Tunnel」です。
Cloudflare Tunnelのアーキテクチャ
Cloudflare Tunnelは、どのようにして「インターネットにポートを公開しない」安全なリモートアクセスを実現するのでしょうか。その仕組みは、従来の発想を逆転させた非常にクレバーなものです。
従来のモデル(ポートフォワーディング):
1. クライアントが、サーバーのグローバルIPアドレスと公開ポート(例: 123.45.67.89:22
)に対して接続を要求する。
2. ルーターが、その要求を受け取り、指定されたポートへの通信を内部ネットワークのサーバー(例: 192.168.1.10:22
)に転送(フォワーディング)する。
3. このためには、ルーターのファイアウォールに穴(インバウンドルール)を開けておく必要がある。
Cloudflare Tunnelのモデル:
1. リモートアクセス対象のサーバー上で、「cloudflared
」という軽量なデーモン(常駐プログラム)を起動する。
2. cloudflared
デーモンは、サーバーからCloudflareのグローバルネットワーク(エッジ)に向かって、アウトバウンドの永続的な暗号化トンネルを複数確立する。
3. クライアントは、サーバーのIPアドレスではなく、割り当てられたドメイン名(例: ssh.your-domain.com
)に対して接続を要求する。
4. この要求はまずCloudflareのエッジに到達する。
5. Cloudflareのエッジは、すでに確立されているセキュアなトンネルを通じて、その要求をサーバー上のcloudflared
デーモンに転送する。
6. cloudflared
デーモンは、受け取った要求をローカルのサービス(例: localhost:22
のSSHサーバー)に中継する。
このアーキテクチャの最大のポイントは、すべての接続がサーバー側からCloudflareへのアウトバウンド方向で開始されるという点です。一般的なファイアウォールは、内側から外側へのアウトバウンド通信は許可し、外側から内側へのインバウンド通信はデフォルトでブロックします。Cloudflare Tunnelはこの性質を利用するため、ルーターやファイアウォールに一切の穴を開ける必要がありません。これにより、サーバーはインターネットから完全に隠蔽され、外部からの直接的な攻撃(ポートスキャン、脆弱性攻撃など)を受けるリスクが劇的に低下します。
まさに、サーバーが自分からCloudflareに電話をかけ続け、「もしクライアントから連絡があったら、この電話線で繋いでくれ」とお願いしているようなものです。クライアントはサーバーの電話番号(IPアドレス)を知る必要がなく、Cloudflareという交換台(エッジネットワーク)にかけるだけでよいのです。
この仕組みにより、Cloudflare Tunnelは以下の強力なセキュリティ上の利点を提供します。
- 攻撃対象領域の削減: インバウンドポートを閉じることで、攻撃者が狙うべき入口そのものをなくします。
- DDoS攻撃からの保護: すべてのトラフィックはCloudflareの巨大なネットワークを経由するため、悪意のある大量のトラフィックはサーバーに到達する前にCloudflare側で吸収・緩和されます。
- IPアドレスの秘匿: サーバーの真のIPアドレスが外部に漏れることはありません。
Cloudflare Tunnelは、単なるトンネリングサービスではなく、Cloudflareが長年培ってきたグローバルネットワークとセキュリティ技術の上に成り立つ、堅牢なゼロトラストソリューションなのです。
3. SSHとは何か? – 安全なリモートシェルの基礎
次に、この環境構築のもう一方の主役であるSSHについて、その基本を再確認しておきましょう。SSH(Secure Shell)は、ネットワーク経由で他のコンピュータに接続し、コマンドライン(シェル)操作を行うための、暗号化された安全なプロトコルです。
1995年にフィンランドの研究者 Tatu Ylönen によって開発されて以来、UNIX/Linux系のサーバー管理においてはデファクトスタンダードとして不動の地位を築いています。telnetやrloginといった平文で通信する古いプロトコルを置き換え、ネットワーク上での盗聴や改ざんのリスクを排除しました。
SSHが提供する主要な機能は以下の3つです。
- 暗号化 (Encryption): クライアントとサーバー間のすべての通信(入力したコマンド、画面出力、転送するファイルなど)は、強力な暗号化アルゴリズムによって保護されます。これにより、第三者が通信内容を盗聴しても、意味のある情報を得ることはできません。
- 認証 (Authentication): 接続しようとしている相手が、本当に意図したサーバーであるかを確認(ホスト認証)し、接続しようとしているユーザーが、正当な権限を持つユーザーであるかを確認(ユーザー認証)します。
- データの完全性 (Integrity): 通信内容が途中で改ざんされていないかを、メッセージ認証コード(MAC)を用いて検証します。
特に重要なのがユーザー認証の方法です。SSHでは主に2つの方式が利用されます。
- パスワード認証: ユーザー名とパスワードの組み合わせで認証する、最もシンプルな方法です。しかし、パスワードは漏洩や総当たり攻撃のリスクに弱く、セキュリティ的には推奨されません。
- 公開鍵認証 (Public Key Authentication): 事前に生成した一対の鍵(秘密鍵と公開鍵)を利用する方式です。クライアント側に「秘密鍵」を、サーバー側に「公開鍵」を配置します。接続時には、この鍵ペアを使った電子署名のチャレンジ・レスポンスによって認証が行われ、ネットワーク上にパスワードのような秘密情報が流れることはありません。非常に安全性が高く、現在のSSH利用における標準的な認証方式とされています。
この記事で構築する環境でも、セキュリティを最大限に高めるため、公開鍵認証方式を利用することを強く推奨します。Cloudflare Tunnelが外部からの攻撃を防ぐ「盾」の役割を果たす一方で、SSHの公開鍵認証は、万が一トンネルを通過できたとしても、不正なログインを許さない「最後の砦」として機能します。
4. Cloudflare TunnelとSSHを組み合わせる絶大なメリット
Cloudflare TunnelとSSH、それぞれ単体でも強力なツールですが、この二つを組み合わせることで、相乗効果が生まれ、これまでのリモートアクセスとは一線を画す、卓越した環境が実現します。そのメリットを具体的に見ていきましょう。
4.1. 究極のセキュリティ (ゼロトラストの実現)
- ファイアウォールの穴あけ不要: 何度も強調している通り、これが最大のメリットです。サーバーはインターネットに対して一切のポートを公開する必要がありません。これにより、ルーターの設定ミスによるセキュリティインシデントや、未知の脆弱性を突いたゼロデイ攻撃のリスクを根本から排除します。グローバルIPアドレスすら不要です。
- DDoS・ブルートフォース攻撃からの完全防御: SSHポートをインターネットに公開すると、ほぼ確実に自動化されたボットによるブルートフォース攻撃(パスワードの総当たり攻撃)に晒されます。Cloudflare Tunnelを使えば、SSHサーバーはCloudflareのネットワークの背後に隠れるため、これらの攻撃トラフィックはサーバーに到達することすらありません。
- Cloudflare Accessによる高度な認証・認可: これがゼロトラストを完成させるための鍵です。Cloudflare Tunnelは、同社の「Cloudflare Access」という認証・認可サービスとシームレスに連携できます。これにより、SSH接続を行う際に、以下のような多層的なセキュリティポリシーを強制できます。
- 多要素認証 (MFA): Google AuthenticatorやYubikeyなどの認証アプリ/デバイスを使った追加認証を必須にできます。SSHの公開鍵認証と組み合わせることで、二重の強力な認証が実現します。
- IDベースのアクセスポリシー: 特定のメールアドレス(例:
@your-company.com
ドメインを持つユーザーのみ)や、特定のIDプロバイダ(Google, GitHub, Oktaなど)のグループに所属するユーザーにのみ、SSH接続を許可できます。 - デバイスポスチャチェック: CloudflareのWARPクライアントをインストールしているデバイスからのみアクセスを許可したり、特定のOSバージョンやディスク暗号化が有効であることなどを条件に加えたりできます。
- 一元化された監査ログ: 誰が、いつ、どこからSSH接続を試み、成功したか失敗したか、といったすべてのアクセスログがCloudflareのダッシュボードに記録されます。これにより、不審なアクティビティの監視や、インシデント発生時の追跡が容易になります。
4.2. 圧倒的な利便性
- 固定IPアドレス不要 (CG-NAT対応): 自宅の回線が動的IPであっても、Cloudflare Tunnelは問題なく動作します。さらに、マンションの共有回線やスマートフォンのテザリングなど、プライベートIPアドレスしか割り当てられないCG-NAT環境下でも、サーバー側からアウトバウンド接続を確立するため、何の問題もなくリモートアクセス環境を構築できます。これは、従来の方法では不可能だったことです。
-
覚えやすいドメイン名でのアクセス:
172.217.26.227
のようなIPアドレスを覚える必要はもうありません。ssh.my-home-server.com
のように、自分で設定した分かりやすいドメイン名で、いつでもどこからでもSSH接続できます。
“`bash
# IPアドレスを覚えておく必要はない
# ssh [email protected]覚えやすいドメイン名でアクセスできる
ssh [email protected]
``
~/.ssh/config` ファイルに設定を記述してしまえば、あとは短いコマンドを打つだけです。複雑なVPNクライアントの起動や接続操作は不要です。
* **シンプルなクライアント設定**: 一度
* 場所を問わない一貫したアクセス体験: オフィス、自宅、カフェ、出張先のホテルなど、どこにいても同じコマンドでサーバーにアクセスできます。途中のネットワーク環境の違いを意識する必要は一切ありません。
4.3. 高いパフォーマンスと信頼性
- Argo Smart Routingによる高速化: Cloudflare Tunnelは、Cloudflareの有料オプションである「Argo Smart Routing」の技術を無料で利用できます。これは、Cloudflareのグローバルネットワーク上のリアルタイムな遅延・パケットロス情報を基に、インターネットの混雑を避けた最適な経路でトラフィックをルーティングする技術です。結果として、通常のインターネット経由での接続よりも、SSHのレスポンスが高速かつ安定する可能性があります。
- 高い可用性と冗長性: サーバー上の
cloudflared
デーモンは、Cloudflareの複数のデータセンターに対して冗長化された接続を確立します。一部のデータセンターに障害が発生しても、自動的に正常な経路にフェイルオーバーするため、非常に高い可用性を誇ります。これは、単一のVPNサーバーや自宅の回線に依存する従来の方法とは比較にならない安定性です。
このように、Cloudflare TunnelとSSHの組み合わせは、セキュリティ、利便性、パフォーマンスという、リモートアクセスに求められる3つの要素を、かつてない高いレベルで満たすソリューションなのです。
5. 実践:環境構築ハンズオン
それでは、いよいよ実際にCloudflare Tunnelを使ったSSHリモートアクセス環境を構築していきましょう。ここでは、Linuxサーバーを対象として解説しますが、cloudflared
はWindowsやmacOS、Raspberry Piなど様々な環境で動作するため、基本的な流れは同じです。
前提条件
- Cloudflareアカウント: 無料プランで問題ありません。まだ持っていない場合は、公式サイトからサインアップしてください。
- 独自のドメイン: Cloudflare Tunnelでアクセスするためのドメインが必要です。お名前.comやGoogle Domainsなどで取得し、Cloudflareのネームサーバーを使用するように設定しておいてください。(この手順は本記事の範囲外とします)
- SSHサーバー: リモートアクセスしたい対象のマシンです。OpenSSHサーバーがインストールされ、稼働している状態にしておきます。また、公開鍵認証でログインできるように設定済みであることを強く推奨します。
- SSHクライアント: 接続元となるPCです。(Windows, macOS, Linuxなど)
ステップ1: Cloudflare Zero Trustダッシュボードの準備
- Cloudflareダッシュボードにログインします。
- 左側のメニューから「Zero Trust」を選択します。
- 初めてアクセスする場合、プランの選択画面が表示されます。「Free」プランの「Select plan」をクリックし、簡単なセットアップ(チーム名の設定など)を完了させます。チーム名は、
your-name.cloudflareaccess.com
のようなURLの一部として使われます。任意の名前で構いません。
ステップ2: Cloudflare Tunnelの作成とcloudflared
のインストール
- Zero Trustダッシュボードの左側メニューから、「Access」>「Tunnels」を選択します。
- 「Create a tunnel」ボタンをクリックします。
- Tunnelの接続方法を選択します。ここでは「Cloudflared」を選択し、「Next」をクリックします。
- Tunnelに名前を付けます。サーバーの役割などが分かる、管理しやすい名前が良いでしょう。(例:
home-server-ssh
)。「Save tunnel」をクリックします。 -
次に、コネクターをインストールする画面が表示されます。ここで、自分のサーバーのOSを選択すると、
cloudflared
をインストールし、このTunnelに接続するためのコマンドが表示されます。- Choose your environment: 自分のサーバーのOS(例: Debian/Ubuntuなら「Debian」、CentOS/RHELなら「Redhat」)とアーキテクチャ(64-bitなど)を選択します。
- Install and run a connector: 画面に表示されるコマンドをコピーします。以下のようなコマンドが表示されるはずです。
bash
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb &&
sudo dpkg -i cloudflared.deb &&
sudo cloudflared service install <YOUR_TUNNEL_TOKEN>
この<YOUR_TUNNEL_TOKEN>
の部分には、あなた専用の長いトークンが自動的に埋め込まれています。このトークンが、あなたのサーバーとCloudflareアカウントを安全に結びつけます。
-
SSHでリモートアクセス対象のサーバーにログインし、コピーしたコマンドを貼り付けて実行します。
- 最初の2行で
cloudflared
パッケージをダウンロードし、インストールします。 - 最後の
sudo cloudflared service install ...
コマンドで、cloudflared
がシステムサービスとして登録され、OS起動時に自動的に起動するようになります。また、指定されたトークンを使ってCloudflareへの接続を開始します。
- 最初の2行で
-
コマンドが正常に完了したら、Cloudflareのダッシュボードに戻ります。しばらくすると、「Connectors」のセクションに、今設定したサーバーが「HEALTHY」として表示されるはずです。これで、サーバーとCloudflare間のトンネルが無事に開通しました。
- 「Next」ボタンをクリックします。
ステップ3: Tunnelの設定 – SSHサービスの公開
次に、この開通したトンネルを通じて、どのサービスを公開するかを設定します。
- 「Public Hostname」のセクションで、「Add a public hostname」ボタンをクリックします。
- 以下の項目を設定します。
- Subdomain: SSHアクセスに使いたいサブドメインを入力します。(例:
ssh
) - Domain: 前提条件で用意した、Cloudflareに登録済みの自分のドメインを選択します。(例:
my-home-server.com
)- これにより、最終的なアクセス用ホスト名は
ssh.my-home-server.com
となります。
- これにより、最終的なアクセス用ホスト名は
- Service:
- Type: ドロップダウンから「SSH」を選択します。
- URL:
localhost:22
と入力します。これは、「ssh.my-home-server.com
へのSSHリクエストが来たら、トンネルを通じてサーバーのlocalhost
の22
番ポート(デフォルトのSSHポート)に転送してください」という意味です。もしSSHサーバーが別のポートで待機している場合は、そのポート番号を指定します。(例:localhost:2222
)
- Subdomain: SSHアクセスに使いたいサブドメインを入力します。(例:
- 設定が完了したら、「Save hostname」または「Save tunnel」ボタンをクリックして設定を保存します。
これだけでサーバー側の設定は完了です。ルーターの設定も、ファイアウォールの設定も一切触っていません。非常にシンプルです。
ステップ4: クライアント側のSSH設定
次に、接続元となるクライアントPCを設定します。Cloudflare Tunnel経由でSSH接続するためには、クライアント側にもcloudflared
が必要です。cloudflared
がSSHクライアントとCloudflareネットワークの間のプロキシとして動作します。
-
cloudflared
のインストール (クライアントPC)- macOS: Homebrewを使うのが簡単です。
bash
brew install cloudflared - Windows: ScoopやChocolateyを使うか、公式サイトから
.msi
インストーラーをダウンロードしてインストールします。
powershell
# Scoopの場合
scoop install cloudflared - Linux (Debian/Ubuntu): サーバー側と同様に、
.deb
パッケージをダウンロードしてインストールします。
- macOS: Homebrewを使うのが簡単です。
-
SSH設定ファイルの編集
cloudflared
をSSHのプロキシとして利用するために、SSHクライアントの設定ファイル(~/.ssh/config
)を編集します。このファイルが存在しない場合は、新規に作成してください。以下の内容を
~/.ssh/config
に追記します。(/usr/local/bin/cloudflared
の部分は、which cloudflared
コマンドで確認した実際のパスに置き換えてください。パスが通っていればcloudflared
だけで動作する場合もあります。)“`
~/.ssh/config
Host ssh.my-home-server.com
HostName ssh.my-home-server.com
User your_user_name_on_server
ProxyCommand /usr/local/bin/cloudflared access ssh –hostname %h
“`各項目の意味は以下の通りです。
*Host ssh.my-home-server.com
: この設定を適用するホスト名を定義します。ここには、ステップ3で設定したPublic Hostnameを指定します。
*HostName ssh.my-home-server.com
: 実際に接続するホスト名を指定します。通常はHost
と同じものを指定します。
*User your_user_name_on_server
: サーバーにログインする際のユーザー名を指定します。これを設定しておくと、ssh
コマンド実行時にユーザー名を省略できます。
*ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h
: これが最も重要な設定です。ssh
コマンドが実行された際に、直接サーバーに接続するのではなく、このProxyCommand
で指定されたコマンドを代わりに実行するよう指示します。
*/usr/local/bin/cloudflared access ssh
: クライアントのcloudflared
をSSHプロキシモードで起動します。
*--hostname %h
: 接続先のホスト名として、Host
ディレクティブで指定されたホスト名(この場合はssh.my-home-server.com
)をcloudflared
に渡します。%h
はSSHが自動的にホスト名に置き換えてくれるプレースホルダーです。
ステップ5: 接続テスト
すべての設定が完了しました。いよいよ接続を試してみましょう。クライアントPCのターミナルから、以下のコマンドを実行します。
bash
ssh ssh.my-home-server.com
~/.ssh/config
に User
を指定していれば、これだけで接続が開始されます。
何が起こるか?
- SSHクライアントは
ssh.my-home-server.com
への接続を開始します。 ~/.ssh/config
の設定に基づき、ProxyCommand
が実行されます。- クライアントの
cloudflared
が起動し、Cloudflareネットワークへの接続を確立します。 - Cloudflareは、リクエストされたホスト名 (
ssh.my-home-server.com
) に紐づけられたTunnel(home-server-ssh
)を探します。 - Cloudflareは、サーバーとの間に確立済みのトンネルを通じて、SSHトラフィックをサーバー上の
cloudflared
デーモンに転送します。 - サーバー上の
cloudflared
デーモンは、トラフィックをローカルのSSHサーバー (localhost:22
) に渡します。 - サーバーのSSHサーバーが応答し、公開鍵認証などのプロセスが開始されます。
- 認証が成功すると、見慣れたサーバーのシェルプロンプトが表示されます。
成功すれば、あなたは今、インターネットにポートを一切公開することなく、安全なトンネルを経由してサーバーにログインしています。CG-NAT環境下のマシンに、まるでローカルネットワークにいるかのようにアクセスできる感覚は、少し感動的ですらあります。
6. 応用編:さらなるセキュリティ強化と便利な使い方
基本的なSSH接続ができるようになったら、次はCloudflare Tunnelの真価をさらに引き出すための応用的な設定に挑戦してみましょう。
6.1. Cloudflare Accessとの連携によるMFA強制
SSH接続に多要素認証(MFA)を追加して、セキュリティを飛躍的に向上させます。
- Cloudflare Zero Trust ダッシュボードに戻ります。
- 左側メニューから「Access」>「Applications」を選択します。
- 「Add an application」ボタンをクリックし、「Self-hosted」を選択します。
- アプリケーションの設定:
- Application name: 任意の名前を入力します(例:
SSH Access to Home Server
)。 - Session Duration: 認証が有効な期間を設定します。
- Application domain: Tunnel設定で使ったホスト名(
ssh.my-home-server.com
)を入力します。
- Application name: 任意の名前を入力します(例:
- ポリシーの設定:
- 次の画面で、このアプリケーションにアクセスできるユーザーを定義するポリシーを作成します。
- Policy name: 任意の名前を入力します(例:
Admins Only
)。 - Action: 「Allow」を選択します。
- Configure rules:
- Selector: 「Emails」を選択します。
- Value: アクセスを許可したい自分のメールアドレスを入力します。
- (オプション)「Add require」をクリックし、さらに強力な条件を追加できます。
- Selector: 「MFA」を選択します。これで、指定したメールアドレスのユーザーが、かつMFAをパスした場合にのみアクセスが許可されるようになります。
- 設定を保存して完了です。
接続時の動作の変化:
再度 ssh ssh.my-home-server.com
を実行すると、今度はターミナルに以下のようなメッセージとURLが表示されます。
“`
Please open the following URL and log in to Cloudflare Access:
https://your-team-name.cloudflareaccess.com/ssh-auth?aud=……
“`
このURLをブラウザで開くと、Cloudflare Accessのログイン画面が表示されます。メールアドレスを入力して認証コードを受け取り、さらに設定したMFA(Google Authenticatorなど)を入力して認証を完了させます。
ブラウザでの認証が成功すると、ターミナル側のSSH接続が自動的に続行され、サーバーにログインできます。これにより、たとえSSHの秘密鍵が漏洩したとしても、第三者はMFAを突破できないため、不正アクセスを極めて困難にできます。
6.2. SSH以外のプロトコルのトンネリング
Cloudflare TunnelはSSH専用ではありません。TCPベースの任意のプロトコルをトンネリングできます。例えば、以下のような使い方が可能です。
- RDP (リモートデスクトップ): Windowsのリモートデスクトップ(ポート3389)を公開するには、TunnelのPublic Hostname設定で、Typeに「RDP」を選択し、URLに
localhost:3389
を指定します。クライアント側では、Cloudflare WARPクライアントを利用して接続します。 - VNC: VNCサーバー(ポート5900など)も同様に、Type「TCP」、URL
localhost:5900
のように設定することで、安全にリモート操作ができます。 - Webサーバーの一時公開: ローカルPCで開発中のWebアプリケーション(例:
localhost:3000
)を、レビューのために一時的に外部の共同作業者に見せたい場合、TunnelでType「HTTP」、URLhttp://localhost:3000
と設定すれば、すぐにdev.your-domain.com
のようなURLで公開できます。
6.3. SSH要塞サーバー(踏み台サーバー)としての活用
セキュリティポリシー上、直接アクセスさせたくない内部ネットワークのサーバーがある場合、Cloudflare Tunnel経由でアクセスできるサーバーを「要塞サーバー(Bastion Host)」として利用できます。
- まず、要塞サーバーへのSSH接続を本記事で解説した手順で設定します。
- 次に、クライアントの
~/.ssh/config
を編集し、ProxyJump
ディレクティブを使って多段SSHを設定します。
“`
~/.ssh/config
1. 要塞サーバーへの接続設定
Host bastion.my-corp.com
HostName bastion.my-corp.com
User bastion_user
ProxyCommand /usr/local/bin/cloudflared access ssh –hostname %h
2. 内部サーバーへの接続設定
Host internal-db-server
HostName 10.0.1.50 # 内部ネットワークのIPアドレス
User db_admin
ProxyJump bastion.my-corp.com
“`
この設定により、ssh internal-db-server
とコマンドを打つだけで、SSHクライアントは自動的に以下の動作を行います。
1. cloudflared
を使って bastion.my-corp.com
へSSH接続を確立する。
2. その確立した接続を踏み台にして、internal-db-server
(10.0.1.50) へSSH接続する。
ユーザーは内部ネットワークの複雑さを意識することなく、シームレスに最終目的地のサーバーへアクセスできます。
6.4. ロギングと監視
Cloudflare Zero Trustダッシュボードの「Logs」>「Access」セクションでは、すべてのトンネル経由のアクセス試行が記録されています。成功したログイン、失敗したログイン、適用されたポリシー、送信元IPアドレスなどが詳細に確認できるため、セキュリティ監査や不審なアクティビティの早期発見に非常に役立ちます。これらのログは、SIEMなどの外部監視システムにエクスポートすることも可能です。
7. まとめ:ゼロトラスト時代の新しい常識へ
本記事では、Cloudflare TunnelとSSHを組み合わせることで、いかにして現代の要求に応えるセキュアで便利なリモートアクセス環境を構築できるかを、理論から実践まで詳細に解説しました。
振り返ってみましょう。この新しいアプローチがもたらす価値は絶大です。
- セキュリティ: ファイアウォールに穴を開けることなく、サーバーをインターネットの脅威から隠蔽し、DDoS攻撃やブルートフォース攻撃を無効化します。さらにCloudflare Accessを連携させれば、MFAやIDベースの厳格なアクセスコントロールを適用でき、真のゼロトラストセキュリティを実現できます。
- 利便性: 複雑なネットワーク設定は一切不要です。CG-NATのような制約の多い環境でも問題なく機能し、覚えやすいドメイン名一つで、世界中どこからでも一貫したアクセス体験を提供します。
- パフォーマンス: Cloudflareの巨大なグローバルネットワークとスマートルーティング技術の恩恵を受け、高速で安定した接続が期待できます。
かつてリモートアクセス環境の構築と言えば、専門知識を要する面倒でリスクの伴う作業でした。しかし、Cloudflare Tunnelの登場により、その常識は覆されました。もはや、自宅やオフィスのサーバーにアクセスするために、ポートを開放したり、高価な固定IPを契約したり、不安定なVPNに悩まされたりする必要はありません。
この記事で紹介した方法は、個人開発者から大企業まで、あらゆる規模の組織や個人に適用可能です。これは単なる一時的なトレンドではなく、リモートアクセスの「新しい常識」となる可能性を秘めています。
セキュリティ、利便性、パフォーマンス。そのすべてを高いレベルで両立させる次世代のリモートアクセス環境を、ぜひあなたの手で構築してみてください。未来の働き方とサーバー管理が、ここから始まります。