関連ガイド
WireGuard とは?仕組みと歴史をくわしく解説
更新日
WireGuard は Jason A. Donenfeld が設計したオープンソースの VPN プロトコルで、2015年ごろに公開され、2020年に正式に Linux カーネルへ取り込まれました。特徴をひとことで言えば「少ない」です。コードが少ない(中核部分はわずか数千行。OpenVPN や IPsec は数十万行)。選択肢が少ない(暗号方式は固定の1セットだけで、選ばせない)。状態が少ない(「接続中」「切断済み」という概念がなく、データがあれば送り、なければ黙っている)。この少なさが速さ、省電力、監査のしやすさを生む一方で、UDP しか使えない、偽装がない、鍵の配布は扱わない、という弱点にもなっています。以下では、まず仕組みを、次に次世代 VPN の土台になるまでの歩みを説明します。
設計の考え方:VPN をネットワークカードのように
WireGuard 以前の主な選択肢は IPsec と OpenVPN でした。IPsec は大きな規格群で設定項目が非常に多く、メーカー間の相互接続が面倒なことで有名です。OpenVPN はユーザー空間で動き、巨大な TLS ライブラリに依存していて、柔軟ですが遅めです。どちらもコード量が多すぎて、全体をきちんと監査できる人はほとんどいません。
WireGuard の発想はその逆で、1つのことだけを正しくやる、というものです。システム上では仮想ネットワークカード(たとえば wg0)として現れます。このカードに自分の秘密鍵といくつかの相手の公開鍵を設定すれば、そこへ送ったパケットは暗号化されて送り出され、届いたパケットは復号されてそこから出てきます。それ以外のこと(ルーティング、ファイアウォール、アドレスの割り当て)は、すべてシステムに既にあるツールに任せます。
あえてやらないことも明確です。暗号方式の交渉、ユーザー名とパスワードの管理、アドレスの割り当て、通信の偽装はしません。これらは脆弱性の原因になるとみなされたか、上位のツールに任されています。
暗号鍵ルーティング:公開鍵がそのまま身元
WireGuard では端末ごとに鍵ペアを持ち、公開鍵がその端末の身元になります。SSH と似た使い方で、お互いの公開鍵を自分の設定に書き込めば信頼関係ができあがります。証明書もユーザー名もパスワードもありません。
設定では相手ごとに「許可するアドレス」(AllowedIPs)を1行書きます。これは両方向に効きます。送信時は、宛先アドレスがどの相手の許可範囲に入るかで、その相手の公開鍵で暗号化して送ります。受信時は、復号したあと送信元アドレスがその相手の許可範囲にあるかを確かめ、なければ捨てます。この方式を暗号鍵ルーティング(cryptokey routing)と呼び、ルーティング表とアクセス制御が1つの表にまとまっています。
ですから、ある相手の許可アドレスを 0.0.0.0/0 にすれば「すべての通信をその相手に任せる」、つまり一般にいう全体 VPN になります。社内ネットワークの範囲だけを書けば、その範囲にアクセスするときだけトンネルを通ります。
ハンドシェイクと暗号:決まった1セットの方式
2台の端末は最初の通信の前にハンドシェイクをします。開始側が1つパケットを送り、応答側が1つ返す、この1往復で完了し、双方はその間だけ使うセッション鍵を得ます。ハンドシェイクは Noise プロトコルフレームワークに基づき、双方の長期鍵で相互に認証しつつ、一時的な鍵で前方秘匿性を確保します。つまり、あとで長期の秘密鍵が漏れても、過去に録られた通信は解読できません。
セッション鍵は数分おきに自動で更新されます。この処理はユーザーからは見えず、「再接続」というものもありません。
暗号方式は固定です。鍵交換は Curve25519、データの暗号化は ChaCha20-Poly1305、ハッシュは BLAKE2s。交渉がないのでダウングレード攻撃もありません。攻撃者が両者に弱い方式を使わせることはできないのです。将来どれかの方式が破られた場合は、選択肢を増やすのではなく、新しいバージョンのプロトコルで丸ごと置き換えます。
さらに事前共有鍵を追加して公開鍵の仕組みと重ねて使うこともできます。将来の量子コンピューターによる公開鍵暗号への脅威に備えるためです。
UDP だけ、知らない相手には応答しない、回線を替えても切れない
- UDP だけ:WireGuard はパケットを1つずつ暗号化して UDP パケットに入れて送ります。TCP を使わないのは意図的です。TCP の中で TCP を動かすと、2層ともに再送を行い、パケットロス時に互いの足を引っ張るからです。
- 知らない相手には応答しない:認証を通らないパケットには一切返事をしません。ポートスキャンをする側からは、そのポートは閉じているようにしか見えず、WireGuard が動いていることすら分かりません。
- ローミング:WireGuard は「接続」ではなく公開鍵だけを見ます。相手のアドレスが変わっても(スマートフォンが Wi‑Fi からモバイルデータに切り替わるなど)、次に届いたパケットの認証が通れば、こちらは自動で新しいアドレスへ返信します。そのため回線を切り替えてもトンネルは切れません。
- 静か:送るデータがないときはトンネルから一切通信が出ないので、スマートフォンでは電池が長持ちします。端末がルーターの内側にあって、相手から常に到達できる必要があるときだけ、定期的な生存確認(PersistentKeepalive)をオンにし、数十秒おきに小さなパケットを送ってルーター上の対応表を保ちます。
なぜ速いのか
- カーネルで動く:Linux の WireGuard はカーネルモジュールなので、パケットをカーネルとユーザープログラムの間で行き来させる必要がありません。従来の OpenVPN はユーザー空間で動くため、パケットごとに一回り余計に遠回りします。
- どの CPU にも向いた方式:ChaCha20 は専用のハードウェア高速化命令に頼らないので、AES 命令を持たないスマートフォンやルーターのチップでは特に有利です。
- ハンドシェイクが短い:1往復でデータを送り始められるので、接続確立の待ち時間がほとんどありません。
- コードが少ない:処理の経路が短く、できる最適化は要所の数ステップに集中しています。
- ただし、これはプロトコルと実装そのもののオーバーヘッドの話です。国境をまたぐ回線での実際の速度は、回線のパケットロスと、通信事業者が UDP をどう扱うかに大きく左右されます。
歩み:個人プロジェクトからカーネル入りまで
- 2015年ごろ:Jason A. Donenfeld が WireGuard の開発を始めて公開。当初は Linux 用の独立したカーネルモジュールでした。
- 2017年:設計を説明する論文がセキュリティ学会 NDSS で発表され、その後プロトコルは複数の独立した形式検証を受けました。同じころ、Mullvad などの VPN 事業者が WireGuard での接続を提供し始めます。
- 2018年:Linux の生みの親 Linus Torvalds がメーリングリストでそのコードを称賛し、OpenVPN や IPsec と比べればまるで芸術作品だと述べました。この言葉で開発者の間に広く知られるようになります。
- 2019年:Cloudflare が Rust で書いたユーザー空間実装 BoringTun を公開し、WARP に WireGuard を採用。NordVPN は WireGuard ベースの NordLynx を発表し、Tailscale もこの時期に WireGuard をデータ転送の土台として立ち上がりました。
- 2020年3月:WireGuard が Linux 5.6 で正式にカーネル本流に取り込まれ、同時にバージョン 1.0 が公開されました。以来、主要な Linux ディストリビューションには最初から WireGuard が入っていて、モジュールを別途入れる必要はありません。同じ年に OpenBSD もカーネルに取り込みました。
- 2021年:Windows 向けにカーネルモード実装の WireGuardNT が登場し、それまでのユーザー空間実装より性能が一段上がりました。続いて FreeBSD にもカーネル実装ができました。
- 現在:Windows、macOS、Linux、iOS、Android に公式クライアントがあり、OpenWrt や Synology などのルーター・NAS の OS にも広く組み込まれています。商用 VPN の大半が、標準または選択可能なプロトコルとして採用しています。
やらないこと、そしてそこから来る弱点
- 鍵の配布は扱わない:端末を1台増やすたびに、その公開鍵をほかの端末の設定に書き込む必要があります。台数が増えると管理しきれず、Tailscale のようなツールが存在するのはまさにこのためです。
- アドレスを動的に割り当てない:各相手の内部アドレスは設定に固定で書かれ、OpenVPN のような「接続したらアドレスを配る」仕組みはありません。商用 VPN が使う場合は、外側に自前の層を作っています。
- プライバシー面の懸念:サーバーは返信のために、各相手の直近のグローバルアドレスを覚えておく必要があります。「ログを残さない」ことを求められる VPN 事業者は、定期的な消去や二重のアドレス変換など、追加の対策をとるのが普通です。
- UDP だけ:UDP をブロックしたり速度制限したりするネットワークでは、つながらないか非常に遅くなります。TCP や 443 番ポートで通したいなら、外側に別のツールをかぶせるしかありません。
- 偽装がない:ハンドシェイクやデータのパケットの形式と長さに決まった特徴があり、簡単に識別されます。設計の目標は安全と簡潔さで、検閲回避ではありません。
- アカウントの仕組みがない:プロトコルにはユーザー名、パスワード、有効期限といった概念がなく、見ているのは公開鍵だけです。
OpenVPN・IPsec との比較
- コード量:WireGuard の中核は数千行。OpenVPN は依存する TLS ライブラリを含めると、IPsec も各種実装とも数十万行の規模です。
- 通信方式:WireGuard は UDP のみ。OpenVPN はどちらも使え、TCP 443 番で HTTPS の通信と同じポートに紛れ込めます。IPsec は独自のプロトコル番号と UDP 500/4500 を使います。
- 設定:WireGuard は相手1つにつき数行。OpenVPN の設定ファイルは項目が多い分柔軟。IPsec が最も複雑です。
- 性能:素直なネットワークでは WireGuard がたいてい最速で、電池にも優しい方式です。OpenVPN も新しいバージョンではカーネル高速化(DCO)が入り、差は縮まっています。
- 機能:ユーザー名とパスワードによる認証、アドレスとルートの動的な配布、TCP での通信。OpenVPN にはこれらが最初からありますが、WireGuard では外側のシステムで補う必要があります。
- 対応機器:OpenVPN は歴史が長く、古いルーター、NAS、各種組み込み機器でもほぼ使えます。WireGuard はここ数年の OS には普及していますが、古い機器には入っていないことがあります。
WireGuard の上に生まれたもの
- Tailscale:WireGuard にログイン、鍵の配布、NAT 越え、中継を加え、自動でつながるネットワークにしたもの。「Tailscale の仕組みをくわしく」をご覧ください。Headscale はそのオープンソースの制御サーバー実装です。
- Netmaker、NetBird、Firezone など:同じく「データ転送は WireGuard、管理部分は自前」というネットワーク構築やゼロトラストの製品です。
- Cloudflare WARP:一般ユーザー向けの WireGuard クライアントで、通信を Cloudflare のネットワークに送り込みます。
- 商用 VPN の独自パッケージ:NordLynx など。WireGuard の外側にアドレス割り当てとプライバシー対策の層を加えています。
- AmneziaWG などの派生版:パケットのヘッダーや詰め物を変えて WireGuard 固有の特徴を隠し、検査の厳しいネットワークで使うためのもの。標準の WireGuard クライアントとは互換性がありません。
中国のネットワークでは
- 使えるかどうかは、まず UDP 次第です。多くの固定回線やモバイル回線は大量の UDP 通信を速度制限しており、つないだ直後は速いのにしばらくすると遅くなる、夜のピーク時に目立って重くなる、といった形で現れます。
- 国境をまたいで直接つなぐと識別されやすい:WireGuard のハンドシェイクのパケットには決まった特徴があり、国際区間で識別されて妨害されることがあります。ハンドシェイクが通らない、しばらく使うと通信が止まる、といった症状です。プロトコルに偽装がないことの直接の結果です。
- 中国国内の端末どうしをつなぐ場合(会社と自宅、スマートフォンと NAS など)は国際区間を通らないので、ふつうこの問題はなく、影響するのは UDP の速度制限と NAT 越えの成功率だけです。
- そのため WireGuard は、端末どうしのネットワークやリモートアクセスに向いています。国境をまたいで長く安定して使うには、偽装のある方式や TCP/TLS で通る方式と組み合わせる必要があります。各プロトコルの比較は「VPN プロトコル比較」をご覧ください。
LeoTun で WireGuard を使っているところ
LeoTun の「プライベート」は Tailscale を使っており、そのデータ転送部分が WireGuard です。端末どうしのトンネルも、各地域の出口ノードへのトンネルも、暗号化と転送は WireGuard が担っています。鍵の生成や設定ファイルの作成は不要で、このサイトのアカウントでログインすればクライアントが自動で済ませます。使い方は「プライベート(Tailscale)とは」を、入口は「プライベート」ページをご覧ください。
「プライベート」のほかにも、同じアカウントで UDP に頼らない方式が使えます。Cisco(AnyConnect)は TLS で、OpenVPN は TCP でも通り、Hiddify(Hysteria2)はパケットロスに強い方式です。お使いのネットワークで「プライベート」が遅い・不安定なときは、方式を替えれば解決します。「接続方法ごとの向いている場面」をご覧ください。
よくある質問
WireGuard と OpenVPN はどちらがいいですか?
UDP が制限されていない素直なネットワークなら、WireGuard のほうが速く、電池に優しく、回線を切り替えても切れません。TCP で通す必要がある、ユーザー名とパスワードでログインしたい、機器が古い、という場合は OpenVPN が向いています。どちらもオープンソースで長年検証されたプロトコルで、安全性はどちらも信頼できます。
WireGuard は安全ですか?
現代的で保守的な暗号方式を使い、プロトコルは形式検証を受けています。コード量が少なく監査しやすく、現時点で実際に破る方法は知られていません。ただし鍵の保管と配布は WireGuard の役目ではありません。秘密鍵が漏れたり、公開鍵を設定する相手を間違えたりした場合は、プロトコル自体ではどうにもできません。
WireGuard はなぜ UDP にしか対応していないのですか?
設計上の割り切りです。TCP 接続の中で TCP を動かすと、パケットロス時に2層が同時に再送して性能が急激に落ちます。また UDP なら「知らない相手には応答しない」こともローミングも実現しやすくなります。その代わり、UDP をブロックするネットワークでは使えません。
WireGuard は中国で使えますか?
中国国内の端末どうしをつなぐ用途なら、たいてい使えます。国境をまたいで直接つなぐと不安定です。通信に偽装がないため識別・妨害されやすく、一部の回線は UDP を速度制限しているからです。国境をまたいで安定させたいなら、偽装のある方式や TLS で通る方式と組み合わせてください。
WireGuard は誰が開発し、いつ Linux カーネルに入ったのですか?
Jason A. Donenfeld が設計・開発し、2015年ごろに公開しました。2020年3月に Linux 5.6 でカーネル本流に取り込まれ、同時にバージョン 1.0 が公開されています。
Tailscale は WireGuard そのものですか?
同じものではありません。WireGuard は暗号化トンネルのプロトコルで、Tailscale は WireGuard でデータを運ぶネットワーク構築の仕組みです。ログイン、鍵の配布、NAT 越え、中継を別途解決しています。くわしくは「Tailscale の仕組みをくわしく」をご覧ください。
WireGuard を使うには自分で鍵を設定する必要がありますか?
WireGuard を直接使うなら必要です。端末ごとに鍵を生成し、公開鍵、アドレス、相手のアドレスを設定に書き込みます。Tailscale や商用 VPN のクライアント経由なら、これらはソフトウェアが代わりにやってくれます。LeoTun の「プライベート」なら、アカウントでログインするだけです。