自宅サーバにマイクラを入れて、CloudflareのWARPクライアント経由で接続できるようにした
2025/04/17複数人でプレイしていたValheimが終わった(現時点でのボスを全部倒した)ので、次やるゲームを相談していたところ、「1dayでマイクラクリアまでやる」というのはどうか、という話があがったので、なんとかほぼ無料でマイクラサーバを運用できないかを試した記録です。
今、Cloudflare Tunnel経由でWebサーバとして運用しているミニPCに相乗りさせる形で構築しました。
何をやったのか
- dockerでのマイクラサーバ立ち上げ
- Cloudflare Zero TrustでTunnelにPrivate Networkルートを追加
- Gatewayのネットワークポリシー設定
- WARPクライアントの設定
- Access アプリケーションの設定
- 自宅サーバにIPを追加
- 疎通確認
作業内容
dockerでのマイクラサーバ立ち上げ
このイメージを使えばOKでした。
Cloudflare Zero TrustでTunnelにPrivate Networkルートを追加
Cloudflare Zero Trustの画面から、ネットワーク>Tunnels>今使っているトンネルを選択>プライベート ネットワークを選択し、追加します。一般的なローカルIPのレンジであれば何を設定しても基本的には大丈夫です(ローカルネットワークで他の何かを運用していない限り)
サーバが1台のみであれば、「10.0.0.1/32」などIP一つでもOKです。
Gatewayのネットワークポリシー設定
WARPクライアントが入っているPCからアクセスできるように、Gatewayのポリシーを設定します。
Cloudflare Zero Trustの画面から、Gateway>ファイアウォールポリシー>ネットワークを選択し、ポリシーを追加します。この際以下の設定を実施します。
- トラフィック:Destination IP / is / プライベートネットワークで設定したIPレンジに当てはまるIP
- アクション:Allow
また、設定後にファイアウォールのプロキシ設定を実施するよう促されるので、設定>ネットワーク からプロキシをONにします。マイクラにおいてはTCPのみでOKです。
WARPクライアントの設定
設定>WARP クライアント から、以下の通りデバイス登録権限を設定します。
- ポリシー:メールアドレスなどで許可されるユーザを設定
- WARP 認証ID設定: WARP 認証 IDをONにする
また、設定>WARP クライアント>プロファイル設定 から、スプリットトンネルの確認を実施します。 ここで、プライベートネットワークで設定したIPレンジが除外されている場合は、除外リストから削除しておきます(除外リストに記載したIPは、WARPをバイパスして通常のネットワーク接続を行うため)
Access アプリケーションの設定
Access>アプリケーションから、以下の通りアプリケーションを追加します。
- 基本情報:プライベートIPを追加、プライベートネットワークで設定したIPレンジに当てはまるIPと、マイクラサーバのポート(通常は25565)
- Access ポリシー:メールアドレスなどで許可されるユーザを設定
- ログイン方法: WARP 認証 IDをONにする
自宅サーバにIPを追加
以下のコマンドで一旦疎通を通します。
sudo ip addr add {プライベートネットワークで設定したIPレンジに当てはまるIP}/32 dev lo
疎通確認
WARPをクライアントPCに接続し、設定画面からCloudflare Zero Trustにログインします。この際チーム名を入力+認証が求められるため認証します。
WARPからZero Trustに接続した状態で以下のコマンドで疎通確認をします。
nc -vz {サーバに設定したIP} 25565
疎通が取れればOKです。
オプション:よりトラブルシューティングをしやすい方法
Cloudflare TunnelにはRemotely-managed tunnelとLocally-managed tunnelがあり、Zero Trustのダッシュボード経由で指示に従いトンネルを作成した場合、Remotely-managed tunnelになります。
Remotely-managed tunnelはダッシュボード上で管理が完結するものの、Locally-managed tunnelはサーバ側に設定を持たせたり、cloudflared tunnel runコマンドで実行でき、通信のログがコンソールから確認できたりもするので、もし疎通ができない場合はLocally-managed tunnelで一旦組むのも良さそうです。
Locally-managed tunnelでのトンネル作成方法
上記「Cloudflare Zero TrustでTunnelにPrivate Networkルートを追加」の代わりに以下の手順をサーバ側で実施します。(cloudflaredがインストールされている前提)
- 以下コマンドを実行して、トンネルを作成します。作成後、UUIDが返ってくるので記録します。
cloudflared tunnel login
cloudflared tunnel create {トンネル名}
~/.cloudflared配下にconfig.ymlを作成します。
touch ~/.cloudflared/config.yml
nano ~/.cloudflared/config.yml
tunnel: {トンネル名}
credentials-file: /home/you/.cloudflared/{トンネルのUUID}.json
ingress:
- hostname: {適当な名前}
service: tcp://localhost:25565
- service: http_status:404
※ hostnameは実際使わないのですが、ファイルの形式上必要なので適当な値を設定します。
- 以下コマンドでライベート ネットワークを追加します。
cloudflared tunnel route ip add {IPレンジ(CIDR)} {トンネル名}
- 以下コマンドでトンネルを起動します。
cloudflared tunnel run {トンネル名}
感想
色々複雑な設定をやることにはなりましたが、非HTTPSのサーバもWARPクライアントを入れ、チーム内の認証を通ったクライアントからのみ繋げる形で安全を確保できる形の設定ができました。 諸々応用が効く内容なので、横展開もいけそうに思っています。
あと、ChatGPTと相談しながらやってたんですが、大まかな指針は出してくれるものの設定の抜け漏れ、落ち度はこっちが考えなければならなかった側面もあり、結構時間かかりました。