概要
この記事は、プライベートIPアドレスしか割り当てられていないRaspberry PiサーバをVPS(Lightsail)とVPN(WireGuard)を使って公開する手順を紹介します。
背景
集合住宅や学内ネットワークなど、プライベートIPアドレスしか割り当てられていない環境下(上流に自分で管理できないNATがある環境下)において、Raspberry Pi上で稼働するサーバをグローバルなインターネット上に公開し、誰でも自由にアクセスできるようにしたい。
課題
上記の背景により、グローバルIPアドレスが割り当てられないので、グローバルなインターネット上にRaspberry Pi上で稼働するサーバを公開できない。
解決策
VPSとRaspberry PiをVPNで接続し、VPSにポートフォワーディングを設定することによって、グローバルIPアドレスを持つVPS宛に来たリクエストをRaspberry Piが受け取り、Raspberry Piが返したレスポンスをVPSがリクエスト元に返すことが出来るようにする。
これにより、あたかもRaspberry PiにグローバルIPアドレスが割り当てられているかのようなネットワークを構築することが出来る。
環境
- VPS: Amazon Lightsail (Ubuntu 22.04 LTS)
- VPNソフトウェア: WireGuard (v1.0.20210914)
- Raspberry PiのOS: Raspberry Pi OS Lite (64-bit) リリース日時: 2023-10-10
手順
WireGuardのインストール
Lightsail・Raspberry Pi共にWireGuardをインストール
sudo apt install -y wireguard
秘密鍵・公開鍵の生成
Lightsail・Raspberry Pi共に秘密鍵と公開鍵を生成
wg genkey > private
cat private
<秘密鍵が表示される>
wg pubkey < private
<公開鍵が表示される>
コンフィグファイル作成
※ 鍵の文字列両端に"
は必要ありません
Lightsail側
sudo vim /etc/wireguard/wg0.conf
今回は、VPSの80番ポートをRaspberry Piの80番ポートにフォワーディングする設定にします。
[Interface]
PrivateKey = <VPNサーバの秘密鍵>
Address = 10.0.0.1/32
ListenPort = 51820
PostUp = iptables -t nat -A PREROUTING -i ens5 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:80; iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 80 -d 10.0.0.2 -j MASQUERADE
PostDown = iptables -t nat -D PREROUTING -i ens5 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:80; iptables -t nat -D POSTROUTING -o wg0 -p tcp --dport 80 -d 10.0.0.2 -j MASQUERADE
[Peer]
PublicKey = <VPNクライアントの公開鍵>
AllowedIPs = 10.0.0.2/32
Raspberry Pi側
sudo vi /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <VPNクライアントの秘密鍵>
Address = 10.0.0.2/32
[Peer]
PublicKey = <VPNサーバの公開鍵>
Endpoint = <LightsailのグローバルIPアドレス>:51820
AllowedIPs = 10.0.0.1/32
PersistentKeepalive = 25
LightsailのUDP51820番ポートを開ける
Lightsailのインスタンス管理コンソールの[ネットワーキング]タブからIPv4ファイアウォールの[+ルールを追加]で以下のルールを追加します。
- アプリケーション: カスタム
- プロトコル: UDP
- ポートまたは範囲: 51820
Lightsail側でポートフォワーディング有効化
sudo vim /etc/sysctl.conf
「net.ipv4.ip_forward=1」のコメントアウトを解除してください
- #net.ipv4.ip_forward=1
+ net.ipv4.ip_forward=1
変更を反映します
sudo sysctl -p
自動起動設定
Lightsail・Raspberry Pi共に設定します
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
以上で完了です。
Raspberry PiでWebサーバを立ち上げ、LightsailのグローバルIPアドレスにHTTPアクセスするとレスポンスが返ってくることを確認してみてください。
まとめ
このように、VPSとRaspberry PiをVPNで繋ぎ、VPSにポートフォワーディングを設定することによって、あたかもRaspberry PiにグローバルIPアドレスが割り当てられているかのようなネットワークを構築することが出来ます。
参考
謝辞
この記事を書くにあたり、大変お世話になった参考記事の著者の皆さんとツール提供元の皆さんに心より感謝します。