Velocityで安全な分散サーバーを構築してみる

今回はVelocityを使用して安全な分散サーバーを構築してみようかと思います。
OSはUbuntu22.04を使用しています。

1.Velocityのダウンロード&設定

こちらのリンクに飛び「Velocity〇.〇.〇-SNAPSHOT Build #〇〇〇」 の部分を右クリックし、リンクのアドレスをコピーします。
$ mkdir velocity
$ cd velocity
$ wget -O velocity.jar 先ほどコピーしたリンク
$ java -Xms1024M -Xmx1024M -jar velocity.jar

でVelocityの設定ファイルなどが生成されますので、次に基本的な設定が書いてあるvelocity.tomlを編集します
ここでは編集を加える部分を右側にコメントアウトで表示します。
$ vim velocity.toml

velocity.toml
# Config version. Do not change this
config-version = "2.7"

# What port should the proxy be bound to? By default, we'll bind to all addresses on port 25577.
bind = "0.0.0.0:25565" #Velocityで使用するポート。デフォルトは25577だが、今回はMinecraftのデフォルトポートである25565を使用する。
# What should be the MOTD? This gets displayed when the player adds your server to
# their server list. Only MiniMessage format is accepted.
motd = "<#09add3>A Velocity Server" #サーバーのMOTDを記述。色を変えたいときはMiniMessage形式を使用する。

# What should we display for the maximum number of players? (Velocity does not support a cap
# on the number of players online.)
show-max-players = 500

# Should we authenticate players with Mojang? By default, this is on.
online-mode = true

# Should the proxy enforce the new public key security standard? By default, this is on.
force-key-authentication = false #trueからfalseへ変更

# If client's ISP/AS sent from this proxy is different from the one from Mojang's
# authentication server, the player is kicked. This disallows some VPN and proxy
# connections but is a weak form of protection.
prevent-client-proxy-connections = false

# Should we forward IP addresses and other data to backend servers?
# Available options:
# - "none":        No forwarding will be done. All players will appear to be connecting
#                  from the proxy and will have offline-mode UUIDs.
# - "legacy":      Forward player IPs and UUIDs in a BungeeCord-compatible format. Use this
#                  if you run servers using Minecraft 1.12 or lower.
# - "bungeeguard": Forward player IPs and UUIDs in a format supported by the BungeeGuard
#                  plugin. Use this if you run servers using Minecraft 1.12 or lower, and are
#                  unable to implement network level firewalling (on a shared host).
# - "modern":      Forward player IPs and UUIDs as part of the login process using
#                  Velocity's native forwarding. Only applicable for Minecraft 1.13 or higher.
player-info-forwarding-mode = "modern" #NONE から modernに変更

# If you are using modern or BungeeGuard IP forwarding, configure a file that contains a unique secret here.
# The file is expected to be UTF-8 encoded and not empty.
forwarding-secret-file = "forwarding.secret"

# Announce whether or not your server supports Forge. If you run a modded server, we
# suggest turning this on.
#
# If your network runs one modpack consistently, consider using ping-passthrough = "mods"
# instead for a nicer display in the server list.
announce-forge = false

# If enabled (default is false) and the proxy is in online mode, Velocity will kick
# any existing player who is online if a duplicate connection attempt is made.
kick-existing-players = false

# Should Velocity pass server list ping requests to a backend server?
# Available options:
# - "disabled":    No pass-through will be done. The velocity.toml and server-icon.png
#                  will determine the initial server list ping response.
# - "mods":        Passes only the mod list from your backend server into the response.
#                  The first server in your try list (or forced host) with a mod list will be
#                  used. If no backend servers can be contacted, Velocity won't display any
#                  mod information.
# - "description": Uses the description and mod list from the backend server. The first
#                  server in the try (or forced host) list that responds is used for the
#                  description and mod list.
# - "all":         Uses the backend server's response as the proxy response. The Velocity
#                  configuration is used if no servers could be contacted.
ping-passthrough = "DISABLED"

# If not enabled (default is true) player IP addresses will be replaced by <ip address withheld> in logs
enable-player-address-logging = true

[servers]
# Configure your servers here. Each key represents the server's name, and the value
# represents the IP address of the server to connect to.
# ここの項目ではバックエンドのサーバーを定義しておく
# デフォルトでは
# lobby = "127.0.0.1:30066"
# factions = "127.0.0.1:30067"
# minigames = "127.0.0.1:30068"
# となっている
hub = "0.0.0.0:25566"
main = "0.0.0.0:25567"

