CloudflareでRaspberryPiをリモートSSHしてみた
Raspberry Piをリモート接続するときにSSHをよく使いますが、外部のネットワークからつなげようとするとどうしたらいいのか考えては模索してました。
いろいろ調べているとCloudflareを使うと、ホスト名を固定して簡単に外部ネットワークからリモート接続できるらしいです。
というわけで今回はCloudflareでRaspberry Piをリモート接続できるようにするための方法を試してみます。
用意するもの
- Cloudflareアカウント(無料で登録できます)
- ネームサーバーを自由に設定できるドメインサービス(Google Domainsなど)
- ネットワーク接続されたRaspberry Pi(当然ですがSSHが有効になっていることは必須です)
事前準備
- Cloudflareにドメイン設定をして、ネームサーバーをCloudflareに設定していること
- Cloudflare Zero Trustの作成を完了していること(FreeプランでOKです)
Cloudflaredをインストール
まずはCloudflareとRaspberry PiをつなげるためにCloudflaredをインストールします。
Raspberry Pi用のCloudflaredのパッケージは以下のコマンドでダウンロードできます(最新のバージョンは こちらで確認できます)。
wget https://github.com/cloudflare/cloudflared/releases/download/2023.3.1/cloudflared-linux-armhf.deb
以下のコマンドでcloudflaredをインストールします。
sudo apt install ./cloudflared-linux-armhf.deb
インストール後、以下のコマンドでバージョンが表示されたらインストールは完了です。
cloudflared --version
その後、以下のコマンドでcloudflaredで認証を実行します。
cloudflared tunnel login
実行するとブラウザが開いて認証画面が表示されるので、今回リモート接続で使用するドメインを選択します
以下の画面が出たら設定が完了しRaspberry Piに証明書ファイルがダウンロードされます。コマンド起動時に開いたブラウザは閉じても大丈夫です
Raspberry Piに /home/pi/.cloudflared/cert.pem
が作成されたらCloudflaredの設定は完了です。もし、ダウンロードに失敗した場合は選択したドメインが有効になっているか確認してみてください。
Cloudflare Tunnelの設定
続いて以下のコマンドでCloudflare Tunnelを作成します(今回はtunnel名を raspberrypi
にしています)。
cloudflared tunnel create raspberrypi
これで /home/pi/.cloudflared
内にtunnelの認証情報が書かれたjsonファイルが生成されます(ファイル名がtunnel IDです)。
Cloudflare tunnelの認証情報のファイルが作成されたところで今度はRaspberry PiでCloudflare Tunnelを使うための設定ファイルを用意します。
/home/pi/.cloudflared/config.yml
を開き、以下の内容を書き込み保存します。(Tunnel IDとHost Nameはご自身のものに書き換える必要があります)
tunnel: 【Tunnel Name】
credentials-file: /home/pi/.cloudflared/【Tunnel ID】.json
ingress:
- hostname: 【Host Name】
service: ssh://localhost:22
- service: http_status:404
設定ファイルを用意したら以下のコマンドでtunnelとDNSを紐づけます
cloudflared tunnel route dns 【Tunnel Name】 【Host Name】
動作確認として以下のコマンドでCloudflare Tunnleを立ち上げます。エラーにならずに起動できたらCloudflare Tunnelの設定は完了です。
cloudflared tunnel run 【Tunnel Name】
ブラウザからSSHできるようにする
Raspberry PiをリモートでSSHできるようになったので次にブラウザからSSHを接続できるようにしていきます。
Cloudflare Zero Trustの Access -> Applications
を開いて Add an application
をクリックして新規でアプリケーションを作成します。
追加されるアプリケーションタイプを Self-hosted
を選択します。
Configure Appではアプリケーション名はお好きなものを設定して、ドメインは /home/pi/.cloudflared/config.yml
に記入したしたドメイン名と同じものを設定します。
設定を終えたら他の設定はデフォルトのままで次の設定に進みます。
Add policiesではポリシー名とセッションの持続時間を設定して、ポリシーに入れるルールを設定します。今回はLogin Methodをポリシーに設定しました。
ここまで設定したら次の設定に進みます。
SetupではCORSの設定を行います。今回はお試しで運用するのでアクセス制限をなしにしてます。
同じくSetup画面の一番下にあるAdditional settingsではBrowser renderingを SSH
にして設定を完了させます。
接続してみる
実際にブラウザでSSH接続を試してみます。
ブラウザで /home/pi/.cloudflared/config.yml
に設定したホスト名で開くと以下の認証画面が表示されるのでメールアドレスを入力します(何故かCloudflareで設定しているメールアドレスだと認証コードのメールが送られなかったので、別のメールアドレスがいいかもしれないです)。
メールで認証コードが届いたらその認証コードを入力してログインします。
今度はSSH接続を行います。ユーザー名、パスワードはRaspberry PiにSSH接続するときに使っているものを使用します。
認証に成功するとブラウザ上にターミナルが表示されたらブラウザ上でSSH接続成功です。
まとめ
今回はCloudflareを使ってRaspberry Piをリモート接続してみました。
今ままで外部ネットワークからリモート接続しようとするとファイヤーウォールとか固定IPとかいろいろ設定があると思っていたのですが、Cloudflareを使うことで複雑な設定をすることなく接続できました。
しかも月にかかる費用はドメインの使用料だけでCloudflare側は費用がかからずお得に使えるのは魅力的です。
SSHはできたので今度はVNCでリモートデスクトップできるかも試していきたいです!
Discussion