自分で運用する WireGuard VPN は、ノートパソコンやスマートフォンから、自分が管理するサーバーへの暗号化された経路を提供します。固定の出口 IP が欲しいとき、信頼できない Wi-Fi で安全に接続したいとき、別のネットワークへの専用経路が必要なときに役立ちます。ただし匿名になるわけではありません。Web サイトからは相変わらず 1 つの VPS アドレスが見えますし、ホスティング事業者は依然として基盤ネットワークを運用しています。
このガイドでは Ubuntu Server 上に IPv4 のフルトンネル VPN を構築します。WireGuard をインストールし、権限を絞って鍵を生成し、ルーティングを有効化し、ファイアウォールと NAT のルールを追加し、デスクトップとモバイルのクライアントを接続して、トンネルを検証します。同じ構成で IPv6 にも対応できますが、それは VPS にルーティング済みの IPv6 アドレス空間があり、IPv6 のフォワーディングとファイアウォールルールを別途設定したあとに限られます。
WireGuard とは?
WireGuard は、暗号化された IP パケットを UDP で運ぶ、モダンでクロスプラットフォームな VPN プロトコルとその実装です。 WireGuard プロトコル仕様 は、ChaCha20-Poly1305、Curve25519、BLAKE2s、SipHash24、HKDF といった暗号プリミティブを固定で定めています。意図的に小さく保たれたこの設計により、交換可能な暗号スイートを多数抱えるプロトコルよりも、設定と監査が簡単になります。
WireGuard には中央のアカウント管理も、組み込みのユーザーディレクトリもありません。各デバイスは、それぞれ独自の鍵ペア、トンネルアドレス、AllowedIPs のルールを持つピアです。VPS では通常、1 つのピアがインターネットに面したゲートウェイとして動作し、ノートパソコンやスマートフォンがそこへ接続を開始します。
なぜ VPS で WireGuard を使うのか?
- シンプルなピアモデル: 各デバイスに鍵ペアが 1 組、ピア設定が 1 つずつ割り当てられます。
- 小さい攻撃対象領域: WireGuard は、古い選択肢を大量に並べるのではなく、コンパクトなプロトコルと固定の暗号スイートを採用しています。
- 高い性能: Linux のカーネル統合と効率的な暗号処理により高いスループットが得られますが、実際の結果は CPU、ネットワーク帯域、遅延、パケットサイズに左右されます。
- クロスプラットフォーム対応クライアント: Windows 10 と 11、macOS、Android、iOS には公式クライアントが用意されており、Linux や複数の BSD 系システムにはネイティブのツールやパッケージがあります。
- ローミング: ピアはネットワークや送信元 IP アドレスが変わっても、新しい WireGuard の識別情報を受け取る必要はありません。サーバー側が、認証済みの最新エンドポイントを学習します。
- 明確なルーティング制御: AllowedIPs は、どの宛先がトンネルを通るかと、どのトンネルアドレスがどのピアに属するかの両方を決めます。
関連記事: Cloudzy の VPN 向け VPS ガイド。より古い構成については、 Cloudzy の PPTP 設定ガイド。セキュリティが重要な新規 VPN に PPTP を選んではいけません。
手動構築は不要:ワンクリックの WireGuard
技術的な知識がない場合や、自分で構築したくない場合は、Cloudzy のワンクリック WireGuard VPN デプロイが使えます。このガイドの残りは手動構築を扱い、本セクションはその近道を扱います。
- Cloudzy のコントロールパネルにログインします。
- アプリケーション一覧から WireGuard を選びます。
- 希望するリージョンで、好みのプランの VPS を作成します。基本的なスペックの Ubuntu マシンで十分です。
VPS の準備ができたらログインし、次のコマンドを実行して設定内容を表示します。
cat client.conf
以下のような出力が表示されます
この設定を使って PC の WireGuard クライアントに新しいトンネルを作れば、接続は完了です。すべての仕組みを理解したい場合や、ワンクリックイメージでは対応できない構成が必要な場合は、以下の手動構築に進んでください。
Ubuntu に WireGuard を構築する方法
以下のコマンドは現行の Ubuntu Server リリースを前提としています。sudo 権限を持つユーザーで SSH 経由で実行してください。ファイアウォールの動作を確認するまで SSH セッションは閉じないでください。プロバイダーが対応していれば、事前に VPS のスナップショットを取っておきましょう。
前提条件
- パブリック IPv4 アドレスを持つ Ubuntu VPS 1 台
- sudo を使える root 以外のアカウント
- SSH アクセスと、VPS 事業者のレスキューコンソールの情報
- 公式 WireGuard アプリまたはコマンドラインツールを備えたクライアント端末 1 台
2 台目の Ubuntu サーバーは不要です。クライアントは Windows PC、Mac、Linux ノート、Android スマートフォン、iPhone のいずれでも構いません。
ステップ 1:WireGuard をインストールする
sudo apt update
sudo apt install wireguard -y
ツールが使える状態か確認します。
wg --version
ステップ 2:サーバーの鍵を安全に生成する
WireGuard のディレクトリを作成し、厳しい umask のもとで鍵ペアを生成します。秘密鍵は決してクライアントにコピーしたり、ログに残したりしてはいけません。
sudo install -d -m 700 /etc/wireguard
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server.key; wg pubkey < /etc/wireguard/server.key > /etc/wireguard/server.pub'
設定ファイルに貼り付ける必要があるときに、鍵を表示します。
sudo cat /etc/wireguard/server.key
sudo cat /etc/wireguard/server.pub
ステップ 3:サーバー設定を作成する
インターフェースの設定ファイルを開きます。
sudo nano /etc/wireguard/wg0.conf
次のブロックを貼り付け、SERVER_PRIVATE_KEY を前のステップで生成した秘密鍵に置き換えます。
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
トンネル用ネットワークの 10.8.0.0/24 はあくまで一例です。到達する必要のある自宅・オフィス・クラウドのネットワークと重複する場合は、別のプライベート範囲を選んでください。SaveConfig = true は追加しないでください。インターフェース停止時にファイルが書き換えられ、手作業の変更が消えることがあります。
sudo chmod 600 /etc/wireguard/wg0.conf
ステップ 4:IPv4 フォワーディングを有効にする
VPS は wg0 とパブリックネットワークインターフェースの間でパケットをルーティングする必要があります。この設定は専用の sysctl ファイルに記述します。
sudo nano /etc/sysctl.d/70-wireguard-routing.conf
net.ipv4.ip_forward = 1
適用して確認します。
sudo sysctl -p /etc/sysctl.d/70-wireguard-routing.conf
sysctl net.ipv4.ip_forward
これは、 Ubuntu の WireGuard ゲートウェイガイド。IPv6 には、ルーティング済みの IPv6 プレフィックス、専用のトンネルアドレス、IPv6 のフォワーディング、IPv6 用ファイアウォールルールが必要です。その経路が整うまで、クライアントのトラフィックを ::/0 に向けてはいけません。
ステップ 5:ファイアウォールと NAT のルールを追加する
VPS のパブリックインターフェース名を調べます。以下の出力では dev の後ろの値に注目してください。よくある名前は eth0、ens3、enp1s0 です。
ip route show default
wg0.conf を再度開き、[Interface] の下に次の行を追加します。パブリックインターフェース名が異なる場合は、すべての eth0 を置き換えてください。
PostUp = iptables -I FORWARD 1 -i %i -o eth0 -j ACCEPT; iptables -I FORWARD 1 -i eth0 -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
PreDown = iptables -D FORWARD -i %i -o eth0 -j ACCEPT; iptables -D FORWARD -i eth0 -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
UFW が有効な場合は、状態を変更する前にまず SSH を許可し、そのうえで WireGuard の UDP ポートを開きます。
sudo ufw allow OpenSSH
sudo ufw allow 51820/udp
sudo ufw status
現在 UFW が無効で、それを有効にしたい場合は、まず OpenSSH のルールが存在することを確認してください。これらのルールを適用するためだけに、SSH 越しに UFW を無効化して再度有効化するのはやめましょう。避けられるはずの締め出しリスクを招きます。
ステップ 6:WireGuard インターフェースを起動する
sudo systemctl enable --now wg-quick@wg0
sudo systemctl status wg-quick@wg0 --no-pager
sudo wg show
サービスが起動に失敗した場合は、ほかを触る前にまず journalctl を実行します。
sudo journalctl -u wg-quick@wg0 -n 50 --no-pager
WireGuard クライアントを追加する
すべてのデバイスに固有の鍵ペアとトンネル用 IP が必要です。1 つのクライアント設定を 2 台のデバイスで使い回してはいけません。鍵とアドレスが重複するとルーティングが予測不能になり、片方だけをきれいに失効させることもできなくなります。
ステップ 1:クライアントの鍵を生成する
公式のデスクトップアプリとモバイルアプリは、空のトンネルを作成する際に鍵を生成できます。Linux クライアントでは次を使います。
umask 077
wg genkey | tee client.key | wg pubkey > client.pub
client.key はそのデバイスに置いたままにします。サーバーへコピーするのは client.pub だけです。
ステップ 2:サーバー側にピアを追加する
sudo nano /etc/wireguard/wg0.conf
ピアのブロックを 1 つ追記します。CLIENT_PUBLIC_KEY はクライアントの公開鍵に置き換えてください。
[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.8.0.2/32
Address = 10.8.0.2/32 の行は、クライアント側のトンネルアドレスを割り当てます。一方、サーバーの [Peer] ブロックにある AllowedIPs = 10.8.0.2/32 は、ルーティングと送信元検証のために、そのアドレスをこのピアに結び付けます。次のデバイスには 10.8.0.3/32 を使い、以降は重複しないよう順に増やしていきます。
sudo systemctl restart wg-quick@wg0
ステップ 3:クライアント設定を作成する
クライアント側で client.conf を作成し、プレースホルダーをすべて置き換えます。
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.8.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = VPS_PUBLIC_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
AllowedIPs = 0.0.0.0/0 と書くと IPv4 のフルトンネルになります。VPN のネットワークだけにアクセスしたい場合は AllowedIPs = 10.8.0.0/24 を使います。PersistentKeepalive は、NAT の内側にあり、アイドル時もマッピングを到達可能に保つ必要があるクライアントで役立ちます。 WireGuard クイックスタートガイド クイックスタートガイドでは、ほとんどのピアには不要だと述べられています。
ステップ 4:設定をインポートする
使用してください WireGuard クライアントのインストールガイド を参照して、お使いのプラットフォームに対応したクライアントを入手してください。
- Windows: Add Tunnel を選び、client.conf をインポートします。
- macOS: Import tunnel(s) from file を選び、client.conf を指定します。
- Android または iOS: ファイルをインポートするか、そこから生成した QR コードを読み取ります。
client.conf を置いてある Ubuntu または Debian のクライアントで qrencode をインストールし、そのクライアントのターミナルにファイルを表示します。
sudo apt install qrencode -y
qrencode -t ansiutf8 < client.conf
QR コードにはクライアントの秘密鍵が含まれています。信頼できるターミナルでのみ表示し、スクリーンショットは保存せず、スマートフォンへの取り込みが終わったらターミナルをクリアしてください。
ステップ 5:トンネルを検証する
トンネルを有効にし、クライアントからトラフィックを発生させたうえで、VPS 上で次の確認を実行します。
sudo wg show
ip -brief address show wg0
直近のハンドシェイクと増加する転送カウンターがあれば、WireGuard がパケットをやり取りできている証拠です。続いて、クライアント側からフルトンネルの出口を確認します。
curl -4 https://api.ipify.org; echo
このコマンドは VPS のパブリック IPv4 アドレスを返すはずです。ハンドシェイクが成立しない場合は、エンドポイントのアドレス、UDP ポート、クラウド側のファイアウォール、UFW のルール、鍵を確認します。ハンドシェイクはできるのにインターネットに出られない場合は、IP フォワーディング、パブリックインターフェース名、NAT ルール、DNS を確認してください。
WireGuard を Nginx の背後に置けるのか?
リモートの NGINX の stream モジュールのドキュメント では、NGINX がある UDP ポートから別のポートへ中継できる仕組みが説明されています。つまり UDP/80 や UDP/443 を UDP/51820 で待ち受ける WireGuard へ転送できます。ただしこれは UDP の中継であって、HTTP のリバースプロキシではありません。WireGuard が TCP や HTTPS になるわけではなく、通信が通常の Web トラフィックのように見えるようになるわけでもありません。
ほとんどの構成では、NGINX を追加するより、WireGuard の ListenPort を変更して対応する UDP ポートを開けるほうが簡単です。ネットワークが UDP を完全に遮断していたり、ディープパケットインスペクションを使っていたりする場合、NGINX の UDP 中継では解決できません。 WireGuard の既知の制限に関するドキュメント には、難読化はこのプロトコルの対象範囲外だと明記されています。
VPS を自宅ネットワークにつなぐ
VPS は、外出先のクライアントと自宅内の機器をつなぐハブとして機能します。自宅側のピアが VPS へ向けて外向きの WireGuard 接続を張るため、自宅にグローバル IP は不要です。その自宅側ピアが NAT の内側にある場合は、PersistentKeepalive を設定してください。
自宅 LAN 全体に到達するには、ピアを 1 つ追加するだけでは足りません。VPS 側にある自宅ゲートウェイ用のピア設定では、AllowedIPs に 192.168.1.0/24 のような自宅サブネットを含める必要があります。フルトンネル(AllowedIPs = 0.0.0.0/0)を使うリモートクライアントは、その自宅サブネット宛の通信をすでに VPS 経由で送っています。クライアント側に 192.168.1.0/24 を追加するのは、スプリットトンネルを使う場合だけです。さらに自宅ゲートウェイ側でも、WireGuard と LAN の間で通信を転送する必要があります。自宅ルーターに経路を追加するか、自宅ゲートウェイに範囲を絞った NAT ルールを追加してください。まずアドレスの重複を確認しましょう。別の 192.168.1.0/24 ネットワークに接続しているクライアントは、アドレスを振り直すか、より高度なポリシールーティングを使わない限り、両方のネットワークをきれいにルーティングできません。
自前の WireGuard と商用 VPN の比較
自前で運用しても、変わるのは VPN を誰が運営するかであって、匿名性が自動的に高まるわけではありません。個人の VPS では出口 IP が 1 つに固定されるため、ホスティング事業者のネットワークと結び付けられやすくなります。商用サービスは通常、共有の出口アドレスと手軽な地域切り替えを提供しますが、その代わり事業者のポリシーや運用体制、公開されている第三者監査に頼ることになります。
WireGuard 自体は軽量で、1 人がデバイスを数台使う程度なら、小さめの VPS が妥当な出発点になることが多いです。RAM や vCPU の数値をスループットの保証と考えてはいけません。実際のデバイス台数、利用リージョン、パケットサイズ、想定帯域でテストし、CPU の飽和やパケットロス、遅延がボトルネックになった時点でサイズを見直しましょう。
固定の自分専用の出口 IP、リモートアクセス、サーバーの制御権が、拠点の選択肢や手軽さより重要なら、自前で運用しましょう。多くの国、共有の出口、幅広いコンシューマー端末への対応、そして障害対応を任せられる相手が欲しいなら、商用 VPN を選びましょう。
| 判断のポイント | 自前の WireGuard | 商用VPN |
|---|---|---|
| コストモデル | サーバー 1 台と、自分の管理工数 | サブスクリプション。長期契約で割引されることが多い |
| 出口の拠点 | サーバー 1 台につき 1 拠点 | アプリ内で多数の拠点を選択可能 |
| セットアップ | 鍵、ルーティング、ファイアウォールルール、クライアントをすべて自分で設定 | アプリをインストールしてサインインするだけ |
| メンテナンス | パッチ適用、監視、バックアップ、障害対応をすべて自分で行う | サービスは事業者が運用 |
| プライバシーのあり方 | サーバーは自分で管理できるが、ホスティング事業者はメタデータを把握できる | 事業者のポリシーと、公開されている第三者監査に頼ることになる |
| 最適なプラン | 固定の専用出口 IP、リモートアクセス、インフラの制御権 | 拠点の切り替え、低い運用負荷、幅広い端末対応 |
結論
信頼できる WireGuard 構成は、結局のところ 5 点に集約されます。秘密鍵の保護、重複しないピアアドレス、正しい AllowedIPs、機能するフォワーディングと NAT、そして待ち受け UDP ポートを開けるファイアウォールルールです。トンネルを本番で使う前にハンドシェイクと公開出口アドレスの両方を確認し、構築後も VPS のパッチ適用を続けてください。
サーバーを手動で構築したい場合は、まっさらな Cloudzy Ubuntu VPS。インストール手順を省きたい場合は、 Cloudzy のワンクリック WireGuard デプロイ を使い、クライアント設定と検証にそのまま進みましょう。
よくある質問
WireGuard にピアは表示されるのにハンドシェイクが起きないのはなぜ?
ピアの項目があるのは、設定が読み込まれたことを示すにすぎません。ハンドシェイクがない場合、たいていはクライアントがサーバーに届いていないか、鍵が一致していません。クライアントの Endpoint、サーバーのグローバル IP、事業者側ファイアウォールと UFW の両方における UDP/51820、そして双方の公開鍵を確認してください。確認の前にクライアントからトラフィックを流しましょう。WireGuard はアイドル時には何も送りません。
トンネルはつながるのにインターネットに出られないのはなぜ?
ハンドシェイクはできるのにインターネットに出られない場合、原因はたいてい暗号化ではなくルーティングです。net.ipv4.ip_forward を確認し、NAT ルール内のパブリックインターフェース名が正しいか確かめ、FORWARD ルールを点検し、DNS は素の IP 疎通とは分けてテストします。あわせて、クライアントの AllowedIPs が意図したフルトンネル/スプリットトンネルの設計と一致しているかも確認してください。
すべてのクライアントに PersistentKeepalive は必要?
必要ありません。NAT の内側にあるピアが、アイドル中もマッピングを開いたままにしておく必要がある場合に追加します。スマートフォンや自宅ゲートウェイ、一部の制約が厳しいネットワークではよくあるケースです。ピアが頻繁に通信している場合や、アイドル中に相手側から到達される必要がない場合は、設定しなくて構いません。