Minecraftサーバーの通信をNginxのTCPリバースプロキシを経由させる

2021年6月3日

マイクラサーバーが落ちた時や別のアドレスからアクセスされた時に別のサーバーにつなぐ実装をします
サーバーのメンテナンス時にエラーを表示させたりする人向けです

はじめに

Nginxとngx_stream_moduleをインストールしてください
調べれば出てきます

まずモジュールをロードします
nginx.confの1番上でモジュールをロードしてください

load_module /usr/lib/nginx/modules/ngx_stream_module.so;

見やすくするためにconf.dフォルダの中にあるstream拡張子のファイルをstreamの設定ファイルとして読み込むようにします
nginx.confの適切な位置に以下の記述をしてください(分からないなら一番下に記述をしてください)

stream{
    include /etc/nginx/conf.d/*.stream;
}

conf.d 下に .stream という拡張子のファイルを作ってください ファイル名は何でも良いです
このファイルに設定をしていきます(拡張子に意味は無いのでこだわりのある方は変えても構いません)

任意のip以外のアクセスを拒否する

upstream mcserver_normal {
    server 127.0.0.1:25566;
}
upstream mcserver_error {
    server 127.0.0.1:25567;
}

server {
    listen 25565;
    proxy_pass $mcserver;
}

map $remote_addr $mcserver {
    192.168.11.5 "mcserver_normal";
    default "mcserver_error";
}

ポート25565にアクセスされた際にmapを使用してipアドレスを判定し接続先を変えています
この設定の場合、192.168.11.5からアクセスした人はポート25566 それ以外からアクセスした人は25567に繋がります
streamはhttpとは違うのでif文は使えません 代わりにmapを使ってipを判定します
これを応用すると指定されたプロキシ以外からのアクセスを弾いたりできます

サーバーにアクセスできない時にメンテナンスサーバーに接続する

upstream mcserver_normal {
    server 127.0.0.1:25566;
    server 127.0.0.1:25567 backup;
}
server {
    listen 25565;
    proxy_pass $mcserver_normal;
}

ポート25565にアクセスされた際にポート25566に繋がりますが接続が失敗した際に25565に接続します

分散処理

upstream mcserver_normal {
    server 127.0.0.1:25566;
    server 127.0.0.1:25567;
    server 127.0.0.1:25568;
}
server {
    listen 25565;
    proxy_pass $mcserver_normal;
}

ポート25565にアクセスされた際にポート25566 25567 25568のどれかに接続します
マイクラサーバーで分散処理を行うことはあまりないかもしれません

おすすめ

upstream mcserver_normal {
    server 127.0.0.1:25566;
    server 127.0.0.1:25567 backup;
}
upstream mcserver_error {
    server 127.0.0.1:25568;
}

server {
    listen 25565;
    proxy_pass $mcserver;
    error_log /var/log/nginx/mc_error.log info;
}

map $remote_addr $mcserver {
    <プロキシのipアドレス> "mcserver_normal";
    <ローカルのipアドレス> "mcserver_normal";
    default "mcserver_error";
}

自分のサーバーでは指定されたプロキシ以外からのアクセスを弾くためとメンテナンス表示とロギングのために使用しているのでこの設定です
また、ローカルからもアクセスすることがあるのでローカルのipアドレスも接続できるようにしています

また、エラー用のサーバーを建てるほどサーバーのリソースに余裕がない人はFakeMCServerを使用してみてもいいかもしれません
かなりカスタマイズも出来ますしおすすめです