WireGuardによる2つのProxmox VEクラスター間のSite-to-Site VPN接続:高速・軽量・高安定

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

背景:深夜2時、Site-to-Siteバックアップシステムが「ストライキ」を起こした時

深夜2時、私のスマートフォンが激しく震えました。監視システムからの不吉な通知:拠点(サイトB)のProxmoxクラスターが、メインサーバー(サイトA)へのバックアップ転送に失敗しているとのこと。急いで確認したところ、以前から使用していたOpenVPNがフリーズしていました。レイテンシは1,500msを超え、すべての接続がタイムアウトを繰り返していました。

その時、複雑な設定が必要で肥大化したVPNシステムを維持することの限界を感じました.もっと軽量で、高速、そして真に安定したものが必要でした。それが、インフラ全体をWireGuardに移行した理由です。

12台の仮想マシン(VM)を稼働させているラボ環境でテストしたところ、驚くべき結果が出ました。転送速度は45Mbps(OpenVPN)から回線上限の300Mbpsまで向上。一方で、CPU使用率は15%からわずか2%未満にまで低下しました。以下に、2つのProxmox内部ネットワークを完全に疎通させるための設定方法をまとめます。

ステップ1:準備とインストール

構成をイメージしやすいよう、実際のデプロイシナリオに基づいたパラメータを使用します:

  • サイトA(本社): WAN IP: 1.2.3.4 | 内部ネットワーク: 192.168.10.0/24 | WireGuard IP: 10.0.0.1
  • サイトB(支店): WAN IP: 5.6.7.8 | 内部ネットワーク: 192.168.20.0/24 | WireGuard IP: 10.0.0.2

ProxmoxはDebianベースで動作しているため、インストールは非常に簡単です。両方のノードで以下のコマンドを実行してください:

apt update && apt install wireguard -y

次に、IPフォワーディング機能を有効にします。このステップにより、Proxmoxがルーターとして機能し、VPNインターフェースと内部ネットワーク間でパケットを転送できるようになります。これが設定されていないと、内部の仮想マシン(VM)同士が通信できません。

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

ステップ2:キーペアの生成

WireGuardはセキュリティのために公開鍵方式を使用します。各ノードで独自のキーセットを作成し、安全に保管してください。秘密鍵(Private Key)は絶対に外部に漏らさないようにしてください。

mkdir -p /etc/wireguard && cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

コマンド実行後、各サイトに privatekeypublickey ファイルが作成されます。

ステップ3:Site-to-Siteの実際の設定

サイトA(メインサーバー)の設定

以下の内容で /etc/wireguard/wg0.conf ファイルを作成します:

[Interface]
PrivateKey = <Private_Key_Site_A>
Address = 10.0.0.1/24
ListenPort = 51820

# サイトBの仮想マシンがサイトAの仮想マシンを認識できるようにするためのルーティング
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o vmbr0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o vmbr0 -j MASQUERADE

[Peer]
PublicKey = <Public_Key_Site_B>
AllowedIPs = 10.0.0.2/32, 192.168.20.0/24
Endpoint = 5.6.7.8:51820
PersistentKeepalive = 25

サイトB(支店)の設定

サイトBも同様に設定します:

[Interface]
PrivateKey = <Private_Key_Site_B>
Address = 10.0.0.2/24
ListenPort = 51820

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o vmbr0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o vmbr0 -j MASQUERADE

[Peer]
PublicKey = <Public_Key_Site_A>
AllowedIPs = 10.0.0.1/32, 192.168.10.0/24
Endpoint = 1.2.3.4:51820
PersistentKeepalive = 25

重要なポイント: AllowedIPs の行には、相手側のネットワークのIP範囲を含める必要があります。これにより、WireGuardはどのパケットをVPNトンネルに送るべきかを判断します。

ステップ4:有効化と結果の確認

いよいよシステムを起動します。両方のマシンで以下のコマンドを実行してください:

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

ステータスを確認するには、定番のコマンドを使用します:

wg show

もし latest handshake という行が表示され、データ転送量(transfer)がカウントされていれば、接続は成功しています。最後に、サイトAのVM(192.168.10.50)からサイトBのVM(192.168.20.100)へpingを試してみてください。地理的な距離にもよりますが、レスポンスが10ms以下であれば成功と言えるでしょう。

ステップ5:トラブルシューティングの経験則

トンネルが「UP」と表示されていても、データが通らないことがあります。私の経験上、まずは pve-firewall を確認すべきです。Proxmoxのデフォルトのファイアウォールはかなり厳格で、未知のIP範囲からのパケットをブロックすることがあります。

両方のルーターで 51820/UDP ポートが開放されていることを確認してください。また、以下のコマンドでルーティングテーブルを確認します:

ip route show

192.168.x.0/24 dev wg0 という行が表示されている必要があります。これがない場合、WireGuardが AllowedIPs の設定を読み込めていません。動的IPを使用している方へのヒント:DDNSを使用し、Endpoint 部分にドメイン名を入力してください。WireGuardは再接続時に新しいIPを自動的に解決します。

WireGuardの導入により、夜間の当番での不安が解消されただけでなく、サーバーリソースも大幅に最適化されました。複数の拠点を管理している場合、これは間違いなく現時点で最も安定し、かつ効率的なソリューションです。

Share: