WireGuard と OpenVPN を比較:VPN プロトコルの違い
WireGuard と OpenVPN は、コンシューマー向け VPN サービスが最もよく提供している 2 つのプロトコルです。本記事では、暗号設計、性能、コード量、プラットフォーム互換性、そして運用上の特性という観点から両者を比較します。これらは、サービスが本番環境で実際にどう振る舞うかを左右する要素です。
両プロトコルの背景
OpenVPN は 2001 年に公開され、商用 VPN の導入における事実上の標準となりました。C 言語で書かれたオープンソースのプロジェクトで、ユーザー空間で動作し、暗号化の処理には OpenSSL または mbedTLS ライブラリを使用します。その歴史の長さと柔軟性によって、豊富な機能セットと幅広い設定への対応が生まれました。
WireGuard はかなり新しいものです。このプロトコルは 2016 年に初めて発表され、2020 年に Linux カーネルへ統合されました。先行するプロトコルよりもシンプルであることを明確に目指して設計され、より小さなコードフットプリント、現代的な暗号プリミティブの限定されたセット、そして対応するプラットフォームではカーネル内に常駐する実装を備えています。プロトコルの作者である Jason A. Donenfeld は、設計目標を設定の柔軟性ではなく検証可能性と性能を中心に据えました。
暗号設計
この 2 つのプロトコルは、暗号への取り組み方が大きく異なります。WireGuard は固定されたアルゴリズムのセットとともに提供されます。OpenVPN は運用者が多くの選択肢から選べるようにしています。
WireGuard の固定スイート
WireGuard は、現代的なプリミティブに基づいた単一の暗号スイートを使用します。その構成要素は、暗号化に ChaCha20、認証に Poly1305、鍵交換に Curve25519、ハッシュに BLAKE2s、負荷分散に SipHash24 です。ハンドシェイクは Noise Protocol Framework が担います。
スイートを固定することには 2 つの結果があります。第一に、プロトコルのネゴシエーションがなくなります。これは TLS ベースのプロトコルにおいて、歴史的にダウングレード攻撃の原因となってきたものです。第二に、暗号を更新するには設定の変更ではなくプロトコルのバージョンアップが必要になることを意味します。
OpenVPN の設定柔軟性
OpenVPN は、基盤となる TLS ライブラリを通じて多くの暗号の選択肢に対応します。一般的な構成には、暗号化の AES-256-GCM、認証の SHA256、鍵交換の ECDH などがあります。古い OpenVPN の環境では、BF-CBC や AES-CBC と HMAC の組み合わせが使われていることがありますが、これらは現代の基準では大幅に弱いものです。
この柔軟性により OpenVPN は古いクライアントにも対応できますが、一方で、ある特定の環境が強い設定を使っていることを確認するには設定の監査が必要になることも意味します。
性能の特性
WireGuard は、同じハードウェア上では一般に OpenVPN より高い性能を発揮します。この差のほとんどは 2 つの要因で説明できます。
第一に、WireGuard は Linux、macOS、Windows ではカーネル内で動作するため、すべてのパケットをカーネルとユーザー空間の間で移動させるオーバーヘッドを回避できます。OpenVPN のユーザー空間での実装は移植性に優れますが、パケットごとにコンテキストスイッチのコストが発生します。
第二に、ChaCha20-Poly1305 は専用の AES 命令を持たないプロセッサに適しており、これは ARM ベースのモバイル端末でよく見られます。OpenVPN は通常 AES を使用しますが、これは AES-NI を備えたハードウェアでは高速な一方、それ以外の環境では低速になります。
実際のところ、WireGuard はコンシューマー向け端末において、OpenVPN と比べてより高いスループット、より低いレイテンシ、そして低減された CPU 使用率を達成することが多いです。モバイル端末のバッテリーへの影響も、通常はより小さくなります。
コード量と監査の対象範囲
コードベースの規模は、脆弱性を監査するために必要な労力とおおまかに相関します。WireGuard のリファレンス実装は、およそ 4 千行のコードで構成されています。Linux カーネルの実装も同程度です。
対照的に OpenVPN はおよそ 7 万行に及び、TLS ライブラリ(OpenSSL または mbedTLS)に依存しており、これが信頼境界にさらに数十万行のコードを加えます。この規模の差だけで WireGuard がより安全だと言えるわけではありませんが、実装をどれだけ徹底的に検証できるかには影響します。
プラットフォーム互換性
どちらのプロトコルも幅広く対応されています。WireGuard には、Linux(カーネルおよびユーザー空間)、Windows、macOS、iOS、Android、FreeBSD、OpenBSD 向けの公式実装があります。特に iOS のサポートは、iOS の Network Extension フレームワークを通じてよく統合されています。
OpenVPN は、WireGuard が移植されていない古いシステムを含め、ほぼあらゆるプラットフォームで利用できます。多くの企業ネットワークは、レガシーなインフラとの互換性のために OpenVPN を使用しています。
現代的なオペレーティングシステム上での新規導入には、WireGuard の方がより分かりやすい選択肢です。古いシステム、組み込み機器、特定の企業向け製品などを含め、幅広い互換性が求められる環境では、OpenVPN は依然として有効です。
設定モデル
WireGuard の設定モデルは意図的に最小限に抑えられています。各 peer は公開鍵の識別子と許可された IP のリストを持ちます。ユーザーレベルの認証はなく、サーバー上のセッション状態もなく、keepalive のネゴシエーションもありません。プロトコルは、ユーザー名やパスワードではなく暗号による識別に依拠しています。
OpenVPN は、より柔軟な認証モデルに対応します。証明書ベースの認証、ユーザー名とパスワードによる認証、二要素認証のいずれも利用できます。この柔軟性は、認証がディレクトリサービスと統合されている企業環境で役立ちます。
コンシューマー向け VPN サービスでは、ユーザー同士が互いに識別される必要がないため、WireGuard のよりシンプルなモデルで通常は十分です。
どちらをいつ使うか
プロトコルの選択は、導入における制約に左右されます。
- WireGuard が望ましいのは、性能、コードのシンプルさ、現代的な暗号が優先される場合、対象となるプラットフォームがネイティブに対応している場合、そして固定された暗号スイートを受け入れられる場合です。
- OpenVPN が望ましいのは、古いシステムとの互換性が必要な場合、企業の認証との統合が必要な場合、あるいは UDP トラフィックを制限するネットワークを通過しなければならない場合です(OpenVPN は TCP へのフォールバックに対応しますが、WireGuard は対応しません)。
現代的なコンシューマー向け VPN サービスの多くは両方のプロトコルを提供し、ユーザーが選べるようにしています。対照的に Snap VPN は、iOS の Network Extension フレームワークを通じて統合した WireGuard のみを使用しています。この判断は、実装の対象範囲を、対象プラットフォームに必要なものだけに絞り込むという設計原則を反映しています。
VPN が一般にどのように機能するかの概要については、 VPN の入門記事をご覧ください。iPhone での実際の設定については、 iOS 設定ガイドをご覧ください。