研究室PCにCloudflare TunnelsでSSHする
研究室に置いてある自分のPCに外部からSSHしたいとき、ありますよね? 私はあります。
しかし、セキュリティの都合か、学内ネットワークはたいてい外部に公開されていません。ファイアウォール以前にグローバルIPアドレスを持ってさえいないわけです。僕もその壁を前に途方に暮れていたんですが、ふと呟いてみたところ次のような返信をいただきました。
cloudflare tunnelというまさしくなツール・サービスがありますhttps://t.co/vCBbaWdJgC
— とりのマンボウ (@flat35hd99) May 12, 2023
この返信がドンピシャで、完璧な解決案でした。ありがとうございます! 本記事では、設定手順と過程で学んだことを書き残しています。
設定手順
以下の手順はあくまで備忘録です。次のような公式ドキュメントが存在しますので、詳しくはそちらをご覧ください。
- Tunnelの設定方法
Via the command line · Cloudflare Zero Trust docs - SSH接続を利用するときの設定方法
SSH · Cloudflare Zero Trust docs
ここでは仮にexample.com
をCloudflareのDNSで運用しているものとし、mylab.example.com
にアクセスすることで研究室PCにSSH接続できるようにします。適宜お持ちのドメインに読み替えてください。
インストール
まずは接続元・接続先PC共にcloudflared
をインストールし、ログインします。
OSごとのインストール方法はDownloads · Cloudflare Zero Trust docsをご覧いただきたいですが、たとえばmacOSの場合は次のようになります。
brew install cloudflared
インストールできたらログインします。
cloudflared tunnel login
Webブラウザが立ち上がった方はそこから、CUI環境の方は表示されるURLをコピペしてCloudflareにログインします。どのドメイン下にTunnelを作るか聞かれるので、お好きなものを(この記事ではexample.com
を)答えてください。
研究室PC(Tunnel作成)
cloudflared tunnel create <TUNNEL_NAME>
トークンなどの認証情報が書かれた~/.cloudflared/<TUNNEL_ID>.json
ができます。
そうしたら、~/.cloudflared/config.yml
に次のような設定を追加します。
url: ssh://localhost:22
tunnel: <TUNNEL_ID>
credentials-file: <<TUNNEL_ID>.json への絶対パス>
次に、DNSの設定をします。これでプライベートネットワーク外からはmylab.example.com
にアクセスすることで研究室PCにアクセスすることができるようになります。
cloudflared tunnel route dns <TUNNEL_ID> mylab.example.com
これでTunnelの設定は完了です。cloudflared
を再起動して設定を適用します。
sudo cloudflared --config <config.jsonへの絶対パス> service install
sudo systemctl restart cloudflared
再起動後、研究室PCとCloudflareがTunnelで接続されます。
手元のPC(SSH設定)
~/.ssh/config
を次のように編集して、Cloudflare経由でSSH接続するように設定します。
Host <NICKNAME>
Hostname mylab.example.com
User <USERNAME>
ProxyCommand <cloudflaredへの絶対パス> access ssh --hostname %h
接続方法
設定名だけで接続できるのを初めて知りました。
ssh <NICKNAME>
これでプライベートネットワーク内の研究室PCに外部からSSH接続できます!めでたい!便利!
終わりに
Cloudflareはどうやって儲けてるんですか?