Cloudflare Zero Trust 経由でAWS上のEC2(グローバルIPアドレス無し)にSSHでログインする
概要
これまでに Cloudflare Zero Trust に関連して以下の記事を書きました。
- 「Cloudflare Zero Trust」 で組織のゼロトラストネットワークを構成する
- Cloudflare Zero Trust の基本的なセットアップ手順
- Cloudflare Zero Trust クライアント側のセットアップ手順
- Cloudflare Zero Trust 経由でAWS上のEC2(グローバルIPアドレス無し)にSSHでログインする
- Cloudflare Tunnel 経由で自前のDNSリゾルバーを利用する
今回はこれらの続きで、手元のPCからAWS上など遠隔地・クラウド上にあるサーバーにSSHでログインする経路を確立します。
接続イメージ
以前書いた上の図だとちょっと分かりにくいので、簡素化して書き直してみました。
要するに会社や自宅にあるPCから、AWSのVPC内にあるEC2インスタンスにSSHでログインできるネットワーク環境を構築するというのが今回のクエストです。
SSHログイン対象は指定したネットワーク範囲にあるホスト全てとします。特定のホストに cloudflared をインストールしてCloudflareネットワークとの間にトンネルを張ると、同じネットワーク内で疎通可能な他ホストにもアクセス可能となります(そうしない設定も可能)。
ちなみにこのEC2インスタンスはグローバルIPアドレスを持っていません。グローバルアドレスがいらない理由はちゃんと理解していませんが、おそらく ホスト → Cloudflareネットワーク
方向に通信開始しているからではないかと推測しています。
VPNじゃダメなの?
いや、別にVPNでもいいです。以前、同様の要件で wiregurad を使った例を書きました。
(ちなみにCloudflare Zero Trust も中では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
のダッシュボードを開く。 - 左のメニューから
Access
→Tunnels
を開く。 - 下の画面で「Create Tunnel」ボタンをクリック。
- 開いた画面で接続するトンネル名を入力して
Save Tunnel
をクリック。- トンネル名は
interval-VPC-01
のように、ホストベースではなくネットワークベースの名前にする。
- トンネル名は
- 開いた画面でOSとアーキテクチャを選択。Ubuntuは無いけどDebian系なので、OSは
Debian
、アーキテクチャはamd64
を選択(この選択は個々の環境で異なります)。
- 表示されたセットアップコマンドを丸ごとコピーする。
この画面は一旦このままにしておいて、以降はSSHでログインしたいサーバー上で作業します。
追記: ネットワーク設定
ssh のように TCPのみ使うのであれば特に必要ありませんが、DNSクエリのように UDP を通したい場合は、cloudflared が QUIC を使うようにネットワークの設定をしなければなりません。
以下に書いてますので、必要に応じて設定してください。
Cloudflare Tunnel 経由で自前のDNSリゾルバーを利用する
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 のダッシュボード画面から
Settings
→ Warp Client
→ Default
→ Configure
→ Split Tunnels
→ Manage
を開きます(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