# In what order we should try servers when a player logs in or is kicked from a server.
try = [
    "hub" #プレイヤーが移動先のサーバーで蹴られたときに代わりに接続するサーバー。デフォルトでは lobby が指定されている。
]

[forced-hosts]
# Configure your forced hosts here.
# ホスト名によってどのバックエンドサーバーに転送をさせるかの設定。
# デフォルトは以下の通りである。今回は使用しない。
# "lobby.example.com" = [
#     "lobby"
# ]
# "factions.example.com" = [
#     "factions"
# ]
# "minigames.example.com" = [
#     "minigames"
# ]

[advanced]
# これより下の設定は高度な設定となるため通常は変更する必要はない。(一部だけ解説はします。)
# How large a Minecraft packet has to be before we compress it. Setting this to zero will
# compress all packets, and setting it to -1 will disable compression entirely.
compression-threshold = 256

# How much compression should be done (from 0-9). The default is -1, which uses the
# default level of 6.
compression-level = -1

# How fast (in milliseconds) are clients allowed to connect after the last connection? By
# default, this is three seconds. Disable this by setting this to 0.
login-ratelimit = 3000

# Specify a custom timeout for connection timeouts here. The default is five seconds.
connection-timeout = 5000

# Specify a read timeout for connections here. The default is 30 seconds.
read-timeout = 30000

# Enables compatibility with HAProxy's PROXY protocol. If you don't know what this is for, then
# don't enable it.
# HAProxyを使用する際の設定。使用しない場合はそのままfalseでよい。
haproxy-protocol = false

# Enables TCP fast open support on the proxy. Requires the proxy to run on Linux.
tcp-fast-open = false

# Enables BungeeCord plugin messaging channel support on Velocity.

bungee-plugin-message-channel = true

# Shows ping requests to the proxy from clients.
show-ping-requests = false

# By default, Velocity will attempt to gracefully handle situations where the user unexpectedly
# loses connection to the server without an explicit disconnect message by attempting to fall the
# user back, except in the case of read timeouts. BungeeCord will disconnect the user instead. You
# can disable this setting to use the BungeeCord behavior.
failover-on-unexpected-server-disconnect = true

# Declares the proxy commands to 1.13+ clients.
announce-proxy-commands = true

# Enables the logging of commands
log-command-executions = false

# Enables logging of player connections when connecting to the proxy, switching servers
# and disconnecting from the proxy.
log-player-connections = true

# Allows players transferred from other hosts via the
# Transfer packet (Minecraft 1.20.5) to be received.
accepts-transfers = false

[query]
# クエリー設定。使用する場合はportの設定値をbindの値と同じにする。
# Whether to enable responding to GameSpy 4 query responses or not.
enabled = false #クエリーを有効にするかの設定

# If query is enabled, on what port should the query protocol listen on?
port = 25565 #デフォルト: 25577

# This is the map name that is reported to the query services.
map = "Velocity"

# Whether plugins should be shown in query response by default or not
show-plugins = false

これで基本的なvelocity.tomlの変更が完了しました。

2.バックエンドのサーバーの準備

今回はバックエンドサーバーとして hub, main という2つのサーバーを用意します。
先程のVelocityディレクトリとは別にディレクトリを作成して構築します。
また、工程がほぼ同じなので片方のみ解説しますが、別々に設定するところは両方とも記述します。
こちらのリンクに飛んで「Paper〇.〇〇.〇 Build #〇〇〇」の部分を右クリックして、リンクのアドレスをコピーします。
$ mkdir hub
$ cd hub
$ wget -O paper.jar 先ほどコピーしたリンク
$ java -Xms1024M -Xmx1024M -jar paper.jar nogui

停止後
$ vim eula.txt
eula=falseeula=trueに変更。

次にserver.propertiesを変更します。
$ vim server.properties
enforce-secure-profile=true → false
online-mode=true → false
server-ip=(空欄) → 0.0.0.0
# hubの場合
server-port=25565 → 25566
# mainの場合
server-port=25565 → 25567

paper-global.ymlの変更
$vim ./config/paper-global.yml
proxies:
proxy-protocol: false
bungee-cord:
online-mode: true
velocity:
enabled: true #falseからtrueに変更
online-mode: true
secret: ***** #ここに関してだが、Velocityのディレクトリの「forwarding.secret」の中身をそのままコピペする。

