minecraft
haproxy
VirtualHost

HAProxyでMinecraftでもVirtualHostを実現させる

More than 1 year has passed since last update.

機能概要 What you can do by reading this article

dev1.domain.tldでアクセスしたときはdev1のMinecraftサーバへ、
dev2.domain.tldでアクセスしたときはdev2のMinecraftサーバへアクセスできるようにする。
ただし、dev1.domain.tldも、dev2.domain.tldも、同じグローバルIPを指すものとする。
Routing connections of Minecraft based on their domain names such as dev1.domain.tld or dev2.domain.ld WHILE those domains point the same global ip address.

方法概要 Logic explanation

HAProxy(L7プロキシ)を使う。
Minecraftの接続確立時の通信内容(ドメイン名が含まれる)を一部読み取り、その内容に応じてルーティング先を制御する。
We use the Layer-7 proxy called HAProxy. Based on the payload information in the tcp packet after TCP handshake, determine to where the following packets go.

環境 Environment

CentOS 7.1
Craft Bukkit 1.8.8
HAProxy 1.5.14-3.el7

手順 How to

詳しくはここを。

frontendとして以下を記述。

/etc/haproxy/haproxy.cfg
frontend minecraft
    mode tcp                                  # MinecraftはTCP接続
    bind 0.0.0.0:25565                        # Minecraftポート(25565)で待ち受け
    tcp-request inspect-delay 5s              # 最大5秒の遅延までOK(SSLやSMTPでは必要だけどMinecraftでは要らないかも)

    acl mc_dev1_flg payload(4,4) -m sub dev1  # ドメイン名の先頭4文字がdev1なら
    tcp-request content accept if mc_dev1_flg # 受け入れる
    use_backend mc_dev1_app if mc_dev1_flg    # mc_dev1_appのバックエンドへ

    acl mc_dev2_flg payload(4,4) -m sub dev2
    tcp-request content accept if mc_dev2_flg
    use_backend mc_dev2_app if mc_dev2_flg

backendとして以下を記述。

/etc/haproxy/haproxy.cfg
backend mc_dev1_app
    server mc_dev1_srv 10.0.0.1  # 同じポートへならポート指定要らず

backend mc_dev2_app
    server mc_dev2_srv 10.0.0.2  # 10.0.0.1:25564 とかでもOK

結果 Result

楽しい。XD