「VPNを導入したいが、OpenVPNの設定は複雑すぎる」「リモートワーカーが増えて社内ネットワークへの安全なアクセス経路が必要だ」と感じているインフラエンジニアや情シス担当者は多いはずです。
WireGuardは、そうした悩みを解消するために設計された現代のVPNプロトコルです。OpenVPNやIPsecと比べてコードが驚くほどシンプルで、設定もわかりやすく、速度も高速です。この記事では、WireGuardの概要から、LinuxサーバーにVPNを構築するまでの手順を、現場で使えるレベルで解説します。
WireGuardとは?OpenVPN・IPsecとの違い
WireGuardは2020年にLinuxカーネル5.6に本体統合された比較的新しいVPNプロトコルです。セキュリティ研究者のJason A. Donenfeldが設計し、「シンプルで高速、そして正しい暗号化」を設計思想の中核に置いています。
主要なVPNプロトコルとの比較を見てみましょう。
| 比較項目 | WireGuard | OpenVPN | IPsec |
|---|---|---|---|
| コード行数 | 約4,000行 | 約100,000行 | 数万行以上 |
| 暗号化方式 | 固定(ChaCha20・Curve25519等) | 設定次第(柔軟) | 設定次第(複雑) |
| 設定ファイル | シンプル(INI形式) | 複雑(証明書管理含む) | 非常に複雑 |
| スループット | 高速(カーネル空間で動作) | 中程度 | 高速(ハードウェアオフロード対応) |
| カーネル統合 | あり(Linux 5.6以降) | なし(ユーザー空間) | あり |
コード行数が少ないことは単なるトリビアではありません。コードが少ないほど、脆弱性が混入する可能性が低くなります。セキュリティ監査においても、4,000行は100,000行より確認しやすいのは明らかです。
WireGuardが使う暗号技術
WireGuardは「暗号化の選択肢を提供しない」という思い切った設計を採用しています。利用する暗号は固定されており、これによって設定ミスによる脆弱な暗号化という事故が原理的に発生しません。
・鍵交換: Curve25519(楕円曲線ディフィー・ヘルマン鍵共有)
・認証付き暗号: ChaCha20-Poly1305
・ハッシュ関数: BLAKE2s
・ハンドシェイク: Noise_IKpsk2(1.5往復で完了)
これらはいずれも現在の暗号標準として広く認められているアルゴリズムです。
WireGuardの仕組み(攻撃者の視点から理解する)
WireGuardのセキュリティ上の重要な特徴として「サイレントドロップ」があります。
通常のサーバーは、不正なパケットを受信した場合にエラーを返します。この応答自体が「このポートにサービスが存在する」という情報を攻撃者に与えてしまいます。WireGuardは、正規の認証が通らないパケットに対して一切応答しません。ポートスキャンやプロービングに対してサーバーは無音です。
また、WireGuardはセッション(トンネル)を「接続」として扱いません。各ピアは静的な公開鍵と許可するIPアドレスレンジで定義されており、UDP上でステートレスに動作します。この設計により、ローミング(IPアドレスの変更)にも自動的に対応します。
WireGuardのインストールと基本設定(Ubuntu/Debian)
1. サーバー側のセットアップ
VPNサーバーとして動作するLinuxマシン(以下「サーバー」)での作業手順です。
# WireGuardのインストール sudo apt update && sudo apt install -y wireguard # サーバーの秘密鍵と公開鍵を生成 wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key # 鍵ファイルの権限を制限(root以外は読めない状態にする) sudo chmod 600 /etc/wireguard/server_private.key # 生成された鍵を確認 sudo cat /etc/wireguard/server_private.key sudo cat /etc/wireguard/server_public.key
次に、WireGuardの設定ファイルを作成します。
# /etc/wireguard/wg0.conf を作成 sudo nano /etc/wireguard/wg0.conf
設定ファイルの内容は以下の通りです。
[Interface] # VPNトンネルのサーバー側IPアドレス Address = 10.0.0.1/24 # WireGuardが待ち受けるUDPポート(デフォルト51820) ListenPort = 51820 # サーバーの秘密鍵(先ほど生成したファイルの内容を貼り付ける) PrivateKey = <server_private.keyの内容> # NAT環境でクライアントがインターネットにアクセスできるようにするルール PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ここで `eth0` は実際のアウトバウンドインターフェース名に合わせてください(`ip route` で確認できます)。
2. IPフォワーディングの有効化
クライアントからのパケットをサーバーが転送できるよう、IPフォワーディングを有効にします。
# 一時的に有効化(再起動で消える) sudo sysctl -w net.ipv4.ip_forward=1 # 永続化(/etc/sysctl.conf に追記) echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
3. クライアント側の鍵生成と設定
接続するクライアントPC(またはリモートワーカーのPC)での作業です。クライアント側にもWireGuardをインストールし、鍵ペアを生成します。
# クライアント側(LinuxまたはmacOS)での鍵生成 wg genkey | tee client_private.key | wg pubkey > client_public.key # 生成された鍵を確認 cat client_private.key cat client_public.key
クライアントの設定ファイル(`wg0.conf`)は以下の通りです。
[Interface] # クライアントのVPN内IPアドレス Address = 10.0.0.2/32 # クライアントの秘密鍵 PrivateKey = <client_private.keyの内容> # すべてのトラフィックをVPN経由にする場合のDNS設定 DNS = 1.1.1.1 [Peer] # サーバーの公開鍵 PublicKey = <server_public.keyの内容> # サーバーのグローバルIPアドレスとポート Endpoint = <サーバーのIPアドレス>:51820 # 許可するIPレンジ(0.0.0.0/0はすべての通信をVPN経由にする) AllowedIPs = 0.0.0.0/0, ::/0 # NAT越えのためのキープアライブ(25秒ごとにパケットを送る) PersistentKeepalive = 25
4. サーバーの設定にクライアントを追加する
クライアントの公開鍵をサーバー側の設定ファイルに追記します。
# /etc/wireguard/wg0.conf の末尾に追記 [Peer] # クライアントの識別名(コメント) # client_name: Alice's laptop PublicKey = <client_public.keyの内容> # このクライアントに割り当てるVPN内IPアドレス AllowedIPs = 10.0.0.2/32
5. WireGuardの起動と自動起動設定
# WireGuardインターフェースを起動 sudo wg-quick up wg0 # 起動状態の確認 sudo wg show # OS起動時に自動起動するよう設定 sudo systemctl enable wg-quick@wg0 # クライアント側でもVPNを起動 # Linuxの場合 sudo wg-quick up wg0 # 接続確認(VPN経由でサーバーにpingを打つ) ping 10.0.0.1
中小企業でも今日からできること
WireGuardは設定ファイルがシンプルなため、情シス1人体制の組織でも十分に管理できます。特に以下のユースケースで有効です。
・リモートワーカーの社内リソースアクセス: 拠点サーバーにWireGuardを立ててVPN経路を確立すれば、自宅からでも社内ファイルサーバーやバックオフィスシステムにアクセスできる
・拠点間接続: 2つの拠点のルーターまたはLinuxサーバーにWireGuardを設定し、拠点間をセキュアに接続
・クラウドサーバーへの安全な管理経路: VPSやEC2インスタンスをWireGuard VPN内に配置し、管理用SSHをVPN内のIPアドレスからのみ許可する設定でセキュリティを強化
クラウドサーバーのネットワーク設計やセキュリティグループの設定については、姉妹サイトクラウドマスターズ.TOKYOの記事も参照してください。
よくある誤解と注意点
【注意1】鍵ファイルの管理が最重要
WireGuardのセキュリティは秘密鍵の管理に依存します。秘密鍵がファイルに保存されるため、ファイルシステムのアクセス権限の設定ミスや、鍵ファイルをGitリポジトリにコミットしてしまう事故に注意が必要です。
# 鍵ファイルの権限は必ず600(root読み取り専用)にする sudo chmod 600 /etc/wireguard/*.conf sudo chmod 600 /etc/wireguard/server_private.key # .gitignoreに鍵ファイルを明示的に除外 echo "*.key" >> .gitignore echo "wg0.conf" >> .gitignore
【注意2】ファイアウォールのポート開放を忘れない
WireGuardはUDPを使います。サーバー側のファイアウォール(iptables・firewalld・クラウドのセキュリティグループ等)で、ListenPortに設定したUDPポートを開放しておく必要があります。
# UFW(Ubuntu)の場合 sudo ufw allow 51820/udp # firewalld(RHEL/CentOS系)の場合 sudo firewall-cmd --permanent --add-port=51820/udp sudo firewall-cmd --reload
【注意3】ログ機能が最小限
WireGuardは設計上、ログを極力残さない(プライバシー重視)仕様です。接続ごとの詳細なログが必要な企業環境では、別途ネットワーク監視ツールと組み合わせる必要があります。
【注意4】ピアの削除はファイルを編集してから再起動が必要
退職者など不要になったピア(クライアント)を削除する場合、設定ファイルから該当の `[Peer]` セクションを削除した後、インターフェースを再起動します。
# 設定ファイルを編集して対象[Peer]セクションを削除後 sudo wg-quick down wg0 && sudo wg-quick up wg0 # または動的に削除(再起動不要) sudo wg set wg0 peer <削除するピアの公開鍵> remove
本記事のまとめ
WireGuardは、シンプルな設計・高速な動作・強固な暗号化の3点を両立した現代的なVPNプロトコルです。OpenVPNやIPsecと比較してコードが少なく、設定ファイルもわかりやすいため、情シス担当者でも運用しやすい選択肢です。
| ポイント | 内容 |
|---|---|
| インストール | apt install wireguard(Ubuntu/Debian)でワンコマンド |
| 鍵生成 | wg genkey | wg pubkey で秘密鍵・公開鍵を生成 |
| 設定ファイル | INI形式。[Interface]と[Peer]の2ブロックで完結 |
| 起動・自動起動 | wg-quick up wg0 / systemctl enable wg-quick@wg0 |
| セキュリティ上の注意 | 秘密鍵のパーミッション(600)とファイアウォール設定 |
次のステップとして、複数クライアントの一括管理にはWireGuard UIやwg-dashboard(Web管理画面)の導入も検討してみてください。VPNを土台として、SSH接続を VPN内IPからのみ許可する設定を加えることで、サーバーへの攻撃面をさらに絞り込むことができます。
VPN構築の次は「ゼロトラスト設計」へ進みませんか?
WireGuardでVPNを構築しても、認証の仕組みや通信制御がなければ内部の安全は保証されません。
正しいセキュリティ知識を体系的に身につけたい方へ、メルマガで実践的なセキュリティ対策ノウハウをお届けしています。
