はじめに
今般、VPNを利用して外出先から自宅のRaspberry Piにアクセスする環境をセットアップしたので、備忘録としてその方法をここにメモする。
私は現在、楽天モバイルのモバイルネットワークを介して自宅にあるデバイスをインターネットに接続している。モバイルネットワークと自宅のローカルネットワークの間は、TP-LINK製のホームルータによって相互につなげている。
この場合、ホームルータの外側のIPアドレスは、グローバルIPアドレスでなくプライベートIPアドレスが割り当てられる。したがって、このままでは外出先から自宅のホームルータにアクセス不可なため、インターネット上に存在するVPNサーバを利用することとする。
自宅のRaspberry Piと外出先にあるスマートフォンなどのデバイスをインターネット上にあるVPNサーバを介して仮想的なローカルネットワークを構築しようとするものである。色々調べたところ、今回はVPNサーバとしてさくらインターネットのVPS上に構築するVPNサーバを用いることとする。
さくらインターネットのVPS上にVPNサーバをインストールする
ここではさくらインターネットのVPSをレンタルし、そのVPS上にVPNサーバをインストールする手順について述べる。はじめに以下のサイトからVPSのレンタルを申し込む。
今回レンタルするVPSは、仮想2CoreのCPU、1GBのメモリ、50GBのSSDの構成とする。なお、OSはUbuntu 24.04 LTSとし、石狩に所在するサーバとする。手続き完了後、以下のコマンドによりSSHでVPSに接続できることを確認する。
$ ssh ユーザ名@IPアドレス
SSH接続後、以下のコマンドでパッケージのリストを最新のものへ更新する。
$ sudo apt update
そして以下のコマンドでインストールされているパッケージを最新のバージョンのものへ更新する。
$ sudo apt upgrade
パッケージの変更を反映するためVPSを再起動する。
$ sudo reboot
次にVPS上にVPNサーバを構築する。今回、VPNのプロトコルにWireGuradを用いることとする。WireGuradは数あるVPNプロトコルの中で軽量且つセットアップが容易であるためである。以下のコマンドでWireGuardをインストールする。
$ sudo apt install wireguard
次にサーバが使用する鍵ペアを生成する。以下のコマンドで秘密鍵を作成する。
$ wg genkey | sudo tee /etc/wireguard/sakura.key
以下のコマンドで秘密鍵から公開鍵を作成する。
$ sudo cat /etc/wireguard/sakura.key | wg pubkey | sudo tee /etc/wireguard/sakura.pub
セキュリティのため作成した秘密鍵と公開鍵はファイルの作成者のみが読み書きできるようにパーミッションを変更する。
$ sudo chmod 600 /etc/wireguard/sakura.key $ sudo chmod 600 /etc/wireguard/sakura.pub
Raspberry PiにVPNクライアントをインストールする
ここではRaspberry Pi にVPNクライアントをインストールする手順を示す。以下のコマンドでWireGuardをインストールする。
$ sudo apt install wireguard
次にサーバのときと同様に以下のコマンドで鍵ペアを生成する。
$ wg genkey | sudo tee /etc/wireguard/rpi.key $ sudo cat /etc/wireguard/rpi.key | wg pubkey | sudo tee /etc/wireguard/rpi.pub
セキュリティのため作成した秘密鍵と公開鍵はファイルの作成者のみが読み書きできるようにパーミッションを変更する。
$ sudo chmod 600 /etc/wireguard/rpi.key $ sudo chmod 600 /etc/wireguard/rpi.pub
以下の設定ファイルを準備し、/etc/wireguard/wg0.confに保存する。
[Interface] PrivateKey = <クライアントの秘密鍵> Address = 10.0.0.4/32 [Peer] PublicKey = <サーバの公開鍵> EndPoint = VPNサーバのIPアドレス:51820 AllowedIPs = 10.0.0.0/24
スマートフォンにVPNクライアントをインストールする
スマートフォンが使用する鍵ペアを生成するため、WireGuardのインストールされているPC上で以下のコマンドを実行する。
$ wg genkey | tee smartphone.key $ cat smartphone.key | wg pubkey | tee smartphone.pub
PC上で以下の設定ファイルを作成する。
[Interface] PrivateKey = <クライアントの秘密鍵> Address = 10.0.0.3/32 [Peer] PublicKey = <サーバの公開鍵> EndPoint = VPNサーバのIPアドレス:51820 AllowedIPs = 10.0.0.0/24
次にスマートフォンにWireGuradのアプリをインストールする。インストール後、WireGuardアプリを開き、「+ > ファイル、アーカイブから作成」を選択し、OneDriveなどを経由して上記の設定ファイルを開く。
VPNサーバを設定して起動する
再びVPSにSSH接続し、以下の設定を/etc/wireguard/sakura.confという名前で保存する。
[Interface] PrivateKey = <サーバの秘密鍵> Address = 10.0.0.1/24 ListenPort = 51820 PostUp = iptables -A FORWARD -i sakura -o sakura -j ACCEPT PostDown = iptables -D FORWARD -i sakura -o sakura -j ACCEPT [Peer] PublicKey = <クライアント1の秘密鍵> AllowedIPs = 10.0.0.2/32 PersistentKeepalive = 25 [Peer] PublicKey = <クライアント2の秘密鍵> AllowedIPs = 10.0.0.4/32 PersistentKeepalive = 25
パケットのポートフォワーディングを有効にするため、/etc/sysctl.confの以下の項目を以下の値に設定する。
net.ipv4.ip_forward = 1
設定を反映するため、以下のコマンドを実行する。
$ sudo sysctl -p
VPNサーバを直ちに起動するとともに、次回以降、VPSが起動したら自動的にVPNサーバも起動するようにする。
$ sudo systemctl enable --now wg-quick@sakura
以下のコマンドでVPNの接続端点であるネットワークインタフェースが「sakura」という名前で追加されていることを確認する。
$ ip addr
VPNクライアントを起動する
以下のコマンドでVPNを直ちに有効にする。
$ sudo wg-quick up wg0
以下のコマンドでVPNの接続端点であるネットワークインタフェースが「wg0」という名前で追加されていることを確認する。
$ ip addr
私の環境の場合、Raspberry PiからVPNサーバに対して一度でもpingを実行しなければ、スマートフォンなどの他のデバイスからRaspberry Piに対してアクセスすることができなかった。このため、Raspberry Piから周期的にVPNサーバに対してpingを実行するようにする。以下のコマンドで定時タスクを実行するcronデーモンの設定を編集する。
$ sudo crontab -u root -e
エディタが開いたら以下の行を追加する。この行は、3分に一度の頻度でpingを実行するという意味である。
*/3 * * * * ping -c 1 10.0.0.1 > /dev/null 2>&1
行を追加後、変更を保存してエディタを閉じる。エディタを閉じると同時に変更が即座に反映さえることに注意する。
