UbuntuでWireGuard VPNサーバーを構築・設定する手順:高速な仮想プライベートネットワークの構築

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

なぜOpenVPNからWireGuardへの移行が進んでいるのか?

OpenVPNやIPsecは長年にわたりネットワーク管理者に重用されてきました。しかし、数十万行におよぶ肥大化したコードベース、高いCPU負荷、大きなレイテンシといった構造的な課題を抱えています。Wi-Fiから4G/5G回線へ切り替える際、OpenVPNではハンドシェイクと再接続に10〜20秒ほど待たされることも珍しくありません。

WireGuardはこの問題を根本から解決します。コードベースはわずか4,000行足らずで、Linuxカーネル 5.6以降に標準統合されています。実際のベンチマークでも、WireGuardはOpenVPNの3〜4倍のスループットを記録し、スマートフォンのバッテリー消費を約30%削減します。1 vCPU / 1GB RAM程度のUbuntu 22.04または24.04 VPSがあれば、10分足らずでセットアップを完了できます。

基本概念:WireGuardはどのように動作するのか?

動作原理を理解しておくことで、ネットワークトラブル発生時にも迅速に対処できるようになります。

  • Cryptokey Routingモデル: WireGuardはすべてのデバイスを対等なPeerとして扱います。SSHの鍵認証と同様に、各ノードが公開鍵・秘密鍵のペアを保持します。サーバーは公開鍵に直接紐づけてパケットのルーティングと復号を行うため、煩雑なTLSハンドシェイク処理が不要になります。
  • Kernel Spaceでの直接動作: OpenVPNのTUN/TAP機構のようにUser SpaceとKernel Space間でデータを頻繁にコピーする必要がありません。これによりレイテンシが極限まで削減され、回線帯域のパフォーマンスを最大限に引き出せます。
  • ステートレス設計(Stateless): 送信すべきデータがない場合、WireGuardは無駄なキープアライブパケットを送信しません。そのため、インターネット側からのランダムなポートスキャンに対してもサーバーは完全に沈黙(ステルス状態)を保ちます。

実践ガイド:UbuntuでのWireGuardインストールと設定手順

ステップ1:IPフォワーディング(パケット転送)の有効化

デフォルト状態のLinuxでは、ネットワークインターフェース間のパケット転送が無効化されています。VPSをインターネット通信のルーターとして機能させるため、この設定を有効にします。

sudo sed -i -e '$a\net.ipv4.ip_forward = 1' /etc/sysctl.conf
sudo sed -i -e '$a\net.ipv6.conf.all.forwarding = 1' /etc/sysctl.conf
sudo sysctl -p

実行結果として net.ipv4.ip_forward = 1 が返ってくれば、設定は正常に反映されています。

ステップ2:パッケージのインストールとサーバー用鍵ペアの生成

WireGuard本体と、モバイル端末設定用のQRコード生成ツールをインストールします。

sudo apt update && sudo apt install -y wireguard qrencode

作業ディレクトリを作成し、適切なパーミッションを設定した上でサーバー用の秘密鍵・公開鍵を生成します。

cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key

鍵の内容は cat server_private.key コマンドで確認できます。秘密鍵(Private Key)は厳重に管理し、外部に漏洩しないよう注意してください。

ステップ3:ネットワークインターフェースの確認とサーバー設定ファイルの作成

インターネットに接続されているメインのネットワークインターフェース名を以下のコマンドで確認します。

ip -br link

通常は eth0、ens3、enp1s0 などの名前が表示されます。後述の iptables ファイアウォール設定でこのインターフェース名を使用します。

サーバー設定ファイル /etc/wireguard/wg0.conf を作成します。

sudo nano /etc/wireguard/wg0.conf

以下の内容を貼り付けます(秘密鍵およびインターフェース名は環境に合わせて書き換えてください)。

[Interface]
Address = 10.8.0.1/24, fd42:42:42::1/64
ListenPort = 51820
PrivateKey = <server_private.keyファイルの内容>
SaveConfig = false

# VPN起動時にNATを有効化し、停止時にNATルールを削除(eth0は実際のインターフェース名に変更)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

ステップ4:ファイアウォールの設定とサービスの起動

UFWファイアウォールでUDP 51820番ポートを開放し、systemd経由でWireGuardを起動します。

sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
sudo ufw enable

# WireGuardの自動起動を有効化して起動
sudo systemctl enable --now wg-quick@wg0

サーバーの稼働状態を確認します。

sudo wg show

ターミナルに wg0 インターフェース、ポート 51820、公開鍵情報が表示されていれば、接続待機状態になっています。

ステップ5:クライアント用設定ファイルとQRコードの生成

1台目のクライアント端末(例:client1)用の鍵ペアを生成します。

cd /etc/wireguard
wg genkey | tee client1_private.key | wg pubkey > client1_public.key

サーバー設定ファイル /etc/wireguard/wg0.conf の末尾にクライアント情報を追加します。

[Peer]
PublicKey = <client1_public.keyファイルの内容>
AllowedIPs = 10.8.0.2/32, fd42:42:42::2/128

サービスを再起動せずにサーバー設定を反映します。

sudo wg addconf wg0 <(sudo wg-quick strip wg0)

次に、クライアント側で使用する設定ファイル client1.conf を作成します。

[Interface]
PrivateKey = <client1_private.keyファイルの内容>
Address = 10.8.0.2/24, fd42:42:42::2/64
DNS = 1.1.1.1, 8.8.8.8

[Peer]
PublicKey = <server_public.keyファイルの内容>
Endpoint = <サーバーのパブリックIP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

スマートフォンに設定を取り込む場合は、ターミナル上にQRコードを出力し、WireGuardアプリでスキャンします。

qrencode -t ansiutf8 < client1.conf

WireGuard運用のための実践Tips

1. MTU調整による通信の詰まり・パケットドロップ解消

Pingは通るのに特定の大手Webサイトの読み込みが止まる、または極端に遅い場合、カプセル化オーバーヘッドによるMTU超過(パケット断片化)が疑われます。クライアント設定でMTUを明示的に指定して下げてみてください。

[Interface]
MTU = 1360

1360〜1420程度のMTU値に設定すると、多くの光回線や4G/5Gモバイルネットワーク環境で安定した通信が可能です。

2. PersistentKeepaliveによるNATタイムアウト・切断防止

Wi-Fiルーターやモバイル回線のCGNAT環境では、無通信状態が約30秒続くとNATテーブルのエントリが破棄されることがあります。クライアント設定の [Peer] セクションに PersistentKeepalive = 25 を指定することで、25秒ごとに微小なパケットを送信してNATセッションを維持し、プッシュ通知の受信遅延や切断を防ぐことができます。

3. フルタネル(Full Tunnel)とスプリットトンネル(Split Tunnel)の使い分け

利用用途に応じてクライアント設定の AllowedIPs を調整します。

  • フルタネル(AllowedIPs = 0.0.0.0/0, ::/0): Webブラウジングやファイルダウンロードを含む全通信がVPSを経由します。カフェやホテルのフリーWi-Fiを利用する際のセキュリティ確保に必須の設定です。
  • スプリットトンネル(AllowedIPs = 10.8.0.0/24): 社内・自宅サーバーなどのプライベートIP宛て通信のみをVPN経由にし、通常のWeb閲覧は元のインターネット回線を直接使用します。VPSの帯域消費を抑え、高速なブラウジングを維持できます。

まとめ

WireGuardは、安全なVPNソリューションが必ずしも複雑で重厚である必要はないことを証明しています。鍵の生成とiptablesによるわずかなルーティング設定だけで、高速かつセキュアな暗号化トンネルが手に入ります。MTUやKeepaliveの適切な初期設定を行い、快適なVPN環境を構築しましょう。

Share: