Raspberry Pi + WireGuardで作るお手軽VPNサーバー

電子工作の知識はあんまりないけど、興味本位で数年前に買ったラズパイがずっと箱の中で眠っていたのでさすがにもったいないから何かに活かそうと思ってAI君に聞いたらVPN作れって言われたので作りました。

まあ当たり前ですが、後々ググったら前例が色々あったのでしっかりとネットワークの知識ある構築フローで進めたいという方はこの記事は参考にならないかもなので悪しからず。

厳密なネットワーク理論よりも、まずは”動いた、ヨシ“を味わいたい方向けの備忘録です。

① 準備するもの

最低限必要な環境をリストアップ:

  • Raspberry Pi (今回は5を使用します)
  • モニター・キーボード・マウス (初期セットアップ用。SSHを有効化するまでは、直接操作してGUIで設定するのが最も確実でトラブルが少ない)
  • LANケーブル (なくてもOKだけどVPNサーバーは安定性が命なので有線接続推奨)
  • ルーターの管理者(Admin)権限 (ポート解放設定で必須、ログインパスワードが分からないと詰んでしまうので、事前に確認しておきましょう。)
  • スマホ or PC (接続テスト用。4G/5G回線から繋がるかを確認)

準備が揃ったら次に進めていきましょう、まずはWireguardのインストールです。


② WireGuardのインストール

ラズパイにはPiVPNという便利なVPNセットアップパッケージがあるので、今回はこちらを使用して進めていきます。

PiVPNとは

本来VPNサーバーを1から構築するには、複雑なネットワーク設定や証明書の作成、ファイアウォールの設定など、諸々めんどくさい作業が必要ですが、PiVPNは、それらをひとまとめにして、対話形式(ウィザード)で自動構築してくれる便利なスクリプトです。

これを使うことで、基本的にボタンをポチポチしているだけでVPN環境が手に入ります。

インストールコマンドの実行

ラズパイのターミナルを立ち上げ、以下のコマンドを一行コピーして貼り付けるだけです。

curl -L https://install.pivpn.io | bash

※実行すると、青い背景の画面が立ち上がります。

基本的には「OK」で進んで大丈夫ですが、今回の構成で気を付けるポイントを3つリストアップしておきます。

  1. VPNプロトコルの選択:WireGuardを選択
    • OpenVPNという選択肢も出ますが、今回はWireGuardを選んでください。
    • 理由: 設定がシンプル & 通信速度が圧倒的に速いため
  2. デフォルトポートの変更:プロバイダー指定のポートへ
    • 通常は 51820 ですが、v6プラス回線などではこのポートは外から繋がらない可能性あり
    • ルーターで確認した利用可能ポート(例:59840とか)に変更、51820が利用可能ならそのまま使ってOK。
  3. DNSプロバイダーの選択:Google or Cloudflare DNS等を推奨
    • VPN接続中に、どの電話帳(DNS)を使ってWebサイトを探すかという選択肢が出るので、Google (8.8.8.8 / 8.8.4.4) または Cloudflare (1.1.1.1)を指定するのがベター
    • 理由: 独自のDNSを設定するよりも、大手プロバイダーのものを使ったほうが、VPN接続時の「ネットが見れない」というトラブルを回避しやすくなるため

③ ネットワーク:ルーターとNATの設定

VPNサーバーを作ったのに外から繋がらない問題の9割はここに収束するので、焦らず一個ずつセットアップしていきましょう。

ルーターのポート変換(静的NAPT)設定

インターネットから届いたVPNのパケットを、ラズパイへ届けるための設定です。

設定の考え方: 「外から 59840 番(UDP)にアクセスが来たら、家の中にいるラズパイ(192.168.11.xx)に転送して」という予約をルーターに覚え込ませるセットアップ。

手順:

ルーターのタイプによって表現が違うことが大半なので、あくまで参考にして詳細は自分のルーターの公式説明書だったり設定画面を精査して進めてください。

  1. ルーターの設定画面から「詳細設定」>「セキュリティ」>「ポート変換」のような画面へ移動。
  2. プロトコル: 「任意のUDPポート」を選択。
  3. ポート番号: PiVPNで設定した番号(例:59840)を入力。
  4. LAN側IPアドレス: ラズパイのIPアドレスを入力。(ラズパイには固定IP割り当てをしておきましょう)

注意点: 「TCP」ではなく「UDP」であることを必ず確認してください。WireGuardはUDPしか使いません。

ラズパイ側のマスカレード(NAT)設定

操作対象: ラズパイ (PC側ではないので注意)

パケットがラズパイに届いても、そのままではラズパイは「自分宛ての通信だ」と思って抱え込んでしまいます。

これを「家の外(インターネット)」や「他のデバイス」へ正しく流す(橋渡しする)設定が必要です。

wg0.conf への PostUp / PostDown ルールの追記

WireGuardが起動した瞬間に、パケットの通り道を作るルールを書き込みます。

sudo nano /etc/wireguard/wg0.conf

[Interface] セクションの最後に、以下の2行を追記します。

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

有線LAN(eth0)と無線(wlan0)の使い分け

上記コマンド内の -o eth0 という部分は、「通信をLANケーブル(有線)から外に出す」という意味です。

  • 有線接続の場合: eth0 のままでOK。
  • Wi-Fi接続の場合: wlan0 に書き換える必要があります。 サーバーとして安定させるなら、有線(eth0) がおすすめ。

IPフォワーディングの有効化

ラズパイに「自分宛てじゃない通信も転送していいよ」と許可を出す設定。

  1. sudo nano /etc/sysctl.conf を開く。
  2. #net.ipv4.ip_forward=1 の先頭にある # を消して保存。
  3. sudo sysctl -p で設定を反映。