以上でバックエンドサーバーの設定が完了しました。
Velocityとバックエンドサーバーを起動させてMinecraftから、サーバーのローカルIPアドレスで接続できることを確認し、/server <サーバー名> というコマンドでサーバー移動ができます。

3.Velocityのおすすめプラグイン

僕個人が考えるVelocityに導入可能なおすすめプラグインリストです。

プラグイン名リンク概要
advancedportalsGitHub, Modrinth, SpigotMCポータルプラグイン
サーバー間移動が可能なポータルを作成できる
バックエンドサーバーにも導入する必要がある
ClientCatcherGitHub, Hangar, Modrinthクライアント検出プラグイン
特定のクライアントの接続を防止できたりする
LuckPermsGitHub, LuckPerms, SpigotMC権限管理プラグイン
FloodgateGitHub, GeyserMC, HangarGeyserで統合版ユーザーをサポートするときにJava版アカウントが無くても接続できるようにするプラグイン
GeyserGitHub, GeyserMC, Modrinth, SpigotMC統合版のサポートを可能にするプラグイン
GeyserSkinManagerGitHub, SpigotMCGeyserで統合版をサポートしたときのスキンを反映させるプラグイン
ServerListPlusBukkit, GitHub, SpigotMCサーバーのMOTDを変更できるプラグイン。
VelocityのMOTD設定とは違い、カラーコードや装飾コードを使用できる
また、プロトコルバージョンやバージョンの指定もできる
OneVersionRemakeGitHub, Modrinth, SpigotMCプロキシ接続バージョンを制限するプラグイン
PAPIProxyBridgeGitHub, Hangar, Modrinth, SpigotMCPAPIをブリッジするプラグイン
バックエンドにPAPIが必要
ReWhitelistGitHub, Hangarプロキシ自体にホワイトリストを設定するプラグイン
既存のバックエンドのホワイトリストコマンドを上書きするのでバックエンドサーバーごとにホワイトリストを指定する場合はバックエンドサーバーのコンソールでホワイトリストコマンドを実行する必要がある
SnapGitHub, HangarVelocityでBungeeCordのプラグインを実行できるようにする
動作しないプラグインもある
TABGitHub, ModrinthTABLISTプラグイン
プロキシ上で正常に動かすためにはバックエンドサーバーにTAB-Bridgeの導入が必要
VelocityPlusGitHubBungeeCordで使用可能なsendやalertなどのコマンドを実装するプラグイン

4.VelocityでLunaChatのグローバルチャット機能を使用する方法

BungeecordやWaterfallでは使用可能なチャンネルチャットプラグインであるLunaChatですが、Velocityには対応しておらずサーバー間チャット動機を行うことができません。
しかし、この問題を解決するプラグインがRyuZUPluginChatです。このプラグインはRedisを使用してサーバー間のチャットを同期する事ができます。
RyuZUPluginChatをバックエンドのサーバーにのみ導入し、config.ymlからRedisの設定を行い、グローバルチャンネルの設定をすればサーバー間のチャット同期ができます。

5.JapanMinecraftServersで発生する不正なプロトコル番号エラーの対処法

Velocityを使用していると、JapanMinecraftServersでサーバー登録をすると不正なプロトコル番号エラーでサーバーのロックがかかってしまう場合があります。
これの対処法はVelocityにViaVersion系のプラグインが入っている場合は、バックエンドサーバーのみに導入し、ServerListPlusでプロトコル番号を指定することで解決します。プロトコル番号は https://wiki.vg/Protocol に記載されているのでそこから選んでください。
なぜVelocityにViaVersion系のプラグインが不要なのかというともともとVelocityは1.7.2から最新リリース版までのバージョンの接続に対応しているためバックエンドサーバーにのみViaVersion系のプラグインを導入するだけで良いのです。

6.チャットメッセージの検証に失敗するエラーの対処法

一部バックエンドサーバーのバージョンで「チャットメッセージの検証に失敗しました」というエラーで蹴られることがあります。
このエラーの対処法は、VelocityにvPacketEventsSignedVelocity(SignedVelocity-Proxy)を導入し、バックエンドのサーバーにAntiPopupPacketEventsSignedVelocity(SignedVelocity-Paper)を導入することで解決します。

Tags:

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です