Cloudflareの無料プランで自宅サーバーを公開する手順を解説。NAT設定不要で安全にWebサービスを公開できます。
CloudflareのZero Trust機能「Tunnel」を使用すると、NAT設定なしで自宅サーバーを安全に公開できます。無料プランでも利用可能なため、Raspberry Piなどの低コストデバイスでの運用に最適です。
CloudflareのZero TrustではVPN接続によりローカルIPアドレスでのアクセスが可能です。VPN接続により、公共「野生(野郎)」のWifiに接続しても大丈夫であろう。たぶん。
※本記事ではVPN設定については扱いません。自宅サーバーのWeb公開に焦点を当てて解説します。
今回は自宅にあったRaspberry Pi 2 Model Bを使用しました。
※古いモデルのため公式パッケージで動作しませんでしたが、後述する方法で解決できます。
Raspberry Pi 2 Model Bのアーキテクチャはarmhf(ARM 32-bit)ですが、公式パッケージで動作しませんでした。 色々と探してみたところ Cloudflaredのリリースページから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の場合
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)
次に認証ファイルを配置します。
配置はコマンドを入力することで、半自動で配置してくれます。
cloudflared tunnel login
以下のようにURLが表示されるのでブラウザを開いてログインします。
https://dash.cloudflare.com/argotunnel?aud=&callback=httpsfffffFlogin.cloudflareaccess.org%ffffffffffffffffff
ブラウザーで登録されているドメインを選択し認証をします。
ログインが完了すると次のように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を作成します。
ここではras-tunnelとします。正常に動作するとjsonファイルが作成されます。
#cloudflared tunnel create 名前
cloudflared tunnel create ras-tunnel
以下のファイルはすべて/root/.cloudflaredディレクトリに作成されます。
作成されたjsonファイルに情報が記入されているので このjsonファイルの情報を元に、新規でconfigファイルを作成します。
Tunnel credentials written to /root/.cloudflared/fffff-fff-ffffff-fff-ffffffff.json....
jsonが入っているフォルダーと同じ所にconfig.ymlを作成します。
以下コピペしてtunnel,credentials-file,hotnameの3つを修正します。
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はjsonファイル名と同じ名前にします。
cloudflareに登録しているドメインのサブドメインを指定します(任意のサブドメイン名を指定可能)
localhostを指定します。reactだと一般的に3000ポートで動いているので
service: http://localhost:3000のように設定します。
次に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を作成した後はサービスを登録し、起動させます。
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
これで全ての設定が完了しました。
登録したサービスを削除する場合は、なぜか手動で消す必要がある。
cloudflared service uninstall
rm /etc/cloudflared/config.yml
パッケージではなく完全に削除する場合。 cloudflaredを完全に不要な場合は以下で削除できます。
apt remove cloudflared
Cloudflare Tunnelを使用することで、レンタルVPSサーバーを借りずに自宅サーバーを安全に公開できます。Raspberry Piなどの低コストデバイスでも24時間運用が可能です。