💻

GCE+wireGuardを使って自宅のマイクラサーバーを公開した話

に公開

経緯

自宅環境でMinecraftサーバーを構築・ポート解放して友人と遊んでいた。
しかし、自宅回線のポートを開放してサーバーをインターネットに直接晒すのは、セキュリティリスクが大きい。
Cloudflare Tunnelなどのトンネル系サービスも検討したが、参加者全員にクライアント導入が必要で運用が煩雑になる点が課題だった。

そこで、Google Compute Engine(GCE)上に中継サーバーを構築し、WireGuardで自宅サーバーと安全に接続する構成を採用した。
これにより、自宅側のポートを開放することなく、GCE経由でMinecraftサーバーを外部公開できるようになった。

VPSの比較

VPSを選定するにあたっては、ConoHaやさくらのVPSなど国内サービスも含めて検討した。
しかし、今回の用途は「常時稼働ではなく、Minecraftサーバーへの中継目的」であり、コストを最小限に抑えたいという条件があった。

Google Cloud Platform(GCP)のCompute Engine(GCE)では、無料枠で利用できるf1-microインスタンスが用意されており、
トラフィック量が少ない用途であれば十分に実用的だった。

また、従量課金制で使った分だけ支払う形のため、サーバーを停止すればコストをほぼゼロにできる点も魅力的だった。

このように、低コストかつ柔軟に運用できることから、今回の中継サーバーにはGCEを採用した。

用意するもの

  • マイクラ鯖を動かすPC
  • GCEインスタンス
  • GCEインスタンス 静的IP (コロコロ変わってしまうので固定するのをお勧めする)
  • やる気

構築手順

GCEインスタンスと自宅鯖のOSは作成・インストールされているものとする。

1.GCE ネットワーク設定

Google Cloud Consoleにログインし、インスタンスに紐づけられているネットワークインターフェイスの設定画面へ。

「ファイヤウォール」に進み「ファイヤウォール ルールを作成」を押下。

2つのポート(マイクラポートとWireGuardポート)を開ける

名前:任意(例:wireguard-port)
ターゲット:ネットワーク上のすべてのインスタンス
送信元IPv4範囲:0.0.0.0/0
プロトコルとポート:25565/TCP (51820/UDP)

2.UFWでフォワード設定(作業場所:GCE)

外部からゲームの通信、MinecraftJava版の25565/tcpの接続を受け付けると、これをLinuxのファイアウォール機能であるufwの設定を利用し、自宅鯖へ転送する。
SSHのポートも開けとかないと有効にした際に繋がらなく恐れがあるので、そのポートも開けておく。

ufwにてポート開放

以下のコマンドで通信を通過させる。

sudo ufw allow 25565/tcp
sudo ufw allow 51820/udp
sudo ufw allow 22

以下のコマンドでufwを有効にする。

sudo ufw enable

フォワード設定

  1. /etc/default/ufw を編集して DEFAULT_FORWARD_POLICY“ACCEPT" にする。
sudo nano /etc/default/ufw

DEFAULT_FORWARD_POLICY=“ACCEPT"

(私はnano派です)

  1. /etc/ufw/sysctl.conf を編集して net/ipv4/ip_forward1 にして#を削除する。
sudo nano /etc/ufw/sysctl.conf

net/ipv4/ip_forward=1

  1. /etc/ufw/before.rules を編集する。
    DestinationNATを利用し、25565/tcp の通信の宛先として自宅鯖のプライベートIPアドレスを指定する。
sudo nano /etc/ufw/before.rules

# NAT
*nat
-F
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# minecraft
-A PREROUTING -i ens3 -p tcp --dport 25565 -j DNAT --to-destination 192.168.0.2:25565
-A POSTROUTING -o wg0 -j MASQUERADE

COMMIT
  • ens3: ip addr などで確認できるネットワークインタフェース名
  • 25565:Minecraft Java の ポート番号
  • 192.168.0.2:25565;自宅鯖のプライベートIPアドレス

最後に sudo ufw reload をして設定を適用させておく。

3.WireGuardでGCEと自宅鯖を繋ぐ

GCE側をサーバー側とする。
こうすることで自宅鯖側はポート開放を一切せずにVPNを張ることができる。

WireGuardの導入

以下のコマンでWireGuardを GCE自宅鯖 にインストールする。

sudo apt update && sudo apt upgrade -y
sudo apt install wireguard

本来であれば自身で設定ファイルの作成と、鍵の作成を行うべきだが、今回はWireGuardの設定ファイル生成ツールを使って生成する。
気が向いたら鍵の作成手順も軽く紹介しようと思う。

設定ファイルの作成

Wireguard Config Generator

  • Listen Port:51820(変更なし)
  • Number of Clients:1
  • CIDR(VPNのネットワーク範囲):10.0.0.0/24(変更なし)
  • Client Allowed IPs:10.0.0.2/32, 10.0.0.1/32
  • Endpoint (Optional):GCPのIPアドレス:51820
  • Post-Up rule:eth0→ens3 (ネットワークインタフェース名に変更)
  • Post-Down rule:eth0→ens3 (ネットワークインタフェース名に変更)

生成されたものを、Server→GCE / Client1→自宅鯖、に /etc/wireguard/wg0.conf として保存する。
クライアント側には、接続を維持するためにKeepaliveの設定を入れる。
(※各種値は例です。)

・GCE側

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = eCasVdwi4inurxJH4+obDFM9bLO4mSM4/eoFnA1RWU8=
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE

[Peer]
PublicKey = twmtNLp2e7aU3A451LlVmlZHUfqSvxS5fIZF4YbvHCE=
AllowedIPs = 10.0.0.2/32

・自宅鯖側

[Interface]
Address = 10.0.0.2/24
ListenPort = 51820
PrivateKey = IE00Acb5oCL7ZCH/ccB6qafkhhNppgDl5to36yvrsHA=

[Peer]
PublicKey = Vutp//zKbSi+lyK6QC2LxuemzsIwJOtzpYPlKBp2RFo=
AllowedIPs = 10.0.0.2/32, 10.0.0.1/32
Endpoint = 111.111.111.111:51820
PersistentKeepalive = 25

WireGuardの起動

GCEと自宅鯖にて、下記のコマンドを実施。

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

sudo wg show にて

  endpoint: 111.111.111.111:51820
  allowed ips: 10.0.0.2/32, 10.0.0.1/32
  latest handshake: 9 seconds ago
  transfer: 3.70 MiB received, 49.17 MiB sent
  persistent keepalive: every 25 seconds

のような表記が出ていればOK

最後に

簡単にVPNを張れて、かつポート開放せずにマイクラサーバーを公開出来たのはよい経験となった。

参考記事

https://internet.watch.impress.co.jp/docs/column/shimizu/1492072.html

https://note.com/dpsk/n/nf137a3d403bc

Discussion