はじめに

今般、外出先からでもアクセスできるようにするために、Raspberry Pi 5(以下RPi5と呼称)にVPNサーバを構築したので、備忘録としてここにその手順をメモする。

Dynamic DNSによりダイナミックIPアドレスを固定のホスト名に紐づける

現在契約しているISPの場合、動的にグローバルIPアドレスが割り当てられるようになっている。外部のネットワークからでもアクセスできるサーバを立てる場合、不意にIPアドレスが変わってしまうと接続先が分からなくなってしまうことからダイナミックDNSサービスを用いることとする。
 
ダイナミックDNSにより、不意に変わる可能性のあるIPアドレスを固定のホスト名に紐づけることで、外出先に所在するクライアントからは常に固定の接続先名でアクセスできるようにする。
 
今回は一定の条件元、無料でダイナミックDNSサービスを提供しているNo-IPを利用することとする。下記のサイトからアカウントを作成し、IPアドレスに対応するホスト名を登録する。ホスト名を登録後、DDNSキーを取得する。このキーは、IPアドレスの変化をRPi5でモニターするときに必要となる。
 

 

次に、IPアドレスの変化の有無をモニターし、変化すればDNSを更新するDynamic Update Client(以下、DUCと呼称)をRPi5にセットアップする。

 

はじめにRPi5にツールをダウンロードする。

$ wget --content-disposition https://www.noip.com/download/linux/latest

ダウンロードしたらファイルを解凍する。

$ tar xf noip-duc_3.3.0.tar.gz

以下のコマンドでARM64bit版のDUCをインストールする。

$ cd noip-duc_3.3.0/binaries
$ sudo apt install .\noip-duc_3.3.0_arm64.deb

インストールしたら次のコマンドを実行し、DUCが動作することを確認する。

$ noip-duc -g all.ddnskey.com --username DDNSキーのユーザー名 --password DDNSキーのパスワード

コマンドの実行結果例を以下に示す。

[2025-09-23T01:01:27Z INFO  noip_duc::public_ip] Attempting to get IP with method Dns(No-IP Anycast DNS Tools)
[2025-09-23T01:01:27Z INFO  noip_duc::observer] got new ip; current=202.xxx.xxx.xxx, previous=0.0.0.0
[2025-09-23T01:01:28Z INFO  noip_duc::observer] update successful; current=202.xxx.xxx.xxx, previous=0.0.0.0
[2025-09-23T01:01:28Z INFO  noip_duc::observer] checking ip again in 5m
[2025-09-23T01:06:28Z INFO  noip_duc::public_ip] Attempting to get IP with method Dns(No-IP Anycast DNS Tools)
[2025-09-23T01:06:28Z INFO  noip_duc::observer] checking ip again in 5m

RPi5のIPアドレスは、WiFiルータからDHCPによって割り当てられるプライベートIPアドレスであるが、上記コマンドの出力を見るとISPからWiFiルータに割り当てられているグローバルIPアドレスを取得しているため、RPi5が内部ネットワークに所在している場合でも問題なく動作している模様である。

 

RPi5を起動する度にDUCを手動で起動することは難なため、次に述べる手順により自動でDUCを起動できるようにする。はじめにユニットファイルのひな型をシステムの所定の場所にコピーする。

$ sudo cp debian/service /etc/systemd/system/noip-duc.service

設定ファイル/etc/default/noip-ducを新規に作成し、以下の内容を書き込む。

## /etc/defaults/noip-duc (Debian) or /etc/sysconfig/noip-duc (RedHat, Suse)
## or anywhere you like.
NOIP_USERNAME=DDNSキーのユーザー名
NOIP_PASSWORD=DDNSキーのパスワード

## Comma separated list of hostnames and group names
NOIP_HOSTNAMES=all.ddnskey.com

編集したら設定ファイルを保存し、systemdデーモンをリロードする。

$ sudo systemctl daemon-reload

サービスを有効にする。

$ sudo systemctl enable noip-duc

サービスを有効後、RPi5を再起動する。再起動後、サービスが起動していることを以下のコマンドで確認する。

$ systemctl status noip-duc

サービスが起動している場合、以下のようなステータスが表示される。

● noip-duc.service - No-IP Dynamic Update Client
     Loaded: loaded (/etc/systemd/system/noip-duc.service; enabled; preset: enabled)
     Active: active (running) since Tue 2025-09-23 09:13:27 JST; 5h 12min ago
   Main PID: 858 (noip-duc)
      Tasks: 1 (limit: 9252)
        CPU: 58ms
     CGroup: /system.slice/noip-duc.service
             └─858 /usr/bin/noip-duc

