profile picture

Docker × WireGuard で“自宅サーバー”を公開する

Published on 2025/09/04
Tags vpn wireguard

Docker × WireGuard で“自宅サーバー”を公開する

― 例:Minecraft Bedrock(UDP/19132)を VPN 経由でプレイ

対象: 「自宅ネットワーク(NAT 配下)にあるゲームサーバーを、VPS のグローバル IP 経由で公開したい」人。
完成像: VPS 上の **WireGuard サーバー(docker-wireguard)**を“公開窓口”にし、そこへ届いた Minecraft Bedrock の UDP/19132WireGuard トンネルで自宅の Bedrock サーバーへ DNAT/SNAT 中継。クライアントは mc.example.com:19132 に接続するだけで OK。


0. この記事のポイント


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 ネット名前空間で待受
└──────────────────┘

2. 前提と準備

以降、コマンドは $ を省略。必要に応じて 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/51820udp/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 クライアント接続

5.2 よくあるハマりどころ

  1. ハンドシェイクしない

    • VPS 側で udp/51820 が未開放 / SG 未許可
    • 自宅側に PersistentKeepalive=25 がない
    • DNS 解決不可 → 一度 Endpoint = <VPSのIP>:51820 で検証
    • MTU 問題 → 両側 [Interface] MTU = 1380
  2. 「サーバー情報が取得できませんでした」

    • VPS 側の DNAT/SNAT がテンプレに入っていない / 有効になっていない
      iptables -t nat -S | grep 19132 で確認
    • 自宅の Bedrock が VPN 名前空間で待受していない
      network_mode: "service:vpn" を確認
    • VPS 側で udp/19132 が閉じている
  3. 外向きインターフェース名が不明

    • ip -4 route get 1.1.1.1dev eth0 等をテンプレの eth+ と置換
  4. 切れる/不安定

    • 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. 複数ゲームに拡張するには


7. セキュリティと運用の注意


8. まとめ