ペグ園

ぺぐぞの

【Minecraft】Waterfall (BungeeCord) + HaProxy (DDNSあり) の設定メモ

はじめに

ご覧いただきありがとうございます。ペグ酸です。

Minecraft (Java Edition) のマルチプレイサーバーで、DDNS配下のWaterfallプロキシに、HaProxy経由でアクセスする際の設定を、備忘録としてまとめます。

環境は、プレイヤー → HaProxy 2.4.18 → Waterfall 1.19.3、というものです。サーバーのOSはUbuntu 22.04で検証しています。

なお、参考にされる際は自己責任でお願いします。もし良くない設定などあれば、コメント欄でご教示いただけると幸いです。

目次

Waterfallの設定

Waterfallのconfig.ymlにおいて、prevent_proxy_connectionsfalseに設定変更します。 これを行わないと、プロキシ経由で接続しても弾かれます。

prevent_proxy_connections: false

適宜、Waterfallのポートには、HaProxyのサーバーからしかアクセス出来ないように設定してください。 ufwiptablesで弾く、VPNで接続する方法などが考えられます。

HaProxyの設定

/etc/haproxy/haproxy.cfg を以下のように設定します。

DDNS配下のIPアドレスが変わっても、数十秒程度で反映されます。死活監視の間隔を変更したい場合は公式のドキュメントを参照してください。

# DDNSの名前解決用のDNSサーバの指定。CloudFlareのものと、Googleのものを指定しています。何でも良いです。
resolvers nameservers
    nameserver ns1 1.1.1.1:53
    nameserver ns2 1.0.0.1:53
    nameserver ns3 8.8.8.8:53
    nameserver ns4 8.8.4.4:53

# Waterfallへアクセスする設定。Waterfallは、waterfall.example.com:30000で動いているとします。
listen minecraft
        bind 0.0.0.0:25565
        server minecraft-backend waterfall.example.com:30000 send-proxy-v2 check-send-proxy resolvers nameservers init-addr last,libc,none

注意点・内容の軽い説明

3つあります。

send-proxy-v2を忘れない

忘れるとWaterfallサーバーに繋がらなくなります。

死活監視にはcheckではなく、check-send-proxyを使う

checkでも動きますが、2秒おきに来る死活監視のパケット(っぽいもの)にWaterfallが反応して、エラーでサーバーログが埋め尽くされてしまいます。

check-send-proxyを使うとサーバーログが埋め尽くされることはありません。

DDNSの名前解決として、resolvers, init-addrを使う

resolvers nameserversで、DNSサーバーを指定しています。

init-addrは、HaProxy起動時の名前解決をどうするかを指定するものです。lastは最後に名前解決したときのものを使用する、libcDNSサーバーに名前解決を問い合わせる、というものです。

おまけ: Votifierもプロキシで行う設定

Votifierは、waterfall.example.com:9000で動いているとします。

こちらは、check-send-proxyではなく、checkを使います。

listen votifier
        bind 0.0.0.0:8192
        server votifier-backend waterfall.example.com:9000 check resolvers nameservers init-addr last,libc,none

最後に

Bedrock用のプロキシであるGeyserMCを動かしている関係上(HaProxyはUDPをプロキシ出来ない)、本当はnginxで統一したいのですが、上手く動いていません。このあたりも今後検証していきたいと考えています。

また、nginxでGeyserMC用の通信を中継する設定も近いうちにまとめたいと思います。

再度になりますが、参考にされる際は自己責任でお願いします。もし良くない設定などあれば、コメント欄でご教示いただけると幸いです。

ではまた!