koyashiro's blog

Raspberry Pi 4 に Wireguard の VPN サーバーを構築した

Raspberry Pi 4 が余った

自宅 LAN の名前解決のために Raspberry Pi 4 で dnsmasq を稼働させていたが、 RTX1200 の簡易 DNS 機能のお陰でおうち DNS サーバーが不要となった。 そこで余った Raspberry Pi 4 を WireGuard による VPN サーバーに転用することにした。

WireGuard VPN のセットアップ

ネットワークの構成は以下を想定。

ネットワークネットワークアドレス
自宅 LAN192.168.1.0/24
WireGuard192.168.2.0/24

WireGuard で使う IP アドレスは以下を使用する。

デバイスIP アドレス
サーバー192.168.2.1
クライアント192.168.2.2

WireGuard のインストール

Raspberry Pi 4 に WireGuard をインストールする。

apt install wireguard

サーバー鍵の生成

wg コマンドでサーバの秘密鍵と公開鍵を生成する。 ここでは自宅 LAN 内に置いた Raspberry Pi 4 をサーバーとする。

wg genkey | (umask 077 && tee server.key) | pubkey >server.pub

クライアント鍵の生成

サーバー同様にクライアントの秘密鍵と公開鍵を生成する。 スマートフォンのモバイル回線に接続した MacBook Air をクライアントとする。

wg genkey | (umask 077 && tee client.key) | pubkey >client.pub

サーバー用設定ファイルの作成

サーバー用の設定ファイルを作成する。

WireGuard のネットワーク(192.168.2.0/24) から自宅 LAN へのフォワーディングのため、 iptables を使用する。

Raspberry Pi OS(のベースである Debian 11 bullseye)にはデフォルトでインストールされていないため、必要に応じてインストールする。 ufw を使っている場合、依存関係で iptables も一緒にインストールされていはず。

apt install iptables
[Interface]
Address = 192.168.2.1/24
ListenPort = 51820
PrivateKey = $SERVER_PRIVKEY
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 = $CLIENT_PUBKEY
AllowedIPs = 192.168.2.2/32
EOF

クライアント用設定ファイルの作成

クライアント用の設定ファイルを作成する。 自宅インフラの名前解決のため、 Interface.DNS は LAN のルーター(192.168.1.1)を設定する。 Peer.Endpoint は自宅のグローバル IP アドレスを設定する。

[Interface]
PrivateKey = $CLIENT_PRIVKEY
Address = 192.168.2.2/32
DNS = 192.168.1.1

[Peer]
PublicKey = $SERVER_PUBKEY
AllowedIPs = 0.0.0.0/0
Endpoint = 203.0.113.1:51820

WireGuard サーバーの起動

systemctl で WireGuard のサービスを有効化する。 今回は WireGuard のインターフェイス名を wg0 としたため、systemd のユニット名は wg-quick@wg0 で有効化する。

systemctl enable --now wg-quick@wg0

以上でセットアップは完了。

参考