TL

WireGuard の暗号設計:Noise プロトコルとハンドシェイク

WireGuard が暗号スイートを固定し Noise_IK で1往復ハンドシェイクする仕組みを理解できます。設定ミスやローミング切断に強い理由まで押さえます。

応用WireGuardVPN暗号化Noise鍵交換セキュリティ最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.WireGuard は暗号スイートを Curve25519・ChaCha20-Poly1305・BLAKE2s に固定し、ネゴシエーションを廃して攻撃面と設定ミスを構造的に排除する。
  • 2.Noise_IK ハンドシェイクは2メッセージ(1往復)で相互認証と前方秘匿な鍵を確立し、公開鍵そのものが宛先を決める cryptokey routing でルーティングと暗号を一体化する。
  • 3.セッションは送信元 IP/ポートに束縛されず、対向の最新の送信元から学習し直すため、NAT 変更やネットワーク移動でも張り直し不要でローミングに強い。

WireGuard が「選ばない」ことで得たもの

IPsec や OpenVPN は、鍵交換・暗号・ハッシュ・認証をそれぞれネゴシエートできる柔軟さを持ちます。しかしその柔軟さは、暗号スイートのダウングレード、相互運用のための弱い設定の残存、巨大な設定項目という代償を伴いました。WireGuard はこの方針を反転させ、暗号アルゴリズムを1組に固定 します。

  • 鍵交換:Curve25519(X25519 による ECDH)
  • AEAD 暗号:ChaCha20-Poly1305
  • ハッシュ:BLAKE2s
  • ハンドシェイク骨格:Noise Protocol FrameworkNoise_IK パターン

選べないため、ネゴシエーション自体が存在しません。ClientHello に相当する暗号スイート一覧の交換がなく、ダウングレード攻撃の入り込む余地が原理的になくなります。アルゴリズムに将来欠陥が見つかった場合は、プロトコルのバージョンを上げて入れ替える方針(暗号的アジリティをプロトコル外に追い出す設計)です。VPN 全体像は /network/vpn/ を、対比対象の鍵スケジュールは /network/tls13-handshake-internals/ を参照してください。

設定が「鍵ペアと相手の公開鍵」だけ

WireGuard のインターフェース設定は、自分の秘密鍵と、対向ピアの公開鍵・許可 IP(AllowedIPs)・エンドポイントに集約されます。暗号スイート行も証明書チェーンもありません。設定面が小さいこと自体が、運用上の安全性(設定ミスの起きにくさ)に直結しています。

Noise_IK ハンドシェイク

Noise の命名 IK は、開始側(Initiator)の静的鍵が応答側に Immediately(メッセージに同梱)送られ、応答側(Responder)の静的鍵は開始側が事前に Known(既知)であることを表します。WireGuard では、接続を始める前から両者が相手の公開鍵を設定で知っているため、この前提が成立します。

ハンドシェイクは2メッセージ(1往復)で鍵が確立し、続く Data で全二重通信に入ります。-> が開始側送信、<- が応答側送信です。

->  Handshake Initiation
      unencrypted_ephemeral   (開始側の一時公開鍵 g^e_i)
      encrypted_static        (開始側の静的公開鍵を暗号化して同梱)
      encrypted_timestamp     (TAI64N タイムスタンプ、リプレイ防止)
<-  Handshake Response
      unencrypted_ephemeral   (応答側の一時公開鍵 g^e_r)
      encrypted_nothing       (空のペイロード=相互認証の確認)
->  [Transport Data]          確立した鍵で ChaCha20-Poly1305 暗号化

このハンドシェイク中、両者は段階ごとに 複数の Diffie-Hellman を合成 します。一時鍵 e と静的鍵 s の組み合わせで、eeessess のうち必要なものを連鎖的にハッシュへ混ぜ込み、チェイニングキーを更新していきます。一時鍵が入る DH があることで 前方秘匿性 が、静的鍵が入る DH があることで 相手の同一性認証 が同時に得られます。

一時鍵と静的鍵の役割を分けて理解する

一時鍵(ephemeral)は接続ごとに使い捨てるため、後で静的秘密鍵が漏れても過去セッションは復号できません(前方秘匿性の根拠)。静的鍵(static)は設定済みの相手公開鍵と一致して初めて認証が成立します。「ephemeral=機密性の更新」「static=身元の証明」と対で覚えると混同しません。

cryptokey routing:公開鍵がそのまま宛先

WireGuard の中核概念が cryptokey routing です。各ピアには公開鍵と AllowedIPs(そのピア宛・そのピア由来として許す IP レンジ)が結び付きます。これが送受信の両方向で機能します。

送信時: 宛先 IP -> AllowedIPs で一致するピアを検索 -> そのピアの鍵で暗号化
受信時: 復号して送信元ピアを特定 -> 平文の送信元 IP が
        そのピアの AllowedIPs に含まれるか検証 -> 含まなければ破棄

つまり「どの鍵で暗号化するか」と「どこへ送るか」が同じ表で決まり、暗号とルーティングが一体化しています。受信側では、復号して鍵で身元が確定したうえで、内側パケットの送信元 IP が許可レンジ内かを照合します。これにより、正規ピアであっても許可外の IP を詐称した内側パケットは拒否され、IP スプーフィングに対する強い境界になります。VPN がアドレス変換と絡む点は /network/nat/ も参照してください。

AllowedIPs は ACL でもありルートでもある

