6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

自宅サーバーのIPを秘匿しつつ、今話題のZeroTrustの恩恵にも預かりつつ、Minecraft(Bedrock)サーバーをなるべく安全に公開してみた

Last updated at Posted at 2023-06-14

おことわり

こちらのイベントのLT準備の思考整理用に慌てて作成した記事なので、めちゃめちゃ汚いです。申し訳ありません。
ご質問や、こここうした方が良いのでは?というご意見などは随時受け付けておりますので、是非コメントまで。

構成図

Inked68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f31353835302f64393465653437322d313265322d316638652d393232352d3234653631616537353766662e706e67.jpg

やったこと

  • さくらのVPSを契約
    • リバースプロキシとWebアプリを1個動かすだけなので最小スペック(メモリ1G/ストレージ50GB/100Mbps)を月額990円で契約
    • 本当はWebARENA Indigoでストレージだけ20GBの同スペックVPSが349円(349円!?!?)で提供されてるのでこっちを使いたいが、プリペイド系クレジットカードとかデビッド弾く設定だったので断念(NTTPCさん...この歳までクレカ作ってない僕にも救いはありませんか...?)
  • Cloudflareでドメインを取得
    • Proxyさせたときにアクセス元IPを拾う方法をまだ調べていないので、当座DNSOnlyモードでリバースプロキシのグローバルIPへ飛ばさせている(要改善)
    • VPS上で作成したFlaskアプリケーションをCloudflareTunnel経由で公開
  • FlaskでTrustMasterアプリケーションを作成
    • ブラウザからawsのグローバルIPチェックにリクエストを送信し、グローバルIPを取得
    • 取得したグローバルIPをFlaskにGETで通知
    • 受け取ったFlaskはその内容をwhitelistに追記する
    • Flaskへのアクセスはコンテナ内に留めて、同じスタックのnginxから、かつ特定ドメインでのアクセス時のみアクセス許可する(後述するBedrockリバースプロキシ用のnginxとは処理が別)
  • WireGuardで自宅サーバーへのVPNを構築
  • nginxでUDPリバースプロキシを構築
    • nginxでUDPのプロキシを通すには専用のオプションを付けてビルドしないと行けないため、まずはそのコンテナ構築
    • 構築したUDP対応のnginxでwhitelistの内容に沿ったIPフィルタリングを行う

TrustMasterはCloudflareTunnel経由でVPS上のFlaskへ接続させ、nginx(BedrockServerへのアクセス)はCloudflareのDNS設定経由で直接接続させている。

bedrock用のドメインはDNSOnlyモードで公開しているためVPSのIPは秘匿出来ないことになるが、本来そのためのVPS。一応CloudflareTunnelがUDPに対応してくれるか、自分がCloudflareDNSのProxiedモードをちゃんと調べてアクセス元IPをnginxから拾えるように実装すればVPSも自宅サーバーも完全にIPを秘匿出来るようになる。(ちょっと安全過ぎる)

既知の問題

  • nginxでconfigを動的に読み込むためには有償版のnginx plusを使わないといけないらしい
    新しくユーザーが追加される度にnginx restartが必要となる。このシステム経由でログインしてるユーザーは、別のユーザーが新規にwhitelistの登録操作(に伴うnginx -s reload)したときに切断される
  • PCからだとめっちゃラグい
    何故かiOS版とか今回検証用に購入したAndroid版とかからだと全然遅延を感じずに遊べるのに、PCから遊ぶとラグい。(チェスト開いたりエリトラ中のロケット花火が実行されるまで1~2秒くらいかかるという典型的な遅延状態)それぞれ同じ回線から接続しても同様の事象が再現するので、クライアント依存っぽい。

参考資料

nginx UDP対応版のビルド

nginx UDPの構成

WireGuard構築

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?