🧶

Cloudflare Zero Trust 経由でAWS上のEC2(グローバルIPアドレス無し)にSSHでログインする

2023/03/07に公開

概要

これまでに Cloudflare Zero Trust に関連して以下の記事を書きました。

今回はこれらの続きで、手元のPCからAWS上など遠隔地・クラウド上にあるサーバーにSSHでログインする経路を確立します。

接続イメージ

以前書いた上の図だとちょっと分かりにくいので、簡素化して書き直してみました。

要するに会社や自宅にあるPCから、AWSのVPC内にあるEC2インスタンスにSSHでログインできるネットワーク環境を構築するというのが今回のクエストです。

SSHログイン対象は指定したネットワーク範囲にあるホスト全てとします。特定のホストに cloudflared をインストールしてCloudflareネットワークとの間にトンネルを張ると、同じネットワーク内で疎通可能な他ホストにもアクセス可能となります(そうしない設定も可能)。

ちなみにこのEC2インスタンスはグローバルIPアドレスを持っていません。グローバルアドレスがいらない理由はちゃんと理解していませんが、おそらく ホスト → Cloudflareネットワーク 方向に通信開始しているからではないかと推測しています。

VPNじゃダメなの?

いや、別にVPNでもいいです。以前、同様の要件で wiregurad を使った例を書きました。
(ちなみにCloudflare Zero Trust も中ではWireguardを使ってるようです)

WireGuard概要まとめ

ただ、Cloudflare Zero Trust を使うと

  • マルウェアスキャンやDNSフィルタリング、ファイアウォールなど、セキュリティ機能も一緒についてくる。
  • メッシュ型ではなく、各ホストが Cloudflareネットワークに接続する形なので管理しやすい。
  • 新たなホストが追加される時に個々のPCやルーターでルーティングなどの設定をしなくてもいい(ルーティングはCloudflareのダッシュボードで完結する)。
  • 踏み台となるサーバーを含めてグローバルIPアドレスが必要ないため、セキュリティ上有利。
  • ゼロトラストの概念により、たとえ同じLAN上にいてもネットワークに接続できるのは認証に通った端末のみでセキュリティ上有利。

などの利点があって、VPNとインターネットアクセスを含めたネットワーク全体をこれだけで管理できるので楽です。

料金

Cloudflare Zero Trust の機能の一部として提供されるので、50人までは無料です。

接続手順

Zero Trustネットワークの構築

すでに書いた以下の項目については完了し、Zero Trustネットワークの構築とクライアントアプリのインストール・ネットワークへのログインまでは終わっているものとします。
まだの人はまずこれを行ってください。

Cloudflare Zero Trust ダッシュボードでトンネルを作成

  • Cloudflareのダッシュボードの左メニューから Zero Trust をクリックして Zero Trust のダッシュボードを開く。
  • 左のメニューから AccessTunnels を開く。
  • 下の画面で「Create Tunnel」ボタンをクリック。
  • 開いた画面で接続するトンネル名を入力して Save Tunnel をクリック。
    • トンネル名は interval-VPC-01 のように、ホストベースではなくネットワークベースの名前にする。
  • 開いた画面でOSとアーキテクチャを選択。Ubuntuは無いけどDebian系なので、OSは Debian 、アーキテクチャは amd64 を選択(この選択は個々の環境で異なります)。
  • 表示されたセットアップコマンドを丸ごとコピーする。

この画面は一旦このままにしておいて、以降はSSHでログインしたいサーバー上で作業します。

SSHでログインしたいサーバーへCloudflaredをセットアップ

ログインして aptを更新.

$ sudo apt update && sudo apt upgrade

1つ前でコピーしたコマンドを貼り付けてそのまま実行。

$ [先ほどのコマンドを貼り付けて実行]

Selecting previously unselected package cloudflared.
(Reading database ... 90635 files and directories currently installed.)
Preparing to unpack cloudflared.deb ...
Unpacking cloudflared (2023.3.0) ...
Setting up cloudflared (2023.3.0) ...
Processing triggers for man-db (2.9.1-1) ...
2023-03-07T05:41:30Z INF Using Systemd
2023-03-07T05:41:31Z INF Linux service for cloudflared installed successfully

上のように successfully と表示されたら、Zero Trustの画面に戻る。すると先ほどコマンドをコピーした画面の一番下に connectors という項目があり、表示されているはず。

サーバー側の作業は以上です。

Next をクリックして次の画面へ。

ダッシュボードでルーティング設定

2つあるタブのうち、 Private Networks を選択(接続対象がグローバルアドレスを持たないホストの場合は常にこちらを選択)。

仮に先ほどセットアップしたサーバーのアドレスが 192.168.0.10 で、このトンネルを使って接続するネットワークのアドレス帯のCIDRが 192.168.0.0/24 だとすると、以下のように設定する。
(もし、このマシンにだけログインしたくて他のサーバーにはルーティングして欲しく無い場合は 192.168.0.10/32 を設定)

入力して Save Tunnel をクリックすると以下のように存在するトンネルのリスト画面に戻る。

Split Tunnelsの設定

一応、ここまでの作業でトンネルは確立されてますが、もうひとつ Split Tunnels の設定が必要な場合があります。
Split Tunnels とは、特定のネットワークやドメインへのパケットが、Cloudflare Zero Trust 方向へルーティングされる/されない ように制御する設定です。

Split Tunnels の設定は Zero Trust のダッシュボード画面から
SettingsWarp ClientDefaultConfigureSplit TunnelsManage

を開きます(Default以外にプロファイルがある場合は後からそちらも確認が必要)

ここで、 Manage ボタンを押す前に、以下の Include IPs and domains Exclude IPs and domains のどちらが選択された状態か確認してください。

Exclude IPs and domains が選択されている場合、デフォルトで全ての通信はCloudflare Zero Trustネットワークを通り、この後 Manage画面で設定するドメイン、IPアドレスはCloudflareを通らず、LANやインターネットに出て行きます。

Include IPs and domains が選択されている場合はその逆で、Manageで設定されたドメイン、IPアドレスだけがCloudflareを通り、それ以外は全てLANやインターネットに出て行きます。

ここではデフォルトの Exclude IPs and domains が選択されているものとして記述します。

トンネル越しにSSHアクセスするアドレス帯がCloudflare Zero Trustを通るように設定

Manage ボタンをクリックして、下の画面で今回トンネル対象の 192.168.0.0/24 がリストに存在しないか確認します。
もし存在した場合は右端のメニューから削除してください。これで 192.168.0.0/24 へのパケットは Cloudflare Zero Trust のネットワークへルーティングされるようになりました(変更はただちに各クライアントへ通知・適用されます)。

接続確認

以上でトンネル設定は終わりです。Cloudflare ONEアプリを入れてzero truestネットワークに所属しているマシンから、今回cloudflaredをセットアップした対象インスタンスにSSHログインできることを確認します。

  • 問題なかったら、次はCIDRが 192.168.0.0/24 の別のインスタンスにSSHログインできることを確認します。追加の設定をしなくてもSSHログインできるはずです。
  • もしネットワークの疎通が無くてログインできない場合は、セキュリティグループなどを確認してください。

注意) 思わず疎通確認にpingを使いたくなりますが、トンネル越しにpingは届かないっぽいので、SSHで試すかtelnetでポートがあいてるか確認するのがいいです。

Discussion