VPN を「繋ぐ」のは、もうやめた — WireGuard のオンデマンド接続で、外出先から家のサーバーが LAN と同じ感覚になる話

「VPN」と聞くと、繋ぐと遅い、電池が減る、繋ぎ忘れて家のサーバーに届かない、といった面倒を思い浮かべる人が多いでしょう。しかし、それは 2010 年代までの話です。WireGuard(公式サイト)の登場で、VPN は「入れたことを忘れるもの」に変わりました。この記事では自宅のラズパイを例に、WireGuard が何者かと、外出先からの SSH とファイル共有がどれだけ楽になるかを手順つきで紹介します。

WireGuard とは何か — どれくらい使われているか

WireGuard は、2015 年頃に Jason Donenfeld 氏が作り始めた VPN プロトコルとその実装です。そして 2020 年 3 月、Linux カーネル 5.6 に正式に取り込まれました。VPN プロトコルがカーネル本体に入ったのは初めてで、Linus Torvalds 氏の「OpenVPN や IPsec の惨状と比べれば芸術作品だ」という評は今もよく引き合いに出されます。

そして今では、「VPN の裏側」として当たり前の存在になっています。

  • OS に入っている。 Linux と Android のカーネルに標準搭載され、Windows・macOS・iOS・Android の公式アプリも揃っています。
  • 商用 VPN の土台になっている。 Cloudflare WARP、Mullvad、NordLynx、Proton VPN が採用し、企業向けメッシュ VPN(Tailscale、NetBird)も WireGuard の上に作られています(Tailscale は別記事で解説)。
  • 家庭用ルーターにも入っている。 さらに、OpenWrt や多くのメーカー製ルーターが WireGuard サーバー機能を持っています。

つまり、自分で設定したことがなくても、スマートフォンの VPN アプリや会社のネットワークを通じて、すでに WireGuard の上を通信している可能性が高いのです。

WireGuard はなぜ優秀なのか — 技術的に何が革新的だったか

従来の VPN(IPsec、OpenVPN、L2TP)は 1990〜2000 年代初頭の設計で、長年の拡張で巨大になっていました。一方、WireGuard は「現代の暗号技術だけを使って、できるだけ小さく作り直す」方針で設計されています。

1. 小さい

Linux カーネル内の実装は約 4,000 行です。つまり、十数万行の OpenVPN や数十万行規模の IPsec の 100 分の 1 程度です。また、コードが小さいと人が読んで検証でき、バグが入る余地が減り、第三者の監査が現実的になります。

2. 暗号方式を固定し、交渉しない

IPsec や TLS を使う VPN は接続のたびに暗号方式を交渉し、それがダウングレード攻撃や設定ミスの原因でした。一方、WireGuard は Curve25519、ChaCha20-Poly1305、BLAKE2s を固定で使い、交渉がありません。そのため間違えようがなく、鍵交換の手順(Noise プロトコルフレームワーク)は形式的な検証で安全性が確認されています。

3. 「公開鍵が身元」という SSH と同じモデル

証明書の発行機関も、ユーザー名とパスワードもありません。端末ごとに鍵のペアを作り、相手の公開鍵を登録するだけです。そのため、SSH を使ったことがあれば同じ感覚で扱えます。

4. 接続という概念が無い

WireGuard は UDP の上で動き、「セッションを張る」「切る」という状態を持ちません。だから、Wi-Fi から携帯回線に切り替わっても通信は途切れません(ローミング)。また、使っていない間はパケットを出さず、電池も CPU も使いません。この「無音で待てる」性質が、後述するオンデマンド接続の土台です。

5. 速い — 「VPN を繋ぐと遅くなる」は昔の話

カーネルの中で動き、処理が単純で、暗号方式が現代の CPU に向いています。そのため、同じ機器なら OpenVPN や IPsec より高速で低遅延で、ラズパイ 5 でも家庭の回線速度をそのまま出せます。つまり VPN が遅かったのは、重い実装と古い暗号方式、全通信を 1 台に集める構成のせいでした。

