はじめに
ある研究室メンバーが自宅から研究室VPNに接続できず、サーバーにSSH接続できないという事例がありました。
調査してもらったところ、VPN接続のために開放する必要があるポート*1が防がれている可能性が高いと考えました。また、賃貸に住んでいるため勝手にポート開放することもできず、自宅から研究できないことに不便を感じているとのことでした。
本記事では、Cloudflare Tunnelを導入して上記のような環境でもVPNなしで安全に研究室サーバーにSSH接続する方法を紹介します。
1. Cloudflare Tunnelの導入
Cloudflare Tunnelは、パブリックIPアドレスを公開することなく、プライベートなサーバーに安全にアクセスできるようになるトンネリングサービスです。具体的には、下図のようにcloudflaredという軽量なデーモンを起動してCloudflareのネットワークとの間に暗号化されたトンネルを作成します。

図ではブラウザからのHTTPリクエストとなっていますが、HTTP Webサーバーに限らずSSHサーバーやリモートデスクトップにも対応しています。
また、DDoS攻撃対策やWAFなど、Cloudflareのセキュリティ機能が適用されます。
Cloudflare Tunnelの導入手順は公式ドキュメントや多くの記事で紹介されているため、簡単なメモに留めます。







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

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








以上で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にドメインを移管した過去があります。
