こんにちは、たねやつです。
自宅のRaspberry PiでWebサーバーやアプリケーションを動かしていると、外部からアクセスしたくなりますよね。しかし、自宅のルーターにポート開放を行うのはセキュリティ的に不安が残ります。今回は、そんな悩みを解決する「Cloudflare Tunnel」を使って、ポート開放せずにRaspberry Pi上のサービスを安全に外部公開する方法を紹介します。
この記事でできること
- Cloudflare Tunnelのセットアップができるようになる。
- Raspberry Pi上のローカルサービスを独自ドメインで外部に公開できるようになる。
- ポート開放をせずに、安全なWebアクセスを実現する方法を理解できる。
事前に必要なもの
- Raspberry Pi セットアップ済みで、何らかのWebサービス(Webサーバーなど)がローカルで動作していること。
- Cloudflareアカウント 無料で作成できます。
- 独自ドメイン Cloudflareに登録するためのドメインが必要です。
手順
1. cloudflared のインストール
まず、Raspberry PiにCloudflare Tunnelのクライアントであるcloudflaredをインストールします。
# 作業ディレクトリに移動 cd ~/temp # arm64版のdebパッケージをダウンロード wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb # パッケージをインストール sudo apt install -y ./cloudflared-linux-arm64.deb
2. Cloudflareへのログイン
次に、cloudflaredを自分のCloudflareアカウントに紐付けます。
cloudflared tunnel login
このコマンドを実行すると、認証用のURLが表示されます。最新の取得先は公式サイトを確認してください。
A browser window should have opened at the following URL: https://dash.cloudflare.com/argotunnel?aud=&callback=https... If the browser failed to open, please visit the URL above directly in your browser.
PCなどのブラウザでこのURLにアクセスし、Cloudflareにログインします。ログイン後、公開したいドメインを選択して認証を完了させてください。
認証が成功すると、Raspberry Piの ~/.cloudflared/cert.pem に証明書ファイルが保存されます。
3. トンネルの作成と設定
次に、外部とRaspberry Piを繋ぐためのトンネルを作成します。
# my-tunnelの部分は好きな名前にしてください cloudflared tunnel create my-tunnel
成功すると、トンネルのUUIDとクレデンシャルファイルの場所が表示されます。
次に、設定ファイルを作成します。~/.cloudflared/ ディレクトリに config.yml という名前でファイルを作成します。
vim ~/.cloudflared/config.yml
設定ファイルには、どのホスト名へのアクセスを、どのローカルサービスに転送するかを記述します。
# 作成したトンネルのUUID
tunnel: <Your-Tunnel-UUID>
# クレデンシャルファイルのパス
credentials-file: /home/<your-user-name>/.cloudflared/<Your-Tunnel-UUID>.json
ingress:
# 公開したいホスト名
- hostname: service1.your-domain.com
# 転送先のローカルサービス
service: http://localhost:8080
# 別のサービスも追加可能
- hostname: another-service.your-domain.com
service: http://localhost:3000
# 必須: マッチしないアクセスを弾くためのルール
- service: http_status:404
<Your-Tunnel-UUID> と your-domain.com の部分はご自身の環境に合わせて書き換えてください。クレデンシャルファイルへのパスは絶対パスで指定してください。あとからrootユーザーでサービスを起動する時に参照できなくなります。
4. サービスの起動
設定ファイルが完成したら、cloudflaredをサービスとして登録し、起動します。
sudo cloudflared --config /home/<your-user-name>/.cloudflared/config.yml service install
5. DNSの設定
最後に、CloudflareのDNS設定画面で、config.ymlに記述したホスト名(例: service1.your-domain.com)をトンネルに向けます。
- Cloudflareのダッシュボードにアクセスします。
- 対象のドメインを選択し、「DNS」メニューに移動します。
- 「CNAME」レコードを追加し、名前にサブドメイン名(service1等、
config.ymlで指定した値)、コンテンツにドメイン名を指定します。
これで設定は完了です!しばらく待つと、https://service1.your-domain.com のようなURLで、Raspberry Pi上のサービスにアクセスできるようになります。
実践例: Open-WebUIを公開する
以前の記事でセットアップした「Open-WebUI」を、実際にCloudflare Tunnelを使って外部公開する手順を解説します。
config.yml の ingress ルールに、Open-WebUI用の設定を追記します。Open-WebUIはポート 8080 で動作しているため、serviceには http://localhost:8080 を指定します。
ingress:
# ... 他の設定 ...
# Open-WebUI用の設定
- hostname: open-webui.your-domain.com
service: http://localhost:8080
# 必須: マッチしないアクセスを弾くためのルール
- service: http_status:404
ファイルを保存したら、CloudflareのDNS設定画面で、open-webui.your-domain.com という名前のCNAMEレコードを作成します。
これで、世界中のどこからでも https://open-webui.your-domain.com というURLで、自宅のAIチャット環境に安全にアクセスできるようになります。
Cloudflare Tunnelのセキュリティについて
Cloudflare Tunnelを利用する最大のメリットは、そのセキュリティの高さです。
- ポート開放が不要: 自宅のルーターに穴を開ける必要がないため、外部からの直接的な攻撃(ポートスキャンなど)を受けるリスクがありません。すべての通信はCloudflareとの間のアウトバウンド接続から始まるため、非常に安全です。
- DDoS攻撃からの保護: Cloudflareの強力なネットワークが、DDoS攻撃を含む悪意のあるトラフィックを吸収・緩和してくれます。
- WAF (Web Application Firewall): Cloudflareが提供するWAFにより、SQLインジェクションやクロスサイトスクリプリクティングといったアプリケーション層への攻撃からもサービスを保護できます。
- 通信の暗号化: ユーザーからCloudflare、そしてCloudflareからRaspberry Pi上の
cloudflaredデーモンまでのすべての通信が暗号化されます。 - アクセス制御: Cloudflare Zero Trustと連携することで、特定のメールアドレスやIDプロバイダ(Google, GitHubなど)による認証を簡単に追加でき、許可されたユーザーのみがアクセスできるように設定することも可能です。
- アプリケーション自体のセキュリティ対策: Cloudflare Tunnelは通信経路を強力に保護しますが、公開するアプリケーション自体が脆弱であっては意味がありません。 例えば、管理画面に簡単なパスワード(
admin,passwordなど)を設定していると、そこから侵入されてしまいます。必ず推測されにくい複雑なパスワードを設定し、可能であれば二要素認証を導入するなど、アプリケーションレベルでのセキュリティ対策も徹底してください。
これらの機能により、自宅サーバーを非常に安全な形でインターネットに公開することができます。
最後に
Cloudflare Tunnelを使うことで、これまで面倒でリスクも伴った自宅サーバーの公開が、驚くほど簡単かつ安全になりました。個人的なプロジェクトや、小規模なWebサービスを動かすには最適なソリューションだと思います。
皆さんもぜひ試してみてください!