VPS での WireGuard の PersistentKeepalive 25 と PresharedKey
PersistentKeepalive = 25 は25秒ごとにキープアライブを送り、NAT がトンネルを開いたままにするようにします。設定するのは NAT の内側にあるクライアント側です。PresharedKey は対称鍵による耐量子の保険を追加します。
結論:`PersistentKeepalive = 25` は、WireGuard に25秒ごとに小さな認証済みパケットをピアへ送らせる設定で、NAT とステートフルファイアウォールのマッピングを維持し、相手側から引き続き到達できるようにします。通常は、NAT の内側にあるピア(ノート PC、スマートフォン、自宅のルーター)にだけ設定し、パブリック IP を持つ VPS には設定しません。`PresharedKey` は、ピアの組ごとに追加するオプションの 256 ビット対称シークレットで、`wg genpsk` で生成され、Curve25519 に対する将来の量子攻撃への保険としてハンドシェイクに混ぜ込まれます。
このガイドでは両方のオプションを解説し、WireGuard VPS 用の動作するサーバーとクライアントの設定を示します。NAT と DNS を含む VPN 構築の全手順は、WireGuard VPN ガイドを参照してください。
PersistentKeepalive = 25 が実際にすること
WireGuard は設計上静かで、データが流れていないときは何も送りません。プライバシーとバッテリーには好都合ですが、NAT とコネクショントラッキングを行うルーターは、アイドル状態の UDP マッピングを多くの場合30秒、時には数分で破棄します。マッピングが消えると、クライアントが再び何かを送るまで、サーバーからのパケットは NAT の内側のクライアントに届かなくなります。
`PersistentKeepalive` は秒単位の間隔です。`25` にすると、ピアは25秒間何も送信していないときに、空の暗号化されたキープアライブを送ります。25 という値は、一般的な UDP タイムアウトの最短値を確実に下回るため、WireGuard のドキュメントで推奨されています。この設定はデフォルトではオフ(`0`)で、オーバーヘッドはピアごとに約25秒に1回の小さなパケットです。
| 値 | 効果 | 使う場面 |
|---|---|---|
| 0 または未設定 | キープアライブなし。アイドル時はトンネルが沈黙 | 両方のピアにパブリック IP がある場合、またはクライアントが常に通信を開始する場合 |
| 25 | アイドル時間25秒ごとにキープアライブ | 到達可能な状態を保つ必要がある NAT や CGNAT 内のクライアント |
| 15〜20 | より頻繁なキープアライブ | UDP タイムアウトが異常に短いネットワーク |
| 60 以上 | パケットは減るが、マッピング喪失のリスクが高まる | ほとんど役に立たない。多くの NAT 機器はもっと早くタイムアウトする |
PersistentKeepalive が必要なのはどちら側か
キープアライブは、直接到達できないピア、つまり NAT の内側にあるピアに設定します。そのピアが外向きにパケットを送ることで、自身の NAT マッピングを更新します。パブリック IPv4 アドレスを持つ VPS の前には NAT がないので、到達可能性を保つためにこのオプションは不要です。また VPS はクライアントのエンドポイントをクライアントのパケットからしか知らないため、自分だけでリモートの NAT を開いたままにすることはできません。
クライアントがトンネル経由でブラウジングするだけなら、トラフィックを送るたびに即座に再接続されるので、キープアライブは任意です。必要になるのは、自宅マシンへの SSH、監視、拠点間接続など、サーバーや他のピアからクライアントへ接続を開始しなければならない場合です。
- ▹NAT 内のノート PC やスマートフォンから VPS へ:クライアント側にだけ `PersistentKeepalive = 25` を設定します。
- ▹両方ともパブリック IP を持つ VPS 同士:通常は未設定のままにします。[WireGuard メッシュガイド](/guides/wireguard-mesh-vps-cluster)を参照。
- ▹VPS 経由で公開する CGNAT 内の自宅サーバー:自宅サーバー側に設定します。そうしないと VPS は数分以内に経路を失います。
- ▹モバイルクライアント:キープアライブはバッテリーを多少消費するので、デバイスに到達できる必要がある場合にだけ有効にしましょう。
PresharedKey:オプションの対称鍵レイヤー
WireGuard のハンドシェイクは Curve25519 による鍵交換を使います。十分に大きな量子コンピューターが理論上その鍵交換を破れるようになれば、攻撃者は今日トラフィックを記録しておき、後で復号できます。`PresharedKey` は、追加の 256 ビット対称鍵をハンドシェイクに混ぜ込みます。この長さの対称鍵は、既知の量子アルゴリズムでは現実的に破れないと考えられているため、PSK が秘密に保たれている限り、公開鍵の部分が破られても記録されたトラフィックは保護されたままです。
PSK はピアの組ごとに1つで、両方のピアの `[Peer]` セクションで同一でなければならず、組ごとに一意であるべきです。秘密鍵の代わりではなく、追加のレイヤーです。PSK が一致しないとハンドシェイクは黙って失敗し、`wg show` に `latest handshake` が表示されません。
- ▹`wg genpsk` で生成します。base64 エンコードされたランダムな32バイトの鍵が出力されます。
- ▹SSH など、すでに信頼している経路で転送しましょう。チャットやメールでは絶対に送らないこと。
- ▹組ごとに1つの PSK を使います。5ノードのメッシュなら、10個の異なる PSK になります。
- ▹デバイスを紛失したり廃棄したりしたときは、他のシークレットと同様にローテーションしましょう。
鍵と PresharedKey を生成する
Debian 12/13 または Ubuntu 24.04 で `apt install wireguard` によりツールをインストールし、各秘密鍵を置くマシン上で鍵を生成します。PSK はどちら側で生成してもよく、もう一方にコピーします。`umask 077` により、ファイルは root だけが読めるようになります。
umask 077
cd /etc/wireguard
# on the VPS
wg genkey | tee server.key | wg pubkey > server.pub
# on the client
wg genkey | tee client.key | wg pubkey > client.pub
# once, on either side; copy to the other over SSH
wg genpsk > client.pskVPS のサーバー設定:/etc/wireguard/wg0.conf
サーバーは固定の待ち受けポートを持ち、キープアライブも、クライアント用の `Endpoint` も設定しません。クライアントの現在のアドレスは、認証済みのパケットから学習するためです。
[Interface]
Address = 10.8.0.1/24, fd08::1/64
ListenPort = 51820
PrivateKey = <contents of server.key>
[Peer]
# laptop
PublicKey = <contents of client.pub>
PresharedKey = <contents of client.psk>
AllowedIPs = 10.8.0.2/32, fd08::2/128Note · VPS のファイアウォールで UDP 51820 を開放し、`systemctl enable --now wg-quick@wg0` でトンネルを起動します。他に何かを公開する前に、SSH 強化ガイドのとおり SSH を固め、StrictModes ガイドで鍵のパーミッションを確認してください。
NAT 内のクライアント設定
クライアントは VPS のパブリックアドレスを指し、キープアライブを設定します。プライベートなトンネルだけなら `AllowedIPs = 10.8.0.0/24, fd08::/64` を、すべてのトラフィックを VPS 経由にするなら `0.0.0.0/0, ::/0` を使います。
[Interface]
Address = 10.8.0.2/32, fd08::2/128
PrivateKey = <contents of client.key>
[Peer]
PublicKey = <contents of server.pub>
PresharedKey = <contents of client.psk>
Endpoint = 203.0.113.10:51820
AllowedIPs = 10.8.0.0/24, fd08::/64
PersistentKeepalive = 25Note · 専用 IPv4 付きの NoctisNode Wisp VPS(1 vCPU、1 GB RAM、28日サイクルあたり $6)なら個人用の WireGuard エンドポイントに十分で、登録時にメールアドレスとパスワードだけで、Monero などの暗号資産で支払えます。
確認とトラブルシューティング
両側で `wg show` を実行します。正常なクライアントでは、そのピアについて最近の `latest handshake`、`persistent keepalive: every 25 seconds`、`preshared key: (hidden)` が表示されます。
- 01.ハンドシェイクがまったくない:VPS で UDP 51820 が開いていること、`Endpoint` の IP とポートが正しいことを確認します。
- 02.PSK なしではハンドシェイクできるが、PSK ありではできない:2つの設定で PresharedKey が異なっています。もう一度コピーしてください。
- 03.トンネルは動くが、1分後にサーバーからクライアントへ到達できなくなる:クライアントに `PersistentKeepalive = 25` を追加します。
- 04.再起動せずにキープアライブを変更する:`wg set wg0 peer <server-public-key> persistent-keepalive 25`。
- 05.実行中にファイルから PSK を追加する:`wg set wg0 peer <public-key> preshared-key /etc/wireguard/client.psk`。
よくある質問
QWireGuard の PersistentKeepalive 25 とはどういう意味ですか?
A他のトラフィックがない状態が25秒続いたら、ピアに暗号化されたキープアライブパケットを送らせる設定です。これにより NAT とファイアウォールのマッピングが開いたままになり、相手側からトンネルに到達できる状態が保たれます。
QPersistentKeepalive はサーバーとクライアントのどちらに設定すべきですか?
ANAT の内側にあるピアで、ほぼ常にクライアントです。パブリック IP を持つ VPS には不要で、VPS だけではクライアントの NAT マッピングを開いたままにできません。
QWireGuard の PresharedKey は必須ですか?
Aいいえ、任意です。Curve25519 に対する将来の量子攻撃への保険として対称シークレットをハンドシェイクに追加するもので、長期間使うトンネルには良いデフォルトです。
QWireGuard の PresharedKey を生成するには?
A`wg genpsk > peer.psk` を実行し、同じ値を両方のピアの `[Peer]` セクションの `PresharedKey` 行に設定します。ピアの組ごとに異なる PSK を使ってください。
QPersistentKeepalive は帯域幅を大量に使いますか?
Aいいえ。アイドル時間約25秒ごとに小さなパケットを1つ送るだけなので、VPS では無視できる量です。ただし、スマートフォンではバッテリー持ちがわずかに短くなることがあります。