🔭

公共WiFiでも安心! ラズパイ + WireGuardで作る自宅VPNサーバー構築ガイド

に公開

😊 はじめに

前回の記事AzureVM + WireGuardでVPNサーバーを構築する手順をご紹介しました。

ただAzureVMを使った場合、どうしてもランニングコストの問題が発生するので、今回はラズパイ + WireGuardでVPN環境を自宅に構築したいと思います。

ラズパイをVPNサーバーにすることで、初期投資は必要ですが運用費を電気代のみに抑えることができます。今回は家の押し入れで安らかに眠っていたラズパイ4を使うことにしました。

🥗 必要なもの

  • Raspberry Pi 4 or 5(もしくは何らかのLinuxマシン)
  • クライアントデバイス(Windows、Mac、Linux、iOS、Android)
  • グローバルIPがあるネットワーク回線
  • ルーター(家庭用のものでOK)
  • Linuxのコマンドを叩く勇気
  • あと最低限のやる気と好奇心をスパイスで🌶️

🥗今回使った機材
  Raspberry Pi 4 ModelB 4GB + 64GB SDカード
  Windows 11 ノートPC

🏙️ 構築するネットワーク構成

今回構築するネットワークは以下のようになります。

構築するネットワーク構成

💡ポイント

  • VPNでクライアントと自宅にあるラズパイを結ぶ
  • クライアントからインターネットに出るときは、VPNを経由して自分の契約してるプロバイダから外に出る
  • 公共WiFiのネットワークはVPNトンネルでスルーするから安全!

🔑 SSH接続用の鍵ペアの作成

まず、ラズパイにSSH接続するための鍵ペアを作ります。他のデバイス用の鍵ペアをすでに持っている方は、それを流用しても構いません。接続元の環境はWindows PCを想定しています。

コマンドプロンプトで以下のコマンドを実行し鍵ペアを作成します。

ssh-keygen -t ed25519 -C "Your name"

実行するとパスフレーズを聞いてきますが、必要なければ未入力のままEnterキーを2度押せばOKです。

Enter passphrase (empty for no passphrase):↩
Enter same passphrase again:↩

成功するとユーザーディレクトリ(C:\Users\[ユーザ名]\.ssh\)の下に2つのファイルが作成されます。

ファイル 説明
id_ed25519 秘密鍵
id_ed25519.pub 公開鍵

🍓 Raspberry Pi OSのインストール

選択したOSはRaspberry Pi OS Lite 64bit Bookwormです。GUIは不要なのでLiteを選択しました。OSはRaspberry Pi Imagerツールを使ってmicro SDカードに書き込みます。ツールは以下のサイトからダウンロードできます。

https://www.raspberrypi.com/software/

書き込む際に設定の編集に入り、SSHを有効化する公開鍵認証のみを許可するを選択します。
authorized_keysのエディットボックスには、前項で作成した鍵ペアの公開鍵を記入します。

Raspberry Pi Imager

SDカードへの書き込みが終わったら、それをラズパイに差しLANケーブルをつないで電源を入れます。

📡 SSHでラズパイに接続する

SSHで接続するには、ラズパイのIPアドレスがわかっていないといけません。大抵の場合、IPアドレスはルーターから払い出されるため、ルーターの管理画面などを見ればわかります。ただ、ルーターのDHCP機能を使う場合、電源を入れなおすたびにIPが変わる可能性がありますので注意してください。そのため、ルーターの固定IP機能を使って192.168.1.100などに固定しておくとよいでしょう。

IPアドレスがわかったら、以下のコマンドを実行してラズパイに接続します。

ssh -i ~/.ssh/id_ed25519 username@192.168.1.2

usernameのところには、OS書き込み時に指定した自分のユーザー名を指定します。オプションでユーザー名を指定しなかった場合は、ユーザー名がpiになります。

以下のようなプロンプトが表示されたら接続は成功です。

led-mirage@raspi-vpn:~ $

🔒 SSHの設定