cat /proc/sys/net/ipv4/ip_forward

これを実行して、1と表示されていればOKです。


④ クライアント側のセットアップ(iPhone / Mac)

サーバー側の準備ができたら、次は手元のデバイスから接続するための設定を進めていきます。

アプリの導入と設定のインポート

まずは、各OSの公式ストアから「WireGuard」アプリをインストールしましょう。

iOS: https://apps.apple.com/jp/app/wireguard/id1441195209

Android: https://play.google.com/store/apps/details?id=com.wireguard.android&hl=ja

アプリ側のセットアップ

スマホの場合:カメラでQRコード設定 (めっちゃ簡単)

  1. ラズパイ側で「鍵」を発行する
    • ターミナルで pivpn add と打ち、設定名(例:my-iphone)を入力する
  2. QRコードを表示させる
    • pivpn -qr と打つと、作成した設定のリストが出るので、番号を選ぶと画面にQRが表示される
  3. アプリでスキャン
    • iPhoneのWireGuardアプリを開き、右上の 「+」「QRコードを作成」 をタップ。ラズパイの画面を撮ればインポート完了

これでスマホからVPN接続が可能になります。

Macの場合:設定ファイルを「コピペ」で移す

MacにはQRコードのスキャン機能がないため、設定情報をテキストとして移すのが一番確実です。

  1. ラズパイ側で設定の中身を表示する
    • pivpn add でMac用の設定(例:my-macbook)を作ったら、その中身を画面に出す
      • コマンド: cat ~/configs/my-macbook.conf
      • ※パスが違う場合はPiVPNの完了画面に出てきた場所を探してください
  2. 中身を全部コピーする
    • 画面に [Interface] から始まる文字列がズラッと出てくるので、これをマウスで最初から最後まで全てコピーします。
    • ※この情報は自分以外に漏らさないようにしましょう、家の鍵と同じです
  3. Macのアプリに貼り付ける
    • MacのWireGuardアプリを開き、左下の 「+」「空のトンネルを作成 (Create empty tunnel…)」 を選択。
  4. 保存する
    • 名前を適当に(「macbookvpn」など)付けて、最初から入っている文字を全部消してから、コピーした内容をペーストして保存して完了

接続をしてみて、確認くんとかのサイトで家のGlobal IPに繋がっていれば成功です。


⑤ FAQ: トラブルシューティング

設定は完璧なはずなのに動かないという時にチェックすべきポイントです。

Q: ハンドシェイクは成功するが、ネットサーフィンができない

A: MTU値の不一致、またはラズパイ側の「橋渡し(NAT)」設定を疑ってみる

VPNのトンネル自体は掘れていますが、その中を通るデータのサイズが大きすぎるか、出口が見つかっていない状態です。

  • チェック1(MTU)
    • スマホやMacのMTU設定が 1280 あたりになっているか確認
    • v6プラス環境では、ここが少しでも大きいと通信が詰まって動かない可能性あり
      • それでも遅いなら 13401400 あたりで微調整してみる
  • チェック2(NATルール)
    • ラズパイの /etc/wireguard/wg0.conf に、有線LAN用の PostUp ルールを書き忘れている可能性
    • Wi-Fi(wlan0)から有線(eth0)に切り替えた際は、設定ファイル内の -o wlan0-o eth0 に書き換える必要あり。

Q: 外出先から突然繋がらなくなった

A: 自宅のグローバルIPが変わった可能性大。

一般的な家庭用ネット回線は、定期的にグローバルIPアドレスが変動することがあります。

  • 対策
    • ラズパイで curl ifconfig.me を実行し、現在のIPを確認。もしiPhoneの設定(Endpoint)に書いてある数字と違っていたら、新しいIPに書き換えるだけで復活
  • 上級編
    • 頻繁に変わる場合は「ダイナミックDNS(DDNS)」という仕組みを導入すると、数字ではなく「名前」で接続できるようになり、この手間がなくなる

Q: SSHで「Host is down」と出て入れない

A: VPNをONにしたことで、通信ルートが混乱している可能性

WireGuardが起動すると、ラズパイの通信ルートが「VPN優先」に書き換わるため、同じ家の中のPC(Mac)からの呼びかけに対して、ラズパイが「VPNのトンネル」へ返事を出そうとしてしまい、通信が成立しなくなることがあります。

  • 解決策1
    • 一度ラズパイを再起動するか、モニターから sudo systemctl stop wg-quick@wg0 を打ってVPNを止めれば、通常のSSHができるようになる
  • 解決策2
    • VPN経由でSSHする。 VPNがONなら、Macから ssh ユーザー名@10.6.0.1(VPN用IP)でログインできるので。一番確実な回避策です。

まとめ

これでラズパイが、世界中どこにいても自宅のネットワークへ安全に繋いでくれる専用ゲートウェイとなります。

構築後の運用について(定期的なアップデート)

VPNサーバーは外部に公開している窓口なので、メンテナンスを定期的に(月に1回程度)行うことをおすすめします。

1. OSとパッケージの更新

ラズパイのOS(Debian)やインストールされているソフトを最新の状態に保ちます。

sudo apt update && sudo apt full-upgrade -y

2. PiVPNのアップデート

PiVPN自体にも修正や改善が入ります。以下のコマンドで簡単に更新チェックが可能です。

pivpn -u

3. 再起動と接続テスト

アップデート後は一度 sudo reboot で再起動し、iPhoneやMacから正しくVPN接続ができるか確認しておきましょう。「いざ使いたい時に繋がらない」という事態を防げます。