📡

CloudflareでRaspberryPiをリモートSSHしてみた

2023/03/18に公開

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