インターネット側からラズパイにSSH接続することも想定し、SSH設定ファイル(/etc/ssh/sshd_config)を編集してセキュリティ強度を上げておきましょう。

  1. nanoエディタで設定ファイルを開きます。
sudo nano /etc/ssh/sshd_config
  1. ファイルの末尾に以下を追加します。
# Custom security settings
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
PermitEmptyPasswords no
  1. 設定を反映します。
sudo systemctl reload ssh

🚗 ルーターの設定

固定IPアドレス設定

ラズパイのIPアドレスをDHCPで自動で割り当てていると、再起動のタイミングなどでIPアドレス変わってしまうことがあり、そうすると安定的にVPNを使えなくなってしまいます。そのため、ルーターの固定IPアドレス機能を使ってIPを固定します。

  1. MACアドレスを調べます。

固定IPアドレスを設定するにはラズパイのLANポートのMACアドレスが必要になるので調べます。ルーターの管理画面でもわかることが多いですが、確実にするにはSSHでラズパイに接続し以下のコマンドを実行してください。

ip link

実行すると何行か出力されますが、その中のeth0がLANポートの情報です。無線LANをお使いの方はwlan0に注目してください。以下のような出力の中のaa:bb:cc:dd:ee:ffがMACアドレスです。

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
  1. 固定IPアドレスを設定します。

