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 はどのように広まったか
- 2016〜2018 年: 技術者の間で評判になる。 まず、設計論文と小さなコードが公開され、暗号の専門家とカーネル開発者から高く評価されます。
- 2019〜2020 年: 主要 OS が取り込む。 次に、Linux カーネル 5.6 に入り、同時期に iOS/macOS/Android/Windows の公式アプリが整います。
- 2020 年以降: 商用サービスが土台に採用。 Cloudflare WARP、Mullvad、NordLynx、Tailscale が採用します。その結果、「新しく VPN を作るなら WireGuard から」が既定になります。
- 2023 年以降: 従来型 VPN 装置の脆弱性が立て続けに悪用される。 その結果、「巨大で古い実装を公開面に置く」ことが見直されました。小さく検証できる実装への移行が、企業側でも進んでいます。
WireGuard のオンデマンド接続 — 実際に何が便利なのか
ここからが本題です。家のラズパイで写真の保管や録画、ファイル共有をしている人は多いでしょう。外出先から触りたい。しかし、サーバーを公開するのは怖い。そして VPN は、繋ぎっぱなしも繋ぎ忘れも嫌だ。
WireGuard のオンデマンド接続は、この悩みを「設定したら忘れる」形で解決します。そして、仕組みは次の二つの要素でできています。

要素 1: 分割トンネル(AllowedIPs)
WireGuard の設定の AllowedIPs は、「どの宛先への通信をトンネルに乗せるか」を決めます。ここに家のサーバーのアドレスだけを書けば、家宛ての通信だけが VPN を通ります。一方、Web・SNS・動画は今までどおり直接流れます。そのため、繋ぎっぱなしでも何も遅くなりません。
要素 2: OS のオンデマンド機能
iPhone、iPad、Mac の WireGuard アプリには「オンデマンド接続」があります。例えば「携帯回線なら常に接続」「Wi-Fi は家の SSID 以外なら接続」と指定でき、家を出た瞬間に VPN が上がり、家の Wi-Fi に繋がった瞬間に落ちます。
そして要素 1 のおかげで、繋がっていることのコストがありません。使っていない間は無音なので、電池も減りません。結果として、外出先でも家の中でも、同じアドレス・同じコマンドで家のサーバーに届く状態になります。
SSH とファイル共有が、こう変わる

- 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 分で試せます。
