Cloudflare TunnelでVPNレスSSH接続(#6)

はじめに

ある研究室メンバーが自宅から研究室VPNに接続できず、サーバーにSSH接続できないという事例がありました。

調査してもらったところ、VPN接続のために開放する必要があるポート*1が防がれている可能性が高いと考えました。また、賃貸に住んでいるため勝手にポート開放することもできず、自宅から研究できないことに不便を感じているとのことでした。

本記事では、Cloudflare Tunnelを導入して上記のような環境でもVPNなしで安全に研究室サーバーにSSH接続する方法を紹介します。

1. Cloudflare Tunnelの導入

developers.cloudflare.com

Cloudflare Tunnelは、パブリックIPアドレスを公開することなく、プライベートなサーバーに安全にアクセスできるようになるトンネリングサービスです。具体的には、下図のようにcloudflaredという軽量なデーモンを起動してCloudflareのネットワークとの間に暗号化されたトンネルを作成します。

出典:Cloudflare Tunnel | Cloudflare Zero Trust docs

図ではブラウザからのHTTPリクエストとなっていますが、HTTP Webサーバーに限らずSSHサーバーやリモートデスクトップにも対応しています。

また、DDoS攻撃対策やWAFなど、Cloudflareのセキュリティ機能が適用されます。

Cloudflare Tunnelの導入手順は公式ドキュメントや多くの記事で紹介されているため、簡単なメモに留めます。

Cloudflareダッシュボードの「Zero Trust」→「Networks」→「Tunnels」→「Create a tunnel」

適当なトンネル名を入力

Raspberry PiUbuntuを利用しているので「Debian」「arm64-bit」を選択し、コマンドを実行

ターミナル上でcloudflaredのサービスが起動しているか確認

ダッシュボード上でもコネクターの状態が「Connected」になっていることを確認

任意のサブドメインとCloudflareで管理しているドメインを入力し、SSH接続でlocalhost:22をURLとして指定

作成したトンネルが一覧に表示されていることを確認(かつてのK8s on Raspberry Piの姿も...)

ここまでで、Cloudflare Tunnelの導入は完了です。

2. Cloudflare Accessの導入

次にCloudflare Accessを導入します。

developers.cloudflare.com

Cloudflare Tunnelを単体で利用する場合、SSHサーバーが全世界に公開された状態になります。その結果、パスワードのブルートフォース攻撃や正当なユーザーの秘密鍵盗難など不正アクセスのリスクが高まります。SSHの認証方式(パスワード・公開鍵)に依存するのは避けるべきです。

出典:トンネリング・ソフトの安全確保 | Argo Tunnel | Cloudflare

Cloudflare Accessを利用することで、アクセスポリシーを適用して誰がアプリケーション(今回はSSHサーバー)に到達できるかを制御できます。今回はEmailを使用しますが、他にも公式ドキュメントで示されているような様々な認証方法があります。

Cloudflare Accessの導入手順も、以下の簡単なメモに留めます。

Cloudflareダッシュボードの「Zero Trust」→「Access」→「Applications」→「Add an application」

Cloudflare Tunnelと同じサブドメインドメインを入力

アプリケーションへのグループ(未作成)の割り当てが必要

別タブで「Access」→「Access Groups」→「Add a group」

今回は「Include」ルールとして対象者のメールアドレスを設定

元のタブで、作成したグループを「Include」として割り当てる

今回は「Setup」はデフォルトのままにする

作成したアプリケーションが一覧に表示されていることを確認

以上でCloudflare AccessとCloudflare Tunnelを併用できるようになりました。

3. 動作検証

動作検証を行います。

手元のマシン(Macbookなど)にもcloudflaredが必要なので、公式ドキュメントを参考にして事前にインストールしてください。

~/.ssh/configに以下を追記します。

Host hogelab
  HostName <YOUR_SUBDOMAIN>.<YOUR_DOMAIN>
  ProxyCommand cloudflared access ssh --hostname %h

ssh hogelabを実行すると、ブラウザーが起動してメールアドレスを入力できるので、メールアドレスに届いた数字を入力するとアクセスが許可されます。

メールアドレス認証のフロー

ターミナルに戻ると、無事にSSH接続できていることが確認できます。

余談ですが、今回のように踏み台サーバーにSSH接続を行う場合はProxyJumpを使うと簡単に多段SSHできて便利です。詳細は以下の記事を参考にしてください。

多段 ssh するなら ProxyCommand じゃなくて ProxyJump を使おう

まとめ

Cloudflare TunnelとCloudflare Accessを導入して、VPNを利用できない場合でも安全に研究室サーバーにSSH接続できるようになりました。

非常に便利かつ無料なサービスなので、Cloudflareで管理しているドメインがある人は積極的に活用してみてください。ちなみに私はCloudflare Tunnel利用がきっかけでお名前.comからCloudflareにドメインを移管した過去があります。

*1:L2TP/IPSecの場合はUDP 500/1701/4500, IP(ESP)50のポートを開放する必要があります