ブラウザでルーターの管理画面(http://192.168.1.1)にアクセスし、詳細設定DHCPv4サーバ設定DHCP固定IPアドレス設定へと進みます。そして、調べたMACアドレスと、そこに割り当てたいIPアドレスを指定して設定を登録します。ここでは以降の説明のために、192.168.1.100をラズパイに割り当てたこととします。

ルーターの設定が終わったら、ラズパイを再起動します。

# ラズパイを再起動
sudo reboot

再起動後はIPアドレスが変更されているはずなので、以下のコマンドでSSHの接続を行いましょう。

# IPアドレスを192.168.1.100に変更、usernameは自分のユーザー名に置き換えること
ssh -i ~/.ssh/id_ed25519 username@192.168.1.100

ポートフォワーディング設定

インターネット側からラズパイのWireGuardに接続できるよう、ルーターにポートフォワーディングの設定を追加します。

  1. 利用可能なポート番号を調べます

IPv6プラスの場合、ひとつのIPv4アドレスを複数のユーザーで共有するため、ひとりひとりが使えるポート番号が限定されています。そのため、まず自分が使えるポート番号を調べる必要があります。

PR-400MIの場合、IPv4系の設定を行う特殊な設定画面が用意されています。
http://192.168.1.1:8888/t にアクセスし、ログインしてください。
すると以下の画面が表示されます。

PR-400MIのIPv4設定画面
PR-400MIのIPv4設定画面

上記画面のIPv4設定ボタンを押すと、割り当てられたIPv4グローバルIPアドレスと、使用できるポートの一覧が表示されます。

利用可能なポート一覧
IPアドレスと利用可能なポート一覧(上記画像はイメージです)

  1. ポートフォワーディングの設定を追加します

表示された利用可能ポートの中から好きなポート番号を選び、それを使ってポートフォワーディング設定を行います。左のメニューから静的NAPT設定を選んで設定を追加します。

静的NAPT設定
ポートフォワーディング設定

ここでは使用するポート番号を50000番を選択し、インターネットからそこに入ってくるUDPパケットをラズパイ(192.168.1.100)の51820ポート(WireGuardのポート)に転送する設定を追加しています。

⚙️ OSの更新設定

まずOSを最新の状態にします。

sudo apt update && sudo apt upgrade -y

次にセキュリティアップデートを自動で適用するようにします。

sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

🛡️ ファイアウォールの設定

ファイアウォール(ufw)を導入して使用しないポートを閉じます。

  1. ファイアウォールをインストールします。
sudo apt install ufw
  1. デフォルトポリシーを設定します。
# 受信全拒否
sudo ufw default deny incoming
# 送信全許可
sudo ufw default allow outgoing
  1. SSHを許可します。
sudo ufw allow ssh
  1. WireGuard用のポート(UDP 51820)を許可します。
sudo ufw allow 51820/udp
  1. ファイアウォールを有効化します。
sudo ufw enable
  1. ファイアウォールの状態を確認します。
sudo ufw status verbose

🔭 WireGuardのインストール

ラズパイ側(サーバー側)

まず、ラズパイ側にWireGuardを設定していきます。

  1. WireGuardをインストールします。
sudo apt install wireguard -y
  1. WireGuard用鍵ペアを作成します。
sudo -i
cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
exit
  1. 設定ファイルを作成します。

まずはWireGuardの秘密鍵を確認しておきます。以下のコマンドを実行して、表示される文字列を一時的に保存しておいてください(エディタなどに貼り付けておけばOKです)。

sudo cat /etc/wireguard/privatekey

続いてnanoエディタを使って設定ファイルを作成します。

sudo nano /etc/wireguard/wg0.conf

nanoエディタが開いたら、以下のテキストを入力して保存します。PrivateKeyのところには、先ほど確認したWireGuardの秘密鍵を記載します。

wg0.conf
[Interface]
PrivateKey = WireGuardの秘密鍵
Address = 10.66.66.1/24
ListenPort = 51820
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

クライアント側

続いてVPN接続元となるクライアントにWireGuardをインストールし設定していきます。ここではWindowsクライアントの例を説明します。

  1. WireGuardをダウンロードしてインストールします。

以下のサイトにアクセスし、Windows用のインストーラーをダウンロードします。

https://www.wireguard.com/install/

ダウンロードが終わったらwireguard-installer.exeを実行してWireGuardクライアントをインストールします。

  1. VPNトンネルを追加します。

左下の▼を押して空のトンネルを追加...を選択します。

WireGuard起動画面
WireGuard起動画面

すると次のような画面が表示されます。初期状態でクライアント用のキーペアが生成されていますので、ここに必要な情報を追加していきます。

トンネルの新規作成画面
起動直後のトンネル新規作成画面

以下が編集例です。PeerPublicKeyにはサーバーのWireGuard公開鍵を、EndpointのIPアドレス部分はサーバーのIPアドレスを記載してください。

トンネルの新規作成画面2
新規トンネルの設定例(値はサンプルです)

以下コピペ用のテンプレートです。

[Interface]
PrivateKey = クライアントのWireGuard秘密鍵
Address = 10.66.66.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = サーバーのWireGuard公開鍵
AllowedIPs = 0.0.0.0/0
Endpoint = xx.xx.xx.xx:50000

再びラズパイ側(サーバー側)

クライアントの設定が終わったら、再びラズパイに戻ってクライアントの情報を設定ファイルに追加します。

  1. 設定ファイルを編集します。

nanoエディタでwg0.confファイルを開き、[Peer]以下を追記して保存します。
PeerのPublicKeyにはクライアントのWireGuard公開鍵を記入します。

sudo nano /etc/wireguard/wg0.conf
wg0.conf
[Interface]
PrivateKey = サーバーのWireGuard秘密鍵(記載済み)
Address = 10.66.66.1/24
ListenPort = 51820
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 = クライアントのWireGuard公開鍵
AllowedIPs = 10.66.66.2/32
  1. WireGuardを起動します。
# WireGuardサーバーの起動
sudo wg-quick up wg0
# 設定反映後の状態確認
sudo wg show

sudo wg showを実行して次のような表示が出れば起動は成功しています。

interface: wg0
  public key: サーバーのWireGuard公開鍵
  private key: (hidden)
  listening port: 51820

peer: クライアントのWireGuard公開鍵
  allowed ips: 10.66.66.2/32
  1. WireGuardの自動起動を設定します。

以下のコマンドを実行して、サーバー再起動後も自動的にWireGuardを実行するようにします。

sudo systemctl enable wg-quick@wg0

↩️ IP転送の有効化

サーバー側でIP転送が有効になってないと、VPNサーバーに接続できても、そこからインターネットに出られません。まず、次のコマンドで状態を確認します。

# IP転送が有効化どうかを確認:0の場合は無効
cat /proc/sys/net/ipv4/ip_forward

0と表示された場合は次のコマンドを実行して、IP転送を有効化します。

# 有効にする(一時的)
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
# 永続化(再起動後も有効)
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf

🧩 接続テスト

ここまで来たらラズパイVPNサーバーに接続できるはずです。
クライアントのWireGuardでVPNの有効化ボタンを押してみましょう。

WireGuard接続状態
WireGuardのVPNを有効化した状態

一番下の転送の送受信バイト数が増えていけばVPNサーバーと接続できています。
また、ブラウザを起動してインターネットのサイトが閲覧できるかも確認しましょう。

全部OKなら、いよいよデバイスを家の外に持ち出し、自宅のVPNサーバーに接続してみましょう。
これで問題なければ、自宅VPNサーバーの完成です。
お疲れさまでした!🎉🎉🎉

⭐ さいごに

最後までお読みいただきありがとうございました😌
長かったですねぇ。こんなに長くなる予定じゃなかったんですが、いや長かった。。。

ただこの記事で見てきたように、ラズパイを使えば電気代だけで自宅VPNサーバーを運用できるようになります。押入れの片隅に眠ってるラズパイをお持ちの方は是非検討してみてください。

ラズパイをお持ちでない方も、使ってみると結構楽しいデバイスなので、遊ぶつもりで購入を検討されてもいいかもしれません。Linuxの勉強もできますしねっ!✨

それではまた、次の記事で会いましょう。
ごきげんよう。バイバイ!


😎 附録A:トラブルシューティング

🥺 ラズパイのインストール方法がわかりません

回答:えーーーー
Raspberry Pi Imager使ってmicro SDカードにOS焼きこんで、それをラズパイ本体にぶっ刺して電源を入れるだけなのでそう難しくはありません。ラズパイ インストールでググれば、優秀なサイト様が図入りで解説してくれますので、そちらも参考にしてください。

🥺 ラズパイ起動したら黒い画面しか出てきません

回答:そんなもんです。諦めてください。
い、いや、それはラズパイOSのLite版を入れてるからです。VPN用途ではGUIは不要だし動作も軽そうなので本記事ではLite版を選択しました。どうしてもキラキラしたGUIが欲しい方は、Lite版じゃないラズパイOSをインストールしてください。

🥺 Linuxのコマンドがわかりません

回答:がんばれw
い、いや、筆者もずぅぅぅとWindows畑を歩いてきたので、正直Linuxのことはよくわかりません。でも、やっているうちに何となくわかってくるものです。OSの更新方法やファイアウォールの設定方法など最低限のセキュリティ知識さえ押さえておけば何とかなります。………何ともならない?えっ?

🥺 鍵が氾濫して頭が混乱しています

回答:それな。俺もこんなにバンバン鍵を作りまくるはめになるとは思ってなかったよ。
うん。まず、この記事に出てくる鍵ペアはSSH用と、WireGuardの2種類あることを認識してください。WireGuardの設定で使うのはWireGuard用の鍵だけで、WireGuardの鍵はすべてWireGuardで生成します。ssh-keygenで作った鍵はWireGuardでは使えないので気を付けてください。混ぜるな危険、です。

🥺 どうしてもVPNサーバーにつながりません

回答:祈りましょう。。。
よくある間違いが、WireGuardの設定ファイルに書く鍵の種類を間違えちゃったとか。公開鍵を記載する場所に秘密鍵を書いちゃったとか、その逆もまた然り。あとはルーターのポートフォワーディングがうまくいってないとか、そんなときはまずはローカルネットワーク上で接続できるか試してみるといいですよ。クライアント接続設定で接続先を192.168.1.100:51820にするとか。
………まさか、グローバルIP持ってない、なんてないですよね?

🥺 VPNサーバーには繋がったんですが、インターネットのサイトが見れません

回答:あぁ。やっちゃったね。
それはおそらく祈りが足りないか、ラズパイのIP転送が有効になってないためだと思われます。記事の最後の方に設定方法を書いたので、それを参考に設定してみてください。ラズパイを再起動してみるのもいいかもしれません。
えっ、まだ動かない? ………………祈りましょう。

🥺 なんかトラブルシューティングが投げ遣りなんですが?

回答:疲れたんです。許してください。

💰 附録B:コスト比較

ラズパイ、AzureVM、VPSのコスト感の比較と、それぞれのメリット、デメリットを挙げてみました。

ラズパイ AzureVM VPS(さくら)
初期費用 15,000円 0円 0円
ランニングコスト 月100円(電気代) 月2,000円 月700円
1年間 16,200円 21,600円 7,692円
2年間 17,400円 43,200円 15,384円
3年間 18,600円 64,800円 23,076円

※上記費用は概算です。ご参考までに。

ラズパイ

  • メリット:
    • ランニングコストが安い(インターネット回線が既にある場合は電気代のみ)。
    • ガジェット感があって楽しい。ワクワク✨
    • 嫌でもネットワークの勉強ができる。
    • 他の用途でも使えるかも。
  • デメリット:
    • 初期費用が高い(本体+α)。
    • 経年劣化、故障を考慮する必要がある。
    • 設置が手間。ルーターの設定などをする必要がある😱

AzureVM

  • メリット:
    • 初期費用がない。少し試すだけなら安上がり。
    • クラウド(Azure)の勉強をすることができる(少しだけ)。
    • 故障の心配をする必要がない。
    • 慣れれば設置が楽✨
  • デメリット:
    • ランニングコストが高い。
    • 安く抑えようとするとパフォーマンスが落ちる。
    • 料金が後払いのため、毎月の料金が心配で眠れなくなる😱

VPS(さくらインターネットなど)

  • メリット:
    • 初期費用がない。少し試すだけなら安上がり。
    • 故障の心配をする必要がない。
    • 慣れれば設置が楽(たぶん)。
    • 月額固定料金だから明朗会計✨
  • デメリット:
    • 安く抑えようとするとパフォーマンスが落ちる。
    • クラウドほどではないが、月々のランニングコストがかかる。

📖 附録C:コマンドリファレンス

  • SSH接続用鍵ペアの作成
    • ssh-keygen -t ed25519 -C "Your name"
  • OSインストール時設定
    • SSHを有効化
    • 公開鍵認証のみを許可する
  • SSH接続
    • ssh -i ~/.ssh/id_ed25519 username@192.168.1.100
  • SSH設定
    • sudo nano /etc/ssh/sshd_config
    • sudo systemctl reload ssh
  • OSの更新設定
    • 最新の状態に更新
      • sudo apt update && sudo apt upgrade -y
    • セキュリティアップデートの自動適用
      • sudo apt install unattended-upgrades
      • sudo dpkg-reconfigure --priority=low unattended-upgrades
  • ファイアウォール設定
    • インストール
      • sudo apt install ufw
    • 送信全許可
      • sudo ufw default allow outgoing
    • 受信全拒否
      • sudo ufw default deny incoming
    • 受信許可:SSH、WireGuard(UDP51820)
      • sudo ufw allow ssh
      • sudo ufw allow 51820/udp
    • 設定の有効化
      • sudo ufw enable
    • 設定の確認
      • sudo ufw status verbose
  • WireGuard設定
    • インストール
      • sudo apt install wireguard -y
    • 鍵ペアの作成
      • sudo -i
      • cd /etc/wireguard
      • umask 077
      • wg genkey | tee privatekey | wg pubkey > publickey
      • exit
    • 設定ファイルの作成・編集
      • sudo nano /etc/wireguard/wg0.conf
    • 起動/停止
      • sudo wg-quick up wg0
      • sudo wg-quick down wg0
      • sudo systemctl enable wg-quick@wg0
    • 動作確認
      • sudo wg show
  • IP転送の有効化
    • 現状の確認
      • cat /proc/sys/net/ipv4/ip_forward
    • 有効にする
      • echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
      • echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf

Discussion