Sep 23 14:04:09 raspberrypi noip-duc[858]: [2025-09-23T05:04:09Z INFO  noip_duc::public_ip] Attempting to get IP with m>
Sep 23 14:04:09 raspberrypi noip-duc[858]: [2025-09-23T05:04:09Z INFO  noip_duc::observer] checking ip again in 5m

これでRPi5が起動すると、IPアドレスの変更をモニターし、IPアドレスが変更された場合はDNSを更新するデーモンが起動するようになる。

 

本節の情報は以下のWebサイトを参考にした。

 

 

 

PiVPNをインストールする

次に述べるRPi5にVPNサーバを構築する。はじめに以下のコマンドを実行する。
$ curl -L https://install.pivpn.io | bash

コマンドを実行すると以下のウィザードが表示されるので、OKを選択する。

 

 

OKを選択する。

 

 

Yesを選択する。

 

 

有線LANのインタフェースを表すeth0を選択し、OKを押下する。

 

 

当環境の場合、RPi5の有線LANのインタフェースのIPアドレスは、WiFiルータからDHCPによって固定的に割り当てられるプライベートIPアドレスを用いるため、Yesを選択する。

 

 

OKを選択する。

 

 

piを選択し、OKを押下する。

 

 

使用するVPNのアプリに関し、WireGuardを選択し、OKを押下する。

 

 

VPNの接続端点であるポート番号に関し、デフォルト設定のままOKを押下する。

 

 

Yesを選択する。

 

 

Windows PCやiPhoneなどこのRPi5にVPNで接続するクライアントが使用するDNSプロバイダとしてここではGoogleを選択の上、OKを押下する。

 

 

クライアントが外出先からこのRPi5を指定する方法として、IPアドレスを直に指定するのではなく、ホスト名を指定するDNS Entryを選択し、OKを押下する。

 

 

No-IPに登録したホスト名を入力し、OKを選択する。

 

 

Yesを選択する。

 

 

OKを選択する。

 

 

OKを選択する。

 

 

当環境の場合、諸事情のためソフトウェアの自動更新をしないため、NOを選択する。

 

 

OKを選択する。

 

 

直ちに再起動するため、Yesを選択する。

 

 

OKを選択し、直ちにRPi5を再起動する。

 

UDPポートを開放する

当環境の場合、RPi5の有線LANのインタフェースに係るIPアドレスは、WiFiルータからDHCPによって割り当てられたプライベートIPアドレスを用いている。このため、外出先からRPi5にVPNでアクセスするためには、WiFiルータ宛てのデータをRPi5に転送する必要がある。
 
一般にこれはポート開放と呼ばれている。使用しているルータの取扱説明書を参照し、WiFiルータのUDP51820ポート宛てのデータをRPi5のUDP51820ポートへ転送するようにする。
 
自身が使用しているWiFiルータはBuffalo製の「WCR-1166DHPL/N」であるため、以下のWebサイトを参考にして設定した。
 

 

ここでWireGuardの場合、開放するポートはTCPでなくUDPポートであることに注意する。誤ってTCPのポートを開放した場合はVPNに接続不可となる。

VPNクライアントをセットアップする

ここではWindows PCにWireGuardのクライアントをインストールし、例えばNTTドコモのモバイルネットワークなど外部ネットワークから自宅のRPi5にアクセスできるようにする。
 
はじめに以下のWebサイトからWindows PC用のクライアントのインストーラをダウンロードする。
 
ダウンロードしたらインストーラを起動し、画面の指示に従ってクライアントをインストールする。次にWindows PCからRPi5にVPNで接続するための設定ファイルを生成する。RPi5上で以下のコマンドを実行する。
$ pivpn add

上記コマンドを実行すると、次の2点の入力を求められる。

  1. クライアントに割り当てるIPアドレス
  2. 任意のクライアント名

IPアドレスの指定は、入力せずにそのままEnterキーを押下すれば自動的に空いているIPアドレスを割り当ててくれる。またクライアント名は、複数のクライアントを識別するための適当な名前を入力する。

 

これらを入力するとVPNに接続するための設定ファイルが$HOME/configsディレクトリに生成される。この生成された設定ファイルをscpコマンドなどでクライアントであるWindows PCにコピーする。

 

その後、モバイルネットワークなど外部のネットワークに所在している状態でWindows PCにインストールしたWireGuardのクライアントを起動し、画面に表示されている「ファイルからトンネルをインポート」からコピーした設定ファイルを指定する。

 
 
設定ファイルを取り込み後、「有効化」を押下するとRPi5に接続できる。