VPSでWireGuardを構築する方法|UbuntuのVPN設定手順

Ubuntu VPSへWireGuardを導入し、鍵生成、IP転送、UFW、サーバー・クライアント設定、接続確認まで解説します。
WireGuardは、公開鍵と秘密鍵を使って端末間に暗号化トンネルを作るVPNです。VPSを入口にすれば、外出先から自宅・社内ネットワークへ接続したり、通信の出口をVPSへまとめたりできます。
ただし、VPNを作れば匿名になる、あらゆる通信が自動で保護される、というものではありません。VPS事業者から見える情報、接続ログ、DNS、利用規約を理解し、正当な用途で利用してください。
今回の構成
- VPS:Ubuntu Server、グローバルIPあり
- VPNインターフェース:
wg0 - VPN内ネットワーク:
10.10.10.0/24 - VPS側:
10.10.10.1 - クライアント側:
10.10.10.2 - UDP待受ポート:
51820
実際のNIC名、IP、ポートは環境へ合わせます。既存ネットワークと重複しないVPNアドレス帯を選んでください。
1. WireGuardをインストールする
sudo apt update
sudo apt install wireguard -yVPS管理画面のファイアウォールでUDP 51820を許可します。SSH用TCP 22を誤って閉じないでください。
2. サーバー鍵を生成する
sudo install -m 700 -d /etc/wireguard
umask 077
wg genkey | sudo tee /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub秘密鍵は他人へ渡さず、画面共有や記事へ載せません。設定ファイルも600相当の権限で保護します。
3. IP転送を有効にする
VPSをインターネットへのゲートウェイとして使う場合は転送を有効にします。
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard-forward.conf
sudo sysctl --system
sysctl net.ipv4.ip_forwardVPS内だけへ接続する構成では、目的に応じて転送範囲を最小化します。
4. サーバー設定を作る
まず外向きNIC名を確認します。
ip route show defaulteth0は実際のNIC名へ置き換え、PrivateKeyにはサーバー秘密鍵の内容を設定します。
[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = <SERVER_PRIVATE_KEY>
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
[Peer]
PublicKey = <CLIENT_PUBLIC_KEY>
AllowedIPs = 10.10.10.2/32sudo chmod 600 /etc/wireguard/wg0.confUFWを使う場合は、転送ポリシーとNATをUFWの方式へ統一するか、既存ルールとの関係を確認します。
5. クライアント鍵と設定を作る
クライアント端末で鍵を生成します。秘密鍵は端末外へ出しません。
umask 077
wg genkey | tee client.key | wg pubkey > client.pubクライアント設定例です。
[Interface]
Address = 10.10.10.2/24
PrivateKey = <CLIENT_PRIVATE_KEY>
DNS = 1.1.1.1
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = <VPSのIP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25すべてのIPv4通信をVPS経由にする例です。VPS内部だけへ接続するなら、AllowedIPsを10.10.10.0/24など必要な範囲へ絞ります。IPv6を経由させない構成では、IPv6通信が別経路になる可能性も確認してください。
6. WireGuardを起動する
sudo systemctl enable --now wg-quick@wg0
sudo systemctl status wg-quick@wg0
sudo wg show設定変更後、Peerの追加だけならreloadで済む場合がありますが、AddressやPostUpを変えた場合はrestartが必要です。
7. 接続を確認する
クライアントでVPNを有効にし、次を確認します。
10.10.10.1へ到達できるwg showのlatest handshakeが更新される- transferの送受信が増える
- 目的が全トンネルなら外部から見えるIPがVPSになる
- DNSの問い合わせ先が意図したものになる
鍵、Endpoint、UDPポート、AllowedIPs、IP転送、NATを順に確認します。
接続できないときの確認
sudo wg show
ip addr show wg0
ip route
sudo ss -ulnp | grep 51820
sudo journalctl -u wg-quick@wg0 -n 100ハンドシェイクがない
VPS側のUDP許可、Endpoint、公開鍵の組み合わせを確認します。TCPではなくUDPです。
ハンドシェイクはあるが通信できない
AllowedIPs、IP転送、NAT、ルーティングを確認します。AllowedIPsは送信時の経路選択と受信時の許可範囲の両方に関係します。
しばらくすると切れる
クライアントがNAT配下の場合、PersistentKeepalive = 25が役立つ場合があります。常に必要とは限らないため、問題がある側のPeerで使います。
セキュリティ上の注意
- 秘密鍵とQRコードを公開しない
- Peerごとに別の鍵を発行する
- 使わないPeerはサーバー設定から削除する
- AllowedIPsを必要最小限にする
- VPSのOSとWireGuardを更新する
- 設定ファイルを暗号化してバックアップする
- VPN内だから無条件に信頼せず、アプリ側の認証も残す
スマホ用QRコードには秘密鍵が含まれるため、スクリーンショットをクラウド写真へ自動保存しないよう注意します。
まとめ
VPS上のWireGuardは、鍵、VPN内IP、UDPポート、AllowedIPs、転送、NATを正しく組み合わせて構築します。接続時はwg showのハンドシェイクから確認すると切り分けやすくなります。公開前にVPSのセキュリティ初期設定も実施してください。