WireGuard VPN 構成 — maguro 終端

// WIREGUARD — R640 → maguro 移植完了 (2026-05-14) / 最終更新: 2026-05-14

稼働中 WireGuard 3 インターフェース全部 maguro で終端 / 旧 R640 wg0/wg1/wg2 は退避済

大改定 (2026-05-13〜14)

2026-05-14 に WireGuard 一式を R640 から maguro へ移植。 同時に IF 名を意味のある名前にリネーム。 RTX1300 NAT 先も切替済。

旧 (R640)新 (maguro)ネットport用途
wg0wg-clients10.200.0.0/16UDP 54024顧客 VPN (本番)
wg1wg-customers—UDP 61001業務カスタマー
wg2wg-storage—UDP 62001ストレージ用バックホール
移植完了状態: maguro VLAN70 (192.168.70.30) で 3 IF とも稼働。 RTX1300 NAT も切替済。 旧 R640 設定は /etc/wireguard-r640-snapshot/ に退避 (緊急復活用)。
WireGuard インターフェース一覧 (現役)
IF用途アドレスポート状態自動起動
wg-clients顧客・管理用 (本番)10.200.0.1/1654024/UDP稼働中enabled
wg-customers業務カスタマー(別セグメント)61001/UDP稼働中enabled
wg-storageストレージバックホール(別セグメント)62001/UDP稼働中enabled
物理経路 (Internet → maguro)
Internet (顧客) │ UDP 54024 to 公開IP ▼ ┌───────────────────────────────┐ │ RTX1300 NAT 20000/10 │ │ 外部 UDP 54024 │ │ → 192.168.70.30:54024 │ └───────────────┬───────────────┘ │ │ VLAN70 (WG-PUBLIC) ▼ ┌───────────────────────────────┐ │ Cisco 12XS Po70 (LACP 20G) │ │ Te2/0/12 + Te2/1/1 │ └───────────────┬───────────────┘ │ ▼ ┌───────────────────────────────┐ │ maguro SM-WG bond │ │ 192.168.70.30/24 │ │ Intel X550-T2 (10G ×2) │ └───────────────┬───────────────┘ │ ▼ wg-clients (UDP 54024) wg-customers (UDP 61001) wg-storage (UDP 62001)
RTX1300 NAT (現役)
NAT IDプロトコル外部ポート転送先用途
20000/10UDP54024192.168.70.30:54024maguro wg-clients
20000/13UDP61001192.168.70.30:61001maguro wg-customers
20000/14UDP62001192.168.30.30:62001maguro wg-storage
wg-clients 設定 (maguro 側)

設定ファイル: /etc/wireguard/wg-clients.conf

[Interface]
Address = 10.200.0.1/16
ListenPort = 54024
PrivateKey = (秘密鍵)
PostUp   = iptables -t nat -A POSTROUTING -s 10.200.0.0/16 -o <DATA-IF> -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.200.0.0/16 -o <DATA-IF> -j MASQUERADE

[Peer]
# iPhone / みーきゅん
PublicKey = 5PkDz5OQZz3hzN7Etf1epA/VQ7NRuFjFasfqHLfVJFE=
AllowedIPs = 10.200.0.2/32
注: 旧 R640 wg0 の公開鍵 xiFFB/KANQY81ihp4/gnOj0IEBe5JTDoWdlKWsccrHc= は退避 (/etc/wireguard-r640-snapshot/wg0/)。 maguro 側で新規鍵を発行している。 既存クライアントは新公開鍵への切替が必要だった (cutover 時に断続なく実施済)。
クライアント (iPhone) WireGuard プロファイル例
[Interface]
PrivateKey = (クライアント秘密鍵)
Address = 10.200.0.x/32
DNS = 10.200.0.1

[Peer]
PublicKey = (maguro wg-clients 公開鍵)
Endpoint = vpn.k2-o.net:54024
AllowedIPs = 10.200.0.0/16
PersistentKeepalive = 25
設計ポイント (2026-04-06 split tunnel 変更): AllowedIPs = 10.200.0.0/16 により VPN内部宛のみトンネル経由 (split tunnel)。 全通信を VPN に流す旧設定 (0.0.0.0/0) は 5G最適化が効かず iPhone 発熱・電池消耗が激しかったため変更。 DNS 設定 (10.200.0.1) により maguro 内部 dnsmasq が cloud.k2-o.net → 192.168.20.20 (maguro 内部) で解決し、 R640 SNI を迂回して直接 maguro Nextcloud に到達できる。
新規クライアント追加手順
# 1. 鍵ペア生成 (maguro 上)
wg genkey | tee /tmp/client.key | wg pubkey > /tmp/client.pub
cat /tmp/client.key   # PrivateKey (クライアント用)
cat /tmp/client.pub   # PublicKey (maguro に登録)

# 2. wg-clients に追加 (次の空き IP を割当: 10.200.0.x/32)
sudo wg set wg-clients peer <PublicKey> allowed-ips 10.200.0.x/32

# 3. wg-clients.conf にも追記
sudo tee -a /etc/wireguard/wg-clients.conf << EOF

[Peer]
# 端末名
PublicKey = <PublicKey>
AllowedIPs = 10.200.0.x/32
EOF

# 4. QR コード生成 (qrencode)
qrencode -t ansiutf8 << EOF
[Interface]
PrivateKey = <PrivateKey>
Address = 10.200.0.x/32
DNS = 10.200.0.1

[Peer]
PublicKey = <maguro wg-clients 公開鍵>
Endpoint = vpn.k2-o.net:54024
AllowedIPs = 10.200.0.0/16
PersistentKeepalive = 25
EOF

# 5. mikyun-portal の customer_devices テーブルに wg_ip を記録
IP 採番ルール (現行)
項目内容
本番セグメント10.200.0.0/16 (wg-clients)
予約 IP10.200.0.1 (maguro / GW)
割当範囲10.200.0.2 〜 10.200.255.254 (最大 65533 台)
採番方式customer_devices の使用中 IP を全件取得し、 空き最小番号を割当
重複防止空きスキャン + DB の wg_ip UNIQUE 制約で二重防御
旧契約の互換: 旧 10.251.0.0/24 (wg1) セグメントは廃止。 旧契約 (A001 / A002 / M010) は cutover 時に 10.200.0.x へ再採番済。
起動・管理コマンド (maguro)
# 起動
sudo systemctl start wg-quick@wg-clients
sudo systemctl start wg-quick@wg-customers
sudo systemctl start wg-quick@wg-storage

# 自動起動
sudo systemctl enable wg-quick@wg-clients wg-quick@wg-customers wg-quick@wg-storage

# 状態確認
sudo wg show
sudo wg show wg-clients

# ピア追加 (動的)
sudo wg set wg-clients peer <PublicKey> allowed-ips 10.200.0.x/32

# 設定リロード (再起動なし)
sudo wg syncconf wg-clients <(wg-quick strip wg-clients)
セキュリティ (WG 越しに何を見せる?)
FQDNWG 越し外部経路
cloud.k2-o.net✓ (DNS で内部IP解決)✓ (SNI passthrough)
office.k2-o.net✓✗ (WG 必須)
admin.wan-secure.net✓ (運営Portal)✗
office.wan-secure.net✓✗
maguro SSH (192.168.10.31)✓ (運営のみ)✗
緊急時の WG 復活 (R640)

万一 maguro が長期障害になった場合、 R640 に WG を戻すことが可能 (snapshot を保管しているため)。

# R640 で実施
sudo cp -r /etc/wireguard-r640-snapshot/wg0 /etc/wireguard/
sudo systemctl enable --now wg-quick@wg0

# ただし maguro 側でも並行運用中のため、 ピア鍵衝突に注意
# RTX1300 NAT も R640 (192.168.20.21) に戻す必要あり
注意: 同じピア鍵を 2 ホストで同時 active にすると、 クライアントは「最後に応答した方」にスティック。 ハンドシェイク不整合で接続が不安定になる。 復活時は 必ず maguro 側を停止 してから R640 を起動。
移植時のメモ (試行錯誤)
  • VLAN70 新設: 既存 VLAN10/20/30/50 にどれにも WG を載せたくなかった (公開 UDP を MGMT/STG 等に混ぜたくない)。 新設の VLAN70 + Po70 (20G LACP) で完全分離。
  • maguro X550-T2 増設: CPU2 SLOT1 PCI-E 3.0 x8 に Intel X550-T2 (RJ45 10G ×2) を搭載。 帯域確保のためスロット選定にこだわった。
  • RTX1300 NAT 切替タイミング: R640 停止 → maguro WG 起動 → RTX NAT 先変更を 同一作業窓 で実施。 切替中の数十秒は WG 切れたが、 PersistentKeepalive=25 で自動復活。
  • IF 名のリネーム: 旧 wg0/wg1/wg2 では役割が分かりにくかった。 wg-clients / wg-customers / wg-storage に変更して可読性向上。 systemd unit 名・PostUp/Down スクリプトも追従。
  • R640 退避: 削除でなく /etc/wireguard-r640-snapshot/ 退避。 万一の復活も可能な状態を維持。
2026-05-14 達成: WireGuard 完全 maguro 化 + VLAN70 ingress 専用化 + 20G LACP 帯域。 顧客接続のスループットと冗長性が向上し、 R640 は DMZ 機能だけに専念できる構造に。