マンション勢によるゲームサーバー公開手法

前書き
マンション住まいでゲームサーバーを公開しようとしたところ、良くある集合住宅のグローバルIPが割当てられていない仕様のためサーバー公開ができませんでした。
比較的簡単にできると思っていましたが、かなりハマったので備忘録がてら記事にしてみました。


ゲームサーバーを公開するには何が必要か

グローバルIPを得る為に必要なこと

色々なサイトを巡回して調べた結果、VPS(さくら、CONOHA、AWSとか)のレンタルVPSグローバルIPを使ってむにゃむにゃするのが良さそう

VPSはどこがいいのか

これはかなり色々試して嫌になりましたが、私が試してわかる範囲で書きます。
1. さくらVPS
 さくらは試用期間がありその間であればどのように使用しても課金はあり ませんので、比較的使い勝手はいいように思いました。しかし、私の問題とは思いますがポート開放がうまくいかず断念することになります。( ;  ; )
2. CONOHA
 ここは最初から課金しないとサーバーを開設できません。試しに使ってみましたがブラウザ版のSSHが使いづらくあっさりやめちゃいました。
3. AWSlightsail
 言わずもながアマゾンのAWSです。開設がかなり簡単スピーディーで結局ここを採用しました。しかし、最低スペックで作業しているとフリーズしてどうしようもなくなる時があります。他のVPSと違い再インストールは出来ない仕様ですので注意が必要です。
 只、IPを移転する機能があるので新規インスタンスを作成してコピーすればクリーンにすることはできます。(最初は知らずに全消ししてました)

VPSと自宅サーバーを繋ぐ方法

さてここからが本題です。そもそもVPSと自宅サーバーをVPNで繋ぐことが必要になりますが、自分の環境に合う内容を探すのは大変でしたが、ネットを泳ぎ疲れて辿り着いた先にこの記事を見つけました。

正確には様々な記事を見て試しては挫折し、繰り返したのちに辿り着いた素晴らしい記事でした‼️
ここでは私の環境に応じた説明をしていきますので、若干引用記事とは違っております。

WireguardによるVPN環境の構築

私の環境を簡単にご説明すると

  • VPS=awsligtsail(月額7ドル)

  • OS=Ubuntu22.04

  • VPN=Wireguard

  • 自宅PC

  • OS=上と一緒

  • 血と汗と涙(素人ですから)

この環境でVPSと自宅PC間でVPN環境を構築していくことが必須です

awslightsailの設定

まずVPS側の設定をしていきます。
awsの設定はとても簡単です。必要なのは開放するポートを許可することだけです。ネットワーキングタブからルールを追加することだけです。
Wireguardは標準でUDP51820を開放しましょう。
忘れずにゲームで使用するポートも開放してください。


awsコントロールパネルのネットワーキングタブ

Wireguardの導入設定

まずはお決まりのUbuntuアップデートとインストール

sudo apt update -y
sudo apt install wireguard -y

私のWireguardを利用したVPNのセットアップ

https://zenn.dev/nakanishi1337/articles/9c82b26ac6d0c4

ここからは前に紹介した神記事を引用して環境下に合わせて少し編集しています。

・サーバー鍵を生成して保存します。

sudo -i <<EOF
cd /etc/wireguard/
wg genkey | tee server_private_key | wg pubkey > server_public_key
chmod 400 server_private_key server_public_key
exit
EOF

Wireguard key generator とかありますが、設定が自動化されていてすごい便利です‼️ ありがたや!!

・サーバー(VPS)側の設定

sudo tee /etc/wireguard/wg0.conf > /dev/null <<EOF
[Interface]
PrivateKey = $(sudo cat /etc/wireguard/server_private_key)
Address = 10.10.10.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens5 -j MASQUERADE
ListenPort = 51820
EOF

ここで注意ですが、iptablesのところでインターフェイスの設定を自分の環境に合わせてください。 wg0がwireguardでens5がawsのインターフェイスです。

・ポートフォーワーディング設定

sudo tee /etc/sysctl.conf> /dev/null <<EOF
net.ipv4.ip_forward = 1
EOF
sudo sysctl -p

これしないとフォーワードのパケットを受信してくれません。

・クライアントの追加

read -p "Enter client ID (2-254): " client_id
if ! [[ $client_id =~ ^[2-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4]$ ]]; then
    echo "Error: Client ID must be between 2 and 254"
    exit 1
fi

# Check if client configuration file already exists
client_conf="/etc/wireguard/client${client_id}.conf"
if [ -f "$client_conf" ]; then
    echo "Configuration file for client ${client_id} already exists: $client_conf"
    read -p "Do you want to overwrite it? (y/n) " overwrite
    if [[ $overwrite != "y" ]]; then
        echo "Aborting..."
        exit 0
    fi
fi

sudo -i <<EOF
cd /etc/wireguard/
wg genkey | tee client${client_id}_private_key | wg pubkey > client${client_id}_public_key
chmod 400 client${client_id}_private_key client${client_id}_public_key
exit
EOF

sudo tee -a /etc/wireguard/wg0.conf > /dev/null <<EOF
[Peer]
PublicKey = $(sudo cat /etc/wireguard/client${client_id}_public_key)
AllowedIPs = 10.10.10.${client_id}/32
EOF

sudo tee /etc/wireguard/client${client_id}.conf > /dev/null <<EOF
[Interface]
PrivateKey = $(sudo cat /etc/wireguard/client${client_id}_private_key)
Address = 10.10.10.${client_id}/24
DNS = 1.1.1.1

[Peer]
PublicKey = $(sudo cat /etc/wireguard/server_public_key)
EndPoint = $(curl ifconfig.me):51820
AllowedIPs = 10.10.10.0/24
PersistentKeepalive = 25
EOF

このコードを実行すると、10.10.10.2以降のクライアントを追加できます。
実行後に2を入力したらclient2の設定が自動で保存されます。

・保存したクライアント情報を呼び出す。

sudo cat /etc/wireguard/client${client_id}.conf

$の箇所に記入すれば保存されたクライアント情報が呼び出されます。
私の環境下だけかもしれませんが、エンドポイントがIPv6のアドレスになっていましたので、そこはIPv4のアドレスに編集しました。

[Interface]
PrivateKey = ******************************************=
Address = 10.10.10.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = *******************************************=
EndPoint = {VPSのグローバルIP}:51820
AllowedIPs = 10.10.10.0/24
PersistentKeepalive = 25

・VPNサーバーを起動して自動起動の設定をする。

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

クライアントを追加したり、設定を変更した場合はwireguardは再起動してください。

クライアントへのWireguardの導入設定

自宅PCはゲームサーバーにする為色々考えましたが、コスパと電力消費を考慮してGmktecのNcubox M5にしました。
アマゾンプライムデーで39,998円で入手!!

余談になりましたが、Ncuboxはwin11プリインストールですので、ゲームサーバーにするにはLinuxをOSにした方がメモリを浪費せずに済みそうですので、デュアルブートにしました。記事はまた後日書きます。

・VPSと同じようにアプデしてwireguardをインストール

sudo apt update -y
sudo apt install wireguard -y

・サーバーに記録されているクライアント情報を書き込みます。

sudo nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = ******************************************=
Address = 10.10.10.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = *******************************************=
EndPoint = {VPSのグローバルIP}:51820
AllowedIPs = 10.10.10.0/24
PersistentKeepalive = 25

コピペでいいですが、エンドポイントは必ず確認してください。

・pingを飛ばして接続を確認してください。

ping 10.10.10.X(相互のアドレス)

ここで成功しない場合は先へ進めませんので、ダメな場合はchatGPTちゃんにでも聞くと解決できると思います。

VPS〜自宅サーバーへのポートフォーワード設定

さあここからがど素人の私がハマった箇所になりますが、実際に外部のゲームクライアントからVPSのアドレスへアクセスしたときに、パケットを自宅サーバーへ送ってもらう設定になります。
私はiptablesにて設定しました。
今回はsoulmaskのサーバーでしたので、8777のUDPポートとsteamが使用する27015-27100の範囲で設定しています。
ここでもインターフェイスは各々の環境に合わせてください。

# 変数の設定
EXTERNAL_IFACE="ens5"  # VPSの外部インターフェース
WIREGUARD_IFACE="wg0"  # WireGuardのインターフェース
INTERNAL_IP="10.10.10.2"  # 自宅サーバー(WireGuard経由)のIPアドレス

# ポート8777をフォワード(UDP)
sudo iptables -t nat -A PREROUTING -i ens5 -p udp --dport 8777 -j DNAT --to-destination 10.10.10.2:8777

# ポート範囲27015-27100をフォワード(TCP/UDP両方)
sudo iptables -t nat -A PREROUTING -i ens5 -p tcp --dport 27015:27100 -j DNAT --to-destination 10.10.10.2
sudo iptables -t nat -A PREROUTING -i ens5 -p udp --dport 27015:27100 -j DNAT --to-destination 10.10.10.2

# FORWARDチェーンでのトラフィックを許可
sudo iptables -A FORWARD -i ens5 -o wg0 -p udp --dport 8777 -d 10.10.10.2 -j ACCEPT
sudo iptables -A FORWARD -i ens5 -o wg0 -p tcp --dport 27015:27100 -d 10.10.10.2 -j ACCEPT
sudo iptables -A FORWARD -i ens5 -o wg0 -p udp --dport 27015:27100 -d 10.10.10.2 -j ACCEPT

これでVPSに流れてくるトラフィックを自宅ゲームサーバーに送ることができるようになりました。

VPSのファイアウォール設定

aws側でポートの開放は制限されていますが念の為、VPSのファイアウォールは設定しましょう。様々ありますがシンプルに標準のUFWを使用して設定しました。

sudo ufw enable
sudo ufw allow 8777/udp
sudo ufw allow 27015:27100/tcp
sudo ufw allow 27015:27100/udp

設定を確認します。

sudo ufw status

ここまで設定すれば無事に自宅ゲームサーバーが公開されて、外部からのアクセスが可能になります。


長々となりましたがマンションのIPから自宅サーバーを公開するまで苦労しましたので記録を残しました。最後まで読んで頂きありがとうございました。

この記事が気に入ったらサポートをしてみませんか?