どうも、どうもどうも、どうもこんちゃ、ねくすちゃんです。
今回は、BungeeCordとWireguardでMinecraftサーバーを自宅のポート開放無しで公開する方法を解説します。
まあまあ需要のあるトピックではあると思うんですが、調べてもなかなか出てこないんですよね。調べて出てくる数少ない情報を探ってみても、NginxのUDPリバースプロキシを使った方法や、iptablesを使った方法、公開ツールを使った方法しか出てきません。ですが、実はもっと簡単な方法があります。
方法
この方法の一番の特徴は、BungeeCordを自宅の外に置くところです。
BungeeCordとは、Minecraft用のリバースプロキシです。リバースプロキシとは、送られてきたパケットをそのまま横流しするWebサーバーの一種です。(「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典https://wa3.i-3-i.info/word1755.html)
インターネットで流れてきたMinecraftクライアントからのパケットを、VPSのBungeeCordで処理し、そのパケットをWireguardで自宅サーバーに送信します。
それぞれの役割
- 自宅サーバーではSpigotサーバーとWireguardクライアントをホストします。
- VPSではBungeeCordとWireguardサーバーをホストします。
- WireguardはVPSと自宅サーバーをつなぎます。
- BungeeCordはインターネットとMinecraftサーバーの中間で通信の橋渡しをします。
- Spigotサーバーは、Minecraftサーバーで言うプラグインサーバーです。
当記事での環境
自宅サーバーOS | Ubuntu 24.04 LTS |
自宅サーバープライベートIP | 192.168.3.85 |
自宅サーバーVPN内IP | 10.0.0.2 |
VPS | Vultr Cloud Compute メモリ1GB |
VPSのOS | Ubuntu 24.04 LTS |
VPSグローバルIP | 45.77.xxx.xxx |
VPSのVPN内IP | 10.0.0.1 |
使用するSSHクライアント | TeraTerm |
BungeeCordポート | 25565 |
BE版接続用ポート(Geyser) | 19132 |
Spigotサーバーポート | 25566 |
Spigotバージョン | 1.21.1 |
Spigotサーバーディレクトリ | /opt/spigot |
※VPN内IPは、VPS側から自宅サーバーにパケットを送信する際に使用するIPアドレスです。
※VPSはVultrを使っています。お好きなサービスをお使いください。
※BungeeCordポートは25565である必要があります。
※BE版接続用ポートは19132である必要があります。
※Spigotサーバーポートは任意の数字で構いません。
必要なもの
- 自宅サーバー
- VPS
- ドメイン
BungeeCordをVPSで動作させるため、VPSはメモリが1GB以上のものを用意してください。
自宅サーバー&VPS編:下準備
ファイアーウォールを開けておく必要があります。開けるポートは自宅サーバー側は22/tcp、25566/tcp、51820/udp、VPS側は22/tcp、19132/udp、25565/tcp、51820/udpです。
自宅サーバー編:Spigotサーバーの導入&設定
自宅サーバーにSSH接続します。
OpenJDK 21をインストールします。
$ sudo apt update -y
$ sudo apt install openjdk-21-jdk -y
/optにspigot用のディレクトリを作成し、移動します。
$ cd /opt
$ sudo mkdir spigot
$ cd spigot
Spigotをダウンロードし、ビルドします。
SpigotMCのダウンロードページに飛び、BuildTools.jarのリンクを取得します。Chromeだったら右クリックで”リンクのアドレスをコピー”が出てくるかと思います。(どのSpigotバージョンでもBuildToolsのファイル名は同じBuildToolsなので、実際には下のコマンドを実行するだけでいいかもしれない。)
1.21.1の部分は、インストールしたいバージョンを指定しましょう。
$ sudo wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
$ sudo java -jar BuildTools.jar --rev 1.21.1
ビルドは少し時間がかかるので気長に待ちましょう。
Spigotサーバーの起動コマンドです。1500MのところはSpigotサーバーに割り当てるメモリ量、1.21.1のところはインストールしたバージョンを指定します。
$ sudo java -Xms1500M -Xmx1500M -jar spigot-1.21.1.jar nogui
初回起動の際は、eulaがfalseになっているため起動しません。eula.txtでeulaをtrueに設定します。
$ sudo vi eula.txt
:wqで保存して終了し、もう一度起動コマンドを実行します。
起動し、Minecraftクライアントから接続できることが確認出来たら、stopでSpigotサーバーを停止します。
BungeeCordに接続するための設定を行います。spigot.ymlを開きます。
$ sudo vi spigot.yml
下の方にあるbungeecord:falseをtrueにします。
:wqで保存して終了します。次は、server.propertiesを開きます。
$ sudo vi server.properties
online-modeをfalse、server-portを25566にします。
これでSpigotサーバーの導入と設定は完了です。
自宅サーバー編:Wireguardの導入&設定
Wireguard用のConfigを作成します。下のサイトで作成します。
『Number of Clients』を「1」
『Endpoint (Optional)』を「45.77.xxx.xxx:51820」(VPSのグローバルIP:51820)
『Use Pre-Shared Keys (Enhanced Security)』にチェック(セキュリティをエンハンスドしてくれるらしい。)
Wireguardをインストールし、/etc/wireguard/wg0.confに先ほど作成したConfigのClient 1をコピーして貼り付けます。
$ cd
$ sudo apt install wireguard
$ sudo vi /etc/wireguard/wg0.conf
[Interface]の最後にTable = off、[Peer]の最後にPersistentKeepAlive = 30を追記します。
[Interface]
Address = 10.0.0.2/24
ListenPort = 51820
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Table = off
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 45.77.xxx.xxx:51820
PersistentKeepAlive = 30
:qwで保存し終了します。
Wireguardのsystemdをenableし、restartします。
$ sudo systemctl enable --now wg-quick@wg0
$ sudo systemctl restart wg-quick@wg0
これで自宅サーバー側の操作は終了です。
VPS編:BungeeCordの導入&設定
VPSにSSH接続します。
OpenJDK 21をインストールします。
$ sudo apt update -y
$ sudo apt install openjdk-21-jdk -y
/optにspigot用のディレクトリを作成し、移動します。
$ cd /opt
$ sudo mkdir bungeecord
$ cd bungeecord
BungeeCordをダウンロードします。
BungeeCordのダウンロードページに飛び、BungeeCord.jarのリンクを取得します。Chromeだったら右クリックで”リンクのアドレスをコピー”が出てくるかと思います。(どのBungeeCordバージョンでもBungeeCordのファイル名は同じBungeeCord.jarなので、実際には下のコマンドを実行するだけでいいかもしれない。)
1.21.1の部分は、インストールしたいバージョンを指定しましょう。
$ sudo wget https://ci.md-5.net/job/BungeeCord/lastSuccessfulBuild/artifact/bootstrap/target/BungeeCord.jar
$ sudo java -Xms512M -Xmx512M -jar BungeeCord.jar nogui
正常に起動出来たら、endで終了しましょう。
Spigotサーバーのサーバー終了はstop、BungeeCordのサーバー終了はendです。
BungeeCordのConfigを開きます。
$ sudo vi config.yml
serversに先ほど建てたSpigotサーバーを指定します。
「lobby」はSpigotサーバーにつける名前です。任意の文字列にして構いませんが、少し下にあるprioritiesをそれと同じ文字列にしなくてはなりません。「motd」はサーバーの説明、「address」はSpigotサーバーのIPアドレスとポート番号です。ここでのIPアドレスは、自宅サーバーのVPN内IPです。
#初期値
servers:
lobby:
motd: '&1Just another BungeeCord - Forced Host'
address: localhost:25565
restricted: false
#今回の設定
servers:
survival:
motd: 'A Minecraft Server'
address: 10.0.0.2:25566
restricted: false
hostのポート番号を変更します。
#初期値
host: 0.0.0.0:25577
#今回の設定
host: 0.0.0.0:25565
Adminの名前を指定します。md_5のところを自分のMinecraftの名前に変えます。
#初期値
groups:
md_5:
- admin
ip_forwardをtrueにします。
#初期値
ip_forward: false
#今回の設定
ip_forward: true
これでConfig.ymlの設定は完了です。ほかにも設定項目があるので、必要な方はMinecraft Japan Wikiをご覧ください。(Minecraft Japan Wiki ツール/BungeeCordhttps://minecraftjapan.miraheze.org/wiki/%E3%83%84%E3%83%BC%E3%83%AB/BungeeCord)
これでBungeeCordの導入&設定は完了です。
VPS編:Wireguardの導入&設定
Wireguardをインストールし、/etc/wireguard/wg0.confに前々項で作成したConfigのServerをコピーして貼り付けます。
$ cd
$ sudo apt install wireguard
$ sudo vi /etc/wireguard/wg0.conf
[Interface]の最後にTable = off、[Peer]の最後にPersistentKeepAlive = 30を追記します。
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Table = off
[Peer]
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PresharedKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.0.0.2/32
PersistentKeepAlive = 30
:qwで保存し終了します。
Wireguardのsystemdをenableし、restartします。
$ sudo systemctl enable --now wg-quick@wg0
$ sudo systemctl restart wg-quick@wg0
これでWireguardの導入と設定は完了です。
VPSと自宅サーバーがつながっているか確認できます。
$ sudo wg show wg0
自宅サーバー&VPS編:SpigotサーバーとBungeeCordを起動
Spigotサーバーを起動します。
$ cd /opt/spigot
$ sudo java -Xms1500M -Xmx1500M -jar spigot-1.21.1.jar nogui
BungeeCordを起動します。
$ cd /opt/bungeecord
$ sudo java -Xms512M -Xmx512M -jar BungeeCord.jar nogui
Minecraft Java版を起動し、「マルチプレイ」から「サーバーを追加」に移動し、サーバー名に任意のサーバー名、サーバーアドレスにVPSのIPまたはFQDNを入力します。緑色のアンテナ📶のようなものが表示されたら正常に公開できています。
接続できたら大成功です。
VPS編:BedrockEditionでも接続できるようにする
GeyserMCのサイトに行き、BungeeCord用のプラグインをダウンロードします。
Java版を持っていないBEユーザーでも接続できるようにするFloodgateのBungeeCord用プラグインもダウンロードします。
WinSCPなどのファイル転送ソフトを使い、/opt/bungeecord/pluginsに入れます。その後起動すればBE版からもサーバーに参加することができます。
まとめ
今回は、BungeeCordとWireguardを使い、自宅サーバーを外部に公開する方法を紹介しました。
個人的にはこの方法はNginxなど使うよりも簡単だと感じています。
誤字や質問等などはお問い合わせページ・管理人Misskeyにお願いします。
参考にさせていただいたサイト
【マイクラ】Javaバージョンのインストール方法を紹介!【Ubuntu対応】
https://agepote.jp/yakudatu/java-version-install
【マイクラ】丸わかり!SpigotMCをビルドする手順を紹介します!【ツール対応】https://agepote.jp/mcserver/spigot-build#index_id3
VPSとWireguardとnginxで自宅サーバーをポート開放せずに公開するhttps://qiita.com/nexryai/items/80381f6d3f87ff23d61b
SpigotMC Wiki Installation
https://www.spigotmc.org/wiki/spigot-installation
ツール/BungeeCord
https://minecraftjapan.miraheze.org/wiki/%E3%83%84%E3%83%BC%E3%83%AB/BungeeCord