研究室PCにCloudflare TunnelsでSSHする

研究室に置いてある自分のPCに外部からSSHしたいとき、ありますよね? 私はあります。

しかし、セキュリティの都合か、学内ネットワークはたいてい外部に公開されていません。ファイアウォール以前にグローバルIPアドレスを持ってさえいないわけです。僕もその壁を前に途方に暮れていたんですが、ふと呟いてみたところ次のような返信をいただきました。

この返信がドンピシャで、完璧な解決案でした。ありがとうございます! 本記事では、設定手順と過程で学んだことを書き残しています。

設定手順

以下の手順はあくまで備忘録です。次のような公式ドキュメントが存在しますので、詳しくはそちらをご覧ください。

ここでは仮に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はどうやって儲けてるんですか?

参考にしたもの

  1. Downloads · Cloudflare Zero Trust docs
  2. Via the command line · Cloudflare Zero Trust docs
  3. Run as a service on Linux · Cloudflare Zero Trust docs
  4. SSH · Cloudflare Zero Trust docs
  5. proxy - How does ssh ProxyCommand actually work? - Server Fault