Main Logo
hero-background.jpg

Cloudflare Tunnelで自宅サーバーを安全に公開する方法

CloudflareのZero Trust機能「Tunnel」を使った自宅サーバーの安全な公開方法

Cloudflareの無料プランで自宅サーバーを公開する手順を解説。NAT設定不要で安全にWebサービスを公開できます。


Cloudflare Tunnelとは

CloudflareのZero Trust機能「Tunnel」を使用すると、NAT設定なしで自宅サーバーを安全に公開できます。無料プランでも利用可能なため、Raspberry Piなどの低コストデバイスでの運用に最適です。

前提条件

  • Cloudflareアカウントの作成済み
  • 所有ドメインの登録済み
  • Cloudflare DNSの設定完了

ZeroTrust

CloudflareのZero TrustではVPN接続によりローカルIPアドレスでのアクセスが可能です。VPN接続により、公共「野生(野郎)」のWifiに接続しても大丈夫であろう。たぶん。
※本記事ではVPN設定については扱いません。自宅サーバーのWeb公開に焦点を当てて解説します。

自宅PC

今回は自宅にあったRaspberry Pi 2 Model Bを使用しました。
※古いモデルのため公式パッケージで動作しませんでしたが、後述する方法で解決できます。

サーバーにcloudflaredをインストールする

パッケージのインストール

Raspberry Pi 2 Model Bのアーキテクチャはarmhf(ARM 32-bit)ですが、公式パッケージで動作しませんでした。 色々と探してみたところ Cloudflaredのリリースページからarmhf版を発見し、正常にインストールできました。

cloudflare-tunnel-armhf

Raspberry Piの場合

パッケージのインストール
wget https://github.com/cloudflare/cloudflared/releases/download/2024.5.0/cloudflared-linux-armhf.deb
sudo apt install -y ./cloudflared-linux-armhf.deb

普通のPCの場合

amd64の場合
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

動作確認

コマンドを入力するとバージョン情報が表示されます。

インストールの確認
cloudflared --version
#バージョン表示
cloudflared version 2024.5.0 (built 2024-05-16-1622 UTC)

cert.pem

次に認証ファイルを配置します。
配置はコマンドを入力することで、半自動で配置してくれます。

cloudflared tunnel login

以下のようにURLが表示されるのでブラウザを開いてログインします。

URL表示
https://dash.cloudflare.com/argotunnel?aud=&callback=httpsfffffFlogin.cloudflareaccess.org%ffffffffffffffffff

ブラウザーで登録されているドメインを選択し認証をします。

cloudflare-tunnel-login1 cloudflare-tunnel-login2

ログインが完了すると次のようにcert.pemが作成されます。

Leave cloudflared running to download the cert automatically.
You have successfully logged in.
If you wish to copy your credentials to a server, they have been saved to:
/root/.cloudflared/cert.pem

tunnelを作成

次のコマンドでtunnelを作成します。
ここではras-tunnelとします。正常に動作するとjsonファイルが作成されます。

#cloudflared tunnel create 名前
cloudflared tunnel create ras-tunnel
ファイルの保存場所

以下のファイルはすべて/root/.cloudflaredディレクトリに作成されます。

jsonとconfigファイル

作成されたjsonファイルに情報が記入されているので このjsonファイルの情報を元に、新規でconfigファイルを作成します。

tunnelcreateで作成されたファイル
Tunnel credentials written to /root/.cloudflared/fffff-fff-ffffff-fff-ffffffff.json....
configファイル作成

jsonが入っているフォルダーと同じ所にconfig.ymlを作成します。
以下コピペしてtunnel,credentials-file,hotnameの3つを修正します。

config.yml
tunnel: fffff-fff-ffffff-fff-ffffffff
credentials-file: /root/.cloudflared/fffff-fff-ffffff-fff-ffffffff.json

ingress:
 - hostname: example.domain.com
   service: http://localhost
 - service: http_status:404
tunnelとcredentials-file

tunnelとcredentials-fileはjsonファイル名と同じ名前にします。

hostname

cloudflareに登録しているドメインのサブドメインを指定します(任意のサブドメイン名を指定可能)

service

localhostを指定します。reactだと一般的に3000ポートで動いているので service: http://localhost:3000のように設定します。

DNS登録

次にDNSの登録を行います。これもコマンドで設定ができます。

# tunnel route dns [トンネル名] [ドメイン]
cloudflared tunnel route dns ras-tunnel example.domain.com

DNSの更新には多少時間がかかります(通常2分~1時間程度)。

起動テスト

※ras-tunnelで作成しています。

cloudflared tunnel run ras-tunnel

設定したURLにアクセスすると、自宅サーバーのWebページが表示されるようになります。

サービスの登録

サービスとして登録して実行させておきます。

config.ymlを作成した後はサービスを登録し、起動させます。

先ほど作ったymlを指定
sudo cloudflared --config /root/.cloudflared/config.yml service install
# 成功時の表示例
2024-11-11T11:11:11Z INF Using Systemd
2024-11-11T11:11:11Z INF Linux service for cloudflared installed successfully

これで全ての設定が完了しました。

サービスの削除

登録したサービスを削除する場合は、なぜか手動で消す必要がある。

  1. 1.登録されたサービスをアンインストールする。
サービスアンインストール
cloudflared service uninstall
  1. 2.サービス登録時に自動作成されるconfigを削除します。
自動生成のconfigファイル
rm /etc/cloudflared/config.yml

cloudflaredを削除する場合

パッケージではなく完全に削除する場合。 cloudflaredを完全に不要な場合は以下で削除できます。

パッケージ削除
apt remove cloudflared

まとめ

Cloudflare Tunnelを使用することで、レンタルVPSサーバーを借りずに自宅サーバーを安全に公開できます。Raspberry Piなどの低コストデバイスでも24時間運用が可能です。

関連記事

コメントを読み込み中...