AllowedIPs0.0.0.0/0 にすると全トラフィックをそのピアへ流す一方、受信側ではあらゆる内側送信元を許すことになります。AllowedIPs は単なる経路指定ではなく、暗号的に裏打ちされたアクセス制御リストを兼ねている点に注意が必要です。レンジを絞るほど詐称耐性が上がります。

ステートレス性とローミング耐性

従来 VPN の多くは、確立したセッションを「対向の IP アドレスとポート」に強く結び付けます。そのため対向の NAT マッピングが変わったり、Wi-Fi からモバイル回線へ切り替わったりすると、セッションが切れて再ハンドシェイクが必要でした。

WireGuard はトランスポートパケットを受信して復号・認証に成功すると、その送信元 IP/ポートを そのピアの最新エンドポイントとして学習し直します。鍵が一致すれば中身が本物だと確定するので、送信元アドレスが前回と違っても問題ありません。結果として、対向が移動・NAT 変更しても トンネルは張り直さずに継続 します。これがローミング耐性です。

さらに WireGuard は、トラフィックが流れていない間は 一切パケットを送らない 完全な無通信状態を取れます。常時 keepalive を流す必要がなく、サーバーは接続中のクライアント分の常駐セッション状態を最小限しか持ちません。攻撃面の観点でも重要なのが、ハンドシェイク前の段階では応答側が状態をほとんど作らない設計(および後述の Cookie)で、未認証の相手からのリソース枯渇を避けている点です。

PersistentKeepalive は NAT 維持のため

無通信を許す設計の裏返しとして、NAT 配下のピアでは外向きの穴(マッピング)が無通信でタイムアウトします。対向から開始される通信を受けたい場合は PersistentKeepalive(例 25 秒)で最小限のパケットを定期送信し、NAT マッピングを保ちます。常時トンネルを温める従来 VPN とは目的が異なります。

DoS 耐性:暗号化 Cookie

公開鍵暗号の DH 計算は CPU を消費するため、攻撃者が偽の Handshake Initiation を大量に送ると応答側を疲弊させられます。WireGuard は負荷が高いとき、応答の代わりに 暗号化された Cookie を返します。Cookie は受信パケットの送信元 IP から導出され、開始側は次回ハンドシェイクにこの Cookie を付けて「自分はその IP から本当に応答を受け取れる」ことを示します。

これにより、送信元 IP を詐称した攻撃者は有効な Cookie を得られず、DH 計算を伴うハンドシェイク処理まで到達できません。TLS や TCP の防御機構と同様、状態を持たされる前に往復可能性を確認する発想です。トランスポート土台の挙動は /network/tcp-udp/ を参照してください。

従来 VPN との対比

WireGuard は『選択肢を削る』ことで攻撃面・設定ミス・コード量を同時に縮小し、暗号とルーティングを一体化した。
項目IPsec / OpenVPNWireGuard
暗号スイートネゴシエーションで選択(柔軟だが弱設定の余地)Curve25519・ChaCha20-Poly1305・BLAKE2s に固定
ハンドシェイクIKE 等で複数往復・多数オプションNoise_IK で1往復・オプションなし
ダウングレード攻撃設定次第で成立しうる選択肢がなく原理的に不成立
ルーティングと認証別々(ルート表 + 別の認証)cryptokey routing で一体化
ローミング対向 IP 変更で切断・再接続が多い最新エンドポイントを学習し継続
無通信時の挙動keepalive で常時セッション維持完全無通信が可能(必要時のみ keepalive)
コード規模数万行規模で監査が難しい数千行で監査しやすい

実務で確認するコマンド

# 鍵ペアの生成(秘密鍵から公開鍵を導出)
wg genkey | tee private.key | wg pubkey > public.key

# 現在のピア・最新ハンドシェイク時刻・エンドポイントを確認
wg show wg0

# ハンドシェイクの経過時間が更新され続けるか(ローミング後も継続するか)を観察
watch -n1 'wg show wg0 latest-handshakes'

latest-handshakes の値はおよそ2分ごとに更新され、endpoint 行は対向が移動するたびに学習し直されます。暗号スイートを固定して Noise_IK に一本化し、鍵そのものをルーティング判断に使う——この「選ばない設計」が、WireGuard の小ささ・速さ・ローミング耐性をまとめて生み出しています。鍵交換から完全性検証までを1つのトランスクリプトに束ねる発想は /network/tls13-handshake-internals/ と通底しており、対比して読むと設計思想の違いが鮮明になります。

ネットワーク Article

WireGuard の暗号設計:Noise プロトコルとハンドシェイクを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

WireGuard

比較で見る軸

難易度: advanced / カテゴリ: ネットワーク / タグ数: 6

導入後に効く点

Noise_IK ハンドシェイクは2メッセージ(1往復)で相互認証と前方秘匿な鍵を確立し、公開鍵そのものが宛先を決める cryptokey routing でルーティングと暗号を一体化する。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
ネットワーク
タグ数
6

判断チェックリスト

  • 自社の用途が「WireGuard / VPN」に近いか確認する。
  • 強みである「WireGuard は暗号スイートを Curve25519・ChaCha20-Poly1305・BLAKE2s に固定し、ネゴシエーションを廃して攻撃面と設定ミスを構造的に排除する。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

WireGuardVPN暗号化Noise鍵交換WireGuardVPN暗号化
参考: 公式情報