WireGuard はどのように広まったか

  1. 2016〜2018 年: 技術者の間で評判になる。 まず、設計論文と小さなコードが公開され、暗号の専門家とカーネル開発者から高く評価されます。
  2. 2019〜2020 年: 主要 OS が取り込む。 次に、Linux カーネル 5.6 に入り、同時期に iOS/macOS/Android/Windows の公式アプリが整います。
  3. 2020 年以降: 商用サービスが土台に採用。 Cloudflare WARP、Mullvad、NordLynx、Tailscale が採用します。その結果、「新しく VPN を作るなら WireGuard から」が既定になります。
  4. 2023 年以降: 従来型 VPN 装置の脆弱性が立て続けに悪用される。 その結果、「巨大で古い実装を公開面に置く」ことが見直されました。小さく検証できる実装への移行が、企業側でも進んでいます。

WireGuard のオンデマンド接続 — 実際に何が便利なのか

ここからが本題です。家のラズパイで写真の保管や録画、ファイル共有をしている人は多いでしょう。外出先から触りたい。しかし、サーバーを公開するのは怖い。そして VPN は、繋ぎっぱなしも繋ぎ忘れも嫌だ。

WireGuard のオンデマンド接続は、この悩みを「設定したら忘れる」形で解決します。そして、仕組みは次の二つの要素でできています。

WireGuard のオンデマンド接続の仕組み:家の Wi-Fi では VPN が自動で切れ、外では自動で繋がる
図 1:家の Wi-Fi では VPN が勝手に切れ、離れると勝手に繋がる。使う人は VPN の存在を意識しない

要素 1: 分割トンネル(AllowedIPs)

WireGuard の設定の AllowedIPs は、「どの宛先への通信をトンネルに乗せるか」を決めます。ここに家のサーバーのアドレスだけを書けば、家宛ての通信だけが VPN を通ります。一方、Web・SNS・動画は今までどおり直接流れます。そのため、繋ぎっぱなしでも何も遅くなりません。

要素 2: OS のオンデマンド機能

iPhone、iPad、Mac の WireGuard アプリには「オンデマンド接続」があります。例えば「携帯回線なら常に接続」「Wi-Fi は家の SSID 以外なら接続」と指定でき、家を出た瞬間に VPN が上がり、家の Wi-Fi に繋がった瞬間に落ちます。

そして要素 1 のおかげで、繋がっていることのコストがありません。使っていない間は無音なので、電池も減りません。結果として、外出先でも家の中でも、同じアドレス・同じコマンドで家のサーバーに届く状態になります。

SSH とファイル共有が、こう変わる

WireGuard の分割トンネル:AllowedIPs で家宛ての通信だけをトンネルに通し、それ以外は直接インターネットへ
図 2:AllowedIPs に家のサーバーだけを書く分割トンネル。家宛てだけが VPN を通り、それ以外は直接流れる
  • SSH。 ssh pi と打つだけで、家でも外でも同じです。踏み台もポート転送も動的 DNS の確認も要りません。また、SSH のポートを公開していないので、総当たりも届きません。
  • Samba(ファイル共有)。 Mac の Finder で smb://192.168.1.10、iPhone の「ファイル」アプリでも同じです。例えば、外出先のカフェから家の写真フォルダを開き、動画をそのまま再生できます。
  • 家の中では速度が落ちない。 家の Wi-Fi では VPN が自動で切れています。そのため、ファイル共有も録画の視聴も LAN の速度そのままです。

WireGuard の導入手順 — ラズパイをサーバーに、iPhone と Mac をクライアントに

以下は Raspberry Pi OS(Debian 系)での手順です。なお、鍵や IP アドレスは例なので、自分の値に置き換えてください。

1. サーバー側(ラズパイ)に WireGuard を入れて鍵を作る

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

# サーバーの鍵ペア
umask 077
wg genkey | sudo tee /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub

# クライアント(iPhone)の鍵ペアと、事前共有鍵(第 2 の鍵。量子計算機への備えと多層防御)
wg genkey | sudo tee /etc/wireguard/iphone.key | wg pubkey | sudo tee /etc/wireguard/iphone.pub
wg genpsk | sudo tee /etc/wireguard/iphone.psk

2. サーバーの設定ファイル

次に、/etc/wireguard/wg0.conf を作ります。VPN の中のアドレスは、家の LAN(例: 192.168.1.0/24)とかぶらない範囲(例: 10.8.0.0/24)を選びます。

[Interface]
PrivateKey = (server.key の中身)
Address = 10.8.0.1/24
ListenPort = 51820

### iphone ###
[Peer]
PublicKey = (iphone.pub の中身)
PresharedKey = (iphone.psk の中身)
AllowedIPs = 10.8.0.2/32
sudo systemctl enable --now wg-quick@wg0
sudo wg show        # インターフェースとピアが表示されれば起動している

3. 入口を開ける

外から届くように、ルーターで「UDP 51820 をラズパイへ転送」し、さらにラズパイの ufw で同じポートを許可します。開けるのはこの UDP 1 つだけです。また、WireGuard は正しい鍵を持たない相手には一切応答しないので、ポートスキャンでも「閉じている」ようにしか見えません。

sudo ufw allow 51820/udp comment 'WireGuard'

なお、自宅の IP アドレスが固定でなければ、動的 DNS で名前を付けておくと、クライアント側の設定を変えずに済みます。

4. クライアントの設定ファイル

そして、ここが肝心な部分です。AllowedIPs に家のサーバーのアドレスだけを書きます。これが分割トンネルで、普段の通信を VPN に乗せないための「1 行」です。

# iphone.conf(ラズパイ上で作って、QR コードで渡す)
[Interface]
PrivateKey = (iphone.key の中身)
Address = 10.8.0.2/32

[Peer]
PublicKey = (server.pub の中身)
PresharedKey = (iphone.psk の中身)
Endpoint = home.example.com:51820
AllowedIPs = 192.168.1.10/32, 10.8.0.0/24   # ← 家のサーバー宛てだけトンネルへ。この 1 行が分割トンネル
PersistentKeepalive = 25

家の LAN 全体(ルーターの管理画面など)にも届かせたい場合は、AllowedIPs に 192.168.1.0/24 を足します。そして、ラズパイ側で IP 転送と NAT を有効にします。ただし、まずはサーバー 1 台分で始めるのが簡単です。

qrencode -t ansiutf8 < iphone.conf    # 端末に表示された QR を iPhone の WireGuard アプリで読む

5. オンデマンドをオンにする

次に、iPhone の WireGuard アプリで取り込んだトンネルを開き、「オンデマンド接続」を有効にして、次のように設定します。

  • まず、携帯回線: 接続する
  • 次に、Wi-Fi: 接続する。ただし「除外する SSID」に家の Wi-Fi 名を入れる

以上です。足したのは AllowedIPs の 1 行とアプリのスイッチ 1 つ。これで、家を出れば勝手に繋がり、帰れば勝手に切れる VPN ができました。Mac も同じ手順で(鍵は別に作る)、アプリのオンデマンド設定にも同じ項目があります。

6. 確認する

# 外出先(携帯回線)で、iPhone のターミナルアプリや Mac から
ssh pi@192.168.1.10        # 家にいるときと同じコマンドで入れる

# ラズパイ側で、ピアと最後の握手の時刻を見る
sudo wg show wg0 latest-handshakes

最後に、Finder の「サーバへ接続」に smb://192.168.1.10 と入れれば、外出先から家のファイル共有が開きます。アプリの切り替えも、VPN のボタンを押す操作もありません。

WireGuard の運用で気をつけること

  • 鍵は端末ごとに。 1 つの設定を使い回さず、端末ごとに鍵と事前共有鍵を作ります。また、端末をなくしたら、サーバー設定からその [Peer] を消すだけで締め出せます。
  • サーバーにクライアントの秘密鍵を残さない。 QR で渡したら、ラズパイ上の iphone.key は消します。なお、残しておく理由はありません。
  • Android と Windows は少し事情が違う。 公式アプリにオンデマンド設定が無いので、常時オンが現実的です。ただし、分割トンネルのおかげで常時オンでも困りません。
  • 家の中からもトンネル経由にしたいときは。 除外 SSID を外せば家でも VPN 経由になります。遅くなる理由はないので、それも選べます。

まとめ

WireGuard は、小さく、速く、設計が検証済みで、OS に標準で入っている VPN です。「VPN を繋ぐと遅くなる」のは、古い実装と構成の話でした。分割トンネルの 1 行と OS のオンデマンド機能を組み合わせれば、外出先からの SSH もファイル共有も、家と同じ宛先・同じ操作で届きます。そして、サーバーを公開する必要もなくなります。ラズパイ 1 台と 30 分で試せます。

Author

新規CTA