
自宅サーバー構築記録②──WireGuard VPN構築
v6プラス・二重NAT環境でWireGuard VPNを構築した手順の記録です。ポート変更・DDNS設定・2段階ポート転送まで解説します。
はじめに
「外出先からも自宅のサーバーにアクセスしたい」──そのためにWireGuard VPNを構築しました。
ところが、ドコモ光(v6プラス)環境ではポート80・443・51820が使えないという制約があります。さらに自分の環境はCTU(NTT機器)とIPoEルーターによる二重NATです。この2つの障壁を越えるまでが最大の難所でした。
この記事では、v6プラス・二重NAT環境でのWireGuard VPN構築手順を、DDNS設定も含めて解説します。
前提: Ubuntuサーバー(固定LAN IP: 192.168.10.138)が稼働していること。
全体の仕組み
外出先デバイス
│ UDP 13472(WireGuard)
▼
your-domain.com(DDNSで自動更新)
│
CTU RT-500MI(192.168.1.1) ← ポート転送①
│
IPoEルーター(192.168.10.1) ← ポート転送②
│
Ubuntu(192.168.10.138)
│ WireGuardトンネル
▼
VPN仮想ネットワーク(10.0.0.0/24)
ポイントは2点です。
ポートをWireGuardデフォルト(51820)から13472に変更 ── v6プラスで使えないポートを回避
DDNS ── 変動するグローバルIPをドメインに自動反映
ステップ1:ドメイン取得とCloudflare設定
1-1. ドメイン取得
お名前.comやムームードメインなどでドメインを取得します(例: your-domain.com)。
1-2. CloudflareにDNS管理を移管
Cloudflareアカウントを作成
ドメインをCloudflareに追加
ドメインのネームサーバーをCloudflare指定のものに変更(レジストラ側の設定)
1-3. AレコードとAPIトークンを作成
Cloudflare Dashboard → DNS → レコードを追加:
タイプ: A
名前: your-domain.com
IPv4アドレス: 現在のグローバルIP(後でDDNSが自動更新)
プロキシ: オフ(DNSのみ)
重要: WireGuardはUDP通信のため、Cloudflareのプロキシ(オレンジ雲)を必ずオフにしてください。オンにするとWireGuardが接続できません。
次にAPIトークンを作成します。
Cloudflare Dashboard → My Profile → API Tokens → Create Token → 「Edit zone DNS」テンプレートを使用:
Zone: your-domain.com(特定ドメインのみに限定)
権限: Zone / DNS / Edit
注意: トークンは作成後に一度しか表示されません。必ずメモしてから閉じてください。
ステップ2:DDNS(ddclient)の設定
グローバルIPが変わるたびにCloudflareのAレコードを自動更新します。
インストール
sudo apt update && sudo apt install -y ddclient
設定ファイル
/etc/ddclient.conf を編集:
protocol=cloudflare
use=web
web=https://checkip.amazonaws.com
ssl=yes
zone=your-domain.com
login=token
password=YOUR_CLOUDFLARE_API_TOKEN
your-domain.com
起動・確認
sudo systemctl enable --now ddclient
# 手動実行して確認
sudo ddclient -daemon=0 -debug -verbose -noquiet
正常に動作すると SUCCESS と表示され、CloudflareのAレコードが現在のIPに更新されます。以後5分おきに自動更新されます。
ステップ3:WireGuardサーバー設定
インストール
Ubuntu 24.04ではカーネルに内蔵されているため、ツールだけインストールします。
sudo apt install -y wireguard
鍵ペアの生成
cd /etc/wireguard
sudo wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key
sudo chmod 600 server_private.key
サーバー設定ファイルの作成
/etc/wireguard/wg0.conf:
[Interface]
Address = 10.0.0.1/24
ListenPort = 13472
PrivateKey = <server_private.keyの内容>
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp2s0 -j MASQUERADE
[Peer]
# デバイス名(コメント)
PublicKey = <クライアントの公開鍵>
AllowedIPs = 10.0.0.2/32
enp2s0 はサーバーのネットワークインターフェース名です。ip a コマンドで確認してください(eth0 など環境によって異なります)。
IPフォワーディングの有効化
フルトンネル(全トラフィックをVPN経由)を使う場合に必要です。
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf
起動・自動起動設定
sudo systemctl enable --now wg-quick@wg0
# 接続状態の確認
sudo wg show
ステップ4:ポート転送設定(二重NAT環境)
v6プラス + 二重NAT環境では、2箇所でポート転送を設定します。
転送①:CTU(192.168.1.1)
NTTのCTU管理画面(通常 http://192.168.1.1 でアクセス):
機能: 静的IPマスカレード
プロトコル: UDP
ポート: 13472
宛先IP: 192.168.1.2(IPoEルーターのWAN側IP)
宛先ポート: 13472
CTUの管理画面の場所はNTTの機種によって異なります。RT-500MIの場合は「詳細設定」→「静的IPマスカレード設定」にあります。
転送②:IPoEルーター(192.168.10.1)
IPoEルーターの管理画面:
機能: ポートマッピング
プロトコル: UDP
外部ポート: 13472
宛先IP: 192.168.10.138(Ubuntuサーバー)
宛先ポート: 13472
動作確認
外出先(または携帯のモバイル回線)から接続テスト:
# クライアントを接続してから
ping 10.0.0.1
注意: 自宅Wi-Fi(同一LAN)からはNATヘアピン制限により接続できません。必ず外出先・モバイル回線からテストしてください。
ステップ5:クライアント設定
事前準備(各デバイス)
各デバイスのWireGuardアプリで鍵ペアを生成し、公開鍵をサーバーの wg0.conf に追記してください。
# Ubuntuサーバー側で新しいPeerを追加(設定ファイルも更新)
sudo wg set wg0 peer <新デバイスの公開鍵> allowed-ips 10.0.0.X/32
sudo wg-quick save wg0
VPN IPは 10.0.0.2 から順番に割り当てます(被らなければ番号は任意)。
フルトンネル設定(全トラフィックをVPN経由)
外出先で自宅のIPアドレスとして使いたい場合、公共Wi-Fiの通信を保護したい場合に使います。
[Interface]
PrivateKey = <このデバイスの秘密鍵>
Address = 10.0.0.X/32
DNS = 1.1.1.1
[Peer]
PublicKey = <サーバーの公開鍵>
Endpoint = your-domain.com:13472
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
スプリットトンネル設定(自宅ネットワークのみVPN経由)
YouTube等の一般的なネット通信は通常回線、自宅サーバーへのアクセスだけVPN経由にする場合。帯域・遅延を節約できます。
[Interface]
PrivateKey = <このデバイスの秘密鍵>
Address = 10.0.0.X/32
[Peer]
PublicKey = <サーバーの公開鍵>
Endpoint = your-domain.com:13472
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25
なぜ 192.168.10.0/24 を含めないか: 外出先のLANが同じサブネットを使っていた場合にルーティング競合が起きるためです。自宅サーバー(Ubuntu)には 10.0.0.1、Windows等の他のLAN機器には ssh -J user@10.0.0.1 user@192.168.10.125 のようにジャンプホスト経由でアクセスできます。
接続手順
Windows: WireGuardアプリ → トンネルをインポート → 「有効化」
Android / iOS:
WireGuardアプリをインストール
「+」→「ファイルまたはアーカイブから作成」または「QRコードをスキャン」
トグルをオンにして接続
ステップ6:UFWファイアウォール設定
# WireGuardポートを許可
sudo ufw allow 13472/udp
# SSHのレート制限(ブルートフォース対策)
sudo ufw limit ssh
# UFW有効化
sudo ufw enable
sudo ufw status
トラブルシューティング
Endpointに接続できない: ポート転送が2段階とも設定されているか確認。自宅Wi-Fiからのテストは失敗するので注意
wg show でハンドシェイクが更新されない: ファイアウォール(UFW)でポート13472/UDPが開放されているか確認
フルトンネルで接続後にインターネットにつながらない: net.ipv4.ip_forward = 1 が有効か確認。sudo sysctl net.ipv4.ip_forward で確認
DDNSがIPを更新しない: sudo ddclient -daemon=0 -debug でエラーを確認。APIトークンのスコープが正しいか確認
まとめ
v6プラス環境でWireGuardを動かすポイントをまとめます。
ポートは51820を避ける ── 13472など別のポートを使う
Cloudflareのプロキシはオフ ── UDPが通らなくなる
ポート転送は2段階 ── CTUとIPoEルーターの両方で設定
テストは外出先・モバイル回線から ── 同一LAN内からは接続できない
次の記事③では、OpenCloudをDockerで構築し、Cloudflare Tunnelで外部公開するまでの手順を解説します。