☁️
Cloudflare Tunnelを使ってSSHする
つい先日 Raspberry Pi 4 Model B (8GB) を購入し、別のマシンや外出先からリモートで SSH できるようにしようと思っていたところ Cloudflare Zero Trust の Cloudflare Tunnel というものを知人から知ったので使ってみることにした。
前提条件
- ネームサーバーを Cloudflare にしていること
 
Tunnel を作る
著者はダッシュボードを使う方法を使用したので、そちらだけ記事に書かせていただきます。
コマンドラインだけで設定するには公式のドキュメントを読んでみてください。
- Cloudflare Zero Trust のダッシュボードへアクセスする
 - Access > Tunnelsへ移動して、Create a tunnelをクリック
 - Tunnel nameに名前を入力
 - 使っている OS とアーキテクチャを選択して、手順に従い
cloudflaredをサービス化する - Route tunnelでドメインを設定し、ServiceをSSH、URL にlocalhost:22を設定
 
アプリケーションを追加
- Cloudflare Zero Trust のダッシュボードへアクセスする
 - Access > Applicationへ移動して、Add an applicationをクリックしSelf-hostedを選択
 - Application domainにはRoute tunnelに設定したドメインと同じものを設定
 - Nextをクリックして、ポリシーやその他の設定を終えたらAdd applicationをクリックして完了
 
SSH で接続する
サーバー側
Cloudflare Tunnel を使うとSSH ポートを開放する必要がないので、ファイヤーウォールの設定の設定とかは特に必要ありません。
rootでログインさせないとか、パスワード認証使えないようにするとか最低限の設定だけしておけば大丈夫
Browser Rendering を使う場合
Short-lived certificatesの公開鍵を登録しておかないと毎回開くたびに公開鍵をよこせと要求されてしまうので、sshd_configにTrustedUserCAとして設定しておきましょう。
まずは公開鍵を作成して、入手します。
- Cloudflare Zero Trust のダッシュボードへ移動
 - Access > Service Auth > SSHの順で移動
 - 作成したアプリケーションを選択して、Generate certificateをクリック
 - 公開鍵をコピーして、
/etc/ssh/ca.pubに内容を貼り付けて作成 
sshd_configには以下のように設定を追加する
sshd_config
+PubkeyAuthentication yes
+TrustedUserCAKeys /etc/ssh/ca.pub
クライアント側
ssh-copy-id等などの手段を用いてサーバーに公開鍵を登録しておきましょう。
Short-lived certificatesを用いれば鍵作って登録して~みたいなことすらせずに済むのですが、何故かうまくいかなかったので著者は自分で作った鍵を登録する形にしました。
 ~/.ssh/config
~/.ssh/config
+Host ssh.example.com
+  User inkohx
+  IdentityFile 秘密鍵のパス
+  ProxyCommand cloudflared access ssh --hostname %h
接続
ssh ssh.example.com
終わり
SSH in Browser できるのスマホからも操作できるしすごいけど、デスクトップからだとコピー&ペーストをショートカットキーでできないの地味に不便だったりする。
Discussion