Docker × WireGuard で“自宅サーバー”を公開する
Published on 2025/09/04Tags
Docker × WireGuard で“自宅サーバー”を公開する
― 例:Minecraft Bedrock(UDP/19132)を VPN 経由でプレイ
対象: 「自宅ネットワーク(NAT 配下)にあるゲームサーバーを、VPS のグローバル IP 経由で公開したい」人。
完成像: VPS 上の **WireGuard サーバー(docker-wireguard)**を“公開窓口”にし、そこへ届いた Minecraft Bedrock の UDP/19132 を WireGuard トンネルで自宅の Bedrock サーバーへ DNAT/SNAT 中継。クライアントはmc.example.com:19132
に接続するだけで OK。
0. この記事のポイント
- 自宅はポート開放不要。VPS が入口となり、VPN 内部で転送します。
- LinuxServer.io の docker-wireguard を使い、テンプレート運用で PostUp/Down(iptables)を自動適用します。
- 自宅のゲームコンテナは
network_mode: "service:vpn"
を使って “VPN 経由のみ” の通信に固定します。
1. 全体像(構成図)
インターネット
│ (VPSのグローバルIP / 例: mc.example.com)
┌──▼───────────────┐
│ VPS │ ← WireGuard “サーバ” (Docker)
│ Ubuntu + Docker │ UDP/51820 (WG) / UDP/19132 (Bedrock公開口)
└──▲───────────────┘
│ (WireGuard トンネル: 例 10.13.20.0/24)
┌──────────────────┐
│ Home Server │ ← WireGuard “クライアント” (Docker)
│ Docker + Bedrock │ Bedrock は VPN ネット名前空間で待受
└──────────────────┘
- DNAT: VPS に来た 19132/udp を WG 内部アドレス(自宅)へ転送
- SNAT: 返信パケットの送信元を VPS 側 WG IP にして、必ずトンネルに戻す
2. 前提と準備
- VPS 側: Ubuntu 22.04/24.04 + Docker / Docker Compose v2
- 自宅側: Linux + Docker / Docker Compose v2(物理/VM どちらでも)
- DNS(任意):
mc.example.com
を VPS のグローバル IP に向けておくと便利 - 開放ポート(VPS): UDP/51820(WireGuard)、UDP/19132(Bedrock 公開口)
- 本記事の IP 設計:
- WG サブネット:
10.13.20.0/24
- VPS (WG サーバ):
10.13.20.1
- 自宅 (WG クライアント):
10.13.20.2
- WG サブネット:
以降、コマンドは
$
を省略。必要に応じてsudo
を付けて実行してください。
3. VPS 側のセットアップ(WireGuard サーバ)
3.1 ディレクトリと Compose
mkdir -p ~/wg-bedrock/config
cd ~/wg-bedrock
docker-compose.yml
services:
wireguard:
image: lscr.io/linuxserver/wireguard:latest
container_name: wg-bedrock
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Tokyo
- SERVERURL=mc.example.com # あなたの VPS の FQDN または IP アドレス
- SERVERPORT=51820 # WireGuard サーバーが待ち受ける UDP ポート
- PEERS=bedrock # クライアント用のピア設定を生成する (名前は任意)
- PEERDNS=1.1.1.1 # VPN 接続時にクライアントが使う DNS サーバ (例: Cloudflare)
- INTERNAL_SUBNET=10.13.20.0 # WG サブネット (/24は後述テンプレ側で付与)
- ALLOWEDIPS=0.0.0.0/0 # クライアントからの全トラフィックを VPN 経由にする
volumes:
- ./config:/config
- /lib/modules:/lib/modules:ro # ホストのカーネルモジュールをマウント
ports:
- 51820:51820/udp # WireGuard
- 19132:19132/udp # Bedrock 公開口 (VPS が受ける)
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1 # 重要: IP 転送を有効化
restart: unless-stopped
起動(初期生成):
docker compose up -d
docker logs -n 100 wg-bedrock
初回起動で
/config/peer_bedrock/peer_bedrock.conf
などの ピア設定が生成されます。これを後で自宅側に配布します。
3.2 テンプレートで NAT ルールを自動化
/config/templates/server.conf
を使うと、/config/wg_confs/wg0.conf
の再生成時にも自動で反映されます。
nano ./config/templates/server.conf
./config/templates/server.conf
[Interface]
Address = ${INTERFACE}.1
ListenPort = 51820
PrivateKey = $(cat /config/server/privatekey-server)
# 転送許可 + 外向きMasquerade(eth+ は外向きIF。eth0等でもOK)
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
# Bedrock UDP/19132 → 自宅WG(10.13.20.2) へ中継(DNAT)
PostUp = iptables -t nat -A PREROUTING -i eth+ -p udp --dport 19132 -j DNAT --to-destination 10.13.20.2
# 返信を必ずトンネルへ返す(SNAT)
PostUp = iptables -t nat -A POSTROUTING -o %i -p udp -d 10.13.20.2 --dport 19132 -j SNAT --to-source 10.13.20.1
# --- ここから PostDown(停止時にルールを削除する) ---
# 上記 PostUp で追加したルールを「逆順」で削除する
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -t nat -D PREROUTING -i eth+ -p udp --dport 19132 -j DNAT --to-destination 10.13.20.2
PostDown = iptables -t nat -D POSTROUTING -o %i -p udp -d 10.13.20.2 --dport 19132 -j SNAT --to-source 10.13.20.1
テンプレ反映 (再生成)
rm -f ./config/wg_confs/wg0.conf
docker compose restart
3.3 動作確認 (VPS)
# ハンドシェイク (後で自宅側が接続したら時刻が出る)
docker exec -it wg-bedrock wg show
# NATルール(19132のDNAT/SNATが入っているか)
docker exec -it wg-bedrock bash -lc 'iptables -t nat -S | grep 19132 || true'
VPS ファイアウォールで udp/51820
と udp/19132
を許可するのを忘れずに。
4. 自宅側のセットアップ(WireGuard クライアント + Bedrock サーバ)
4.1 ディレクトリと Compose
mkdir -p ~/bedrock-vpn/config ~/bedrock-vpn/data
cd ~/bedrock-vpn
VPS で生成されたピア設定(例 peer_bedrock.conf
)をダウンロードし、./config/wg_confs/bedrock.conf
として保存。
次の点を 確認/必要なら追記 してください:
[Interface]
Address = 10.13.20.2/24
PrivateKey = <client_private>
DNS = 1.1.1.1
MTU = 1380 # ← 握手が不安定なら付けると安定しやすい
[Peer]
PublicKey = <server_public>
Endpoint = mc.example.com:51820
AllowedIPs = 0.0.0.0/0 # ← "すべてVPN経由"にする(後述のnetns共有とセット)
PersistentKeepalive = 25 # ← NAT配下では必須
docker-compose.yml(自宅)
version: "3.9"
services:
vpn:
image: lscr.io/linuxserver/wireguard:latest
container_name: wg-client
cap_add: [NET_ADMIN, SYS_MODULE]
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Tokyo
volumes:
- ./config:/config
- /lib/modules:/lib/modules:ro
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
bedrock:
image: itzg/minecraft-bedrock-server:latest
container_name: bedrock
environment:
EULA: "TRUE"
SERVER_NAME: "My VPN Bedrock"
GAMEMODE: "survival"
DIFFICULTY: "normal"
volumes:
- ./data:/data
# 重要:Bedrock の通信を"必ず"VPN経由に
network_mode: "service:vpn"
depends_on:
- vpn
restart: unless-stopped
起動:
docker compose up -d
4.2 動作確認(自宅)
# WireGuard の状態
docker exec -it wg-client wg show
# Bedrock の待受(vpn 名前空間内で確認)
docker exec -it wg-client bash -lc 'ss -lunp | grep 19132 || true'
5. 接続テストとトラブルシュート
5.1 クライアント接続
- Minecraft Bedrock で サーバーを追加: アドレス
mc.example.com
、ポート19132
- 入れない場合は以下を順に確認:
5.2 よくあるハマりどころ
-
ハンドシェイクしない
- VPS 側で
udp/51820
が未開放 / SG 未許可 - 自宅側に
PersistentKeepalive=25
がない - DNS 解決不可 → 一度
Endpoint = <VPSのIP>:51820
で検証 - MTU 問題 → 両側
[Interface] MTU = 1380
- VPS 側で
-
「サーバー情報が取得できませんでした」
- VPS 側の DNAT/SNAT がテンプレに入っていない / 有効になっていない
→iptables -t nat -S | grep 19132
で確認 - 自宅の Bedrock が VPN 名前空間で待受していない
→network_mode: "service:vpn"
を確認 - VPS 側で
udp/19132
が閉じている
- VPS 側の DNAT/SNAT がテンプレに入っていない / 有効になっていない
-
外向きインターフェース名が不明
ip -4 route get 1.1.1.1
→dev eth0
等をテンプレのeth+
と置換
-
切れる/不安定
- VPS に スワップ(1〜5GB) や zram を導入して OOM を回避
- Docker ログのローテ(
max-size
/max-file
)でログ膨張を抑制
5.3 観測に便利なコマンド
# どこまで届いているかを観測(VPS側)
docker exec -it wg-bedrock tcpdump -ni any udp port 19132
# NATルールの確認
docker exec -it wg-bedrock bash -lc 'iptables -t nat -S | grep -E "DNAT|SNAT|19132"'
# ルーティング等の確認(自宅側)
docker exec -it wg-client ip addr
docker exec -it wg-client wg show
6. 複数ゲームに拡張するには
- 同じコンテナのままテンプレにポートを追加(例:Enshrouded UDP/15636-15637 を DNAT/SNAT で追記)。
- あるいは 複数の WireGuard インターフェース(wg0, wg1, …) を 1 つのコンテナで管理し、IF ごとにポートを分ける(上級者向け)。
- 影響分離を重視して コンテナを分けたい場合は、UDP ポートとサブネットをゲームごとに変えて運用。
7. セキュリティと運用の注意
- VPS 側の公開ポートは 必要最小限(WG と使うゲームのポートのみ)
- 鍵(PrivateKey)は 漏らさない/公開しない
- 使わなくなったピアは 設定から削除し、
wg syncconf
(または再起動)で反映 - バックアップ:
/config
と自宅側の/data
(ゲームセーブ)は定期的に退避
8. まとめ
- VPS を公開窓口に、WireGuard トンネル + DNAT/SNAT で自宅サーバーを公開できる
- Bedrock は UDP/19132 を中継するだけ。自宅はポート開放不要
- テンプレート運用にしておけば、再生成しても NAT 設定が自動で入り、保守がラク