はじめに
Raspberry Pi 5 を VPN サーバとし、外出先からも自宅ネットワークにアクセスできる環境構築の備忘録。
ここでは DynamicDNS の利用 → ルータ設定 → Raspberry Pi での VPN サーバ構築 → セキュリティ強化 → クライアント設定 までの手順をまとめる。
対象読者:
- 外出先から自宅環境にアクセスしたい
- Raspberry Pi で VPN サーバを構築してみたい
- 最小限のセキュリティ設定も含めて押さえたい
今回のVPNサーバ構築に使用した機器・サービス
- RaspberryPi5(VPN サーバ) ※Raspberry 4でも構わない
- Buffalo WSR-5400XE6 (ホームルータ) ※ポート変換、パススルー機能があるもの
- バッファロー・ダイナミックDNSユーザーサービス ※同等のサービスであれば可(だと思う)
今回のネットワーク構成
外部からのアクセスをホームルータ経由で Raspberry Pi に転送し、VPN サーバを経由してLAN内に接続できる構成。
LAN側:192.168.11.0/24

手順
1. DynamicDNS の設定
固定IPを持たない家庭用回線でも、ダイナミックDNS を利用して外部からアクセスできるようにする。
今回はBafalloのダイナミックDNSサービスを利用。
初回登録日から翌月末まで無料(以降は 3,960円/年) ※2025.9.20執筆時点
2. ルータのポートフォワーディング設定
-
利用するルータ(今回は Buffalo WSR-5400XE)で、以下の設定を行う。
- プロトコル : UDP
- ポート番号 : 4500/500
- LAN側ポート: 4500/500
- 転送先 : 192.168.11.102 ※Raspberry Pi の Local IP アドレスは利用環境に合わせ読み替え
- パススルー設定: 使用
2.1 UDPポート4500番の追加
2.2 UDPポート500番の追加
2.3 追加したポートの一覧確認
2.4 パススルー設定
3. Raspberry Pi 上で VPN サーバ構築
- 今回は strongSwan を導入。(Version5.9.8) ※2025.9.20執筆時点
- Raspberry Pi にログインして作成。
3.1 インストール
sudo apt update
sudo apt install -y strongswan strongswan-pki libcharon-extra-plugins nftables dnsutils
3.2 CA(認証局)の作成、サーバー証明書の作成
以下の4つを作成。
-
ca-key.pem(CA秘密鍵)
-
ca-cert.pem(CA証明書)
-
server-key.pem(サーバ秘密鍵)
-
server-cert.pem(サーバ証明書, CN/SAN = your_dns_name.bf1.jp)
3.2.1 ca-key.pem(CA秘密鍵)の作成
2048 ビット RSA 鍵で作成
bashsudo mkdir -p ~/pki cd ~/pki openssl genrsa -out ca-key.pem 20483.2.2 ca-cert.pem(CA証明書)
有効期限を 365日(1年) に設定。
bashcd ~/pki openssl req -new -x509 -sha256 -days 365 -key ca-key.pem -out ca-cert.pem -subj "/CN=your_dns_name.bf1.jp"3.2.3 server-key.pem(サーバ秘密鍵) の作成
2048 ビット RSA 鍵で作成
cd ~/pki openssl genrsa -out server-key.pem 20483.2.4 server-cert.pem(サーバ証明書)の作成
bashcd ~/pki # CSR作成 + SAN付与 openssl req -new -newkey rsa:2048 -nodes -keyout server-key.pem \ -subj "/CN=your_dns_name.bf1.jp" \ -addext "subjectAltName=DNS:your_dns_name.bf1.jp" \ -out server.csr # サーバ証明書作成(1年有効) + SAN付与 openssl x509 -req -in server.csr -CA ca-cert.pem -CAkey ca-key.pem \ -CAcreateserial -out server-cert.pem -days 365 -sha256 \ -extfile <(printf "[x]\nsubjectAltName=DNS:your_dns_name.bf1.jp\n") -extensions x3.2.5 確認
bash# 有効期限 (notAfter) を確認(CA証明書) openssl x509 -in ca-cert.pem -noout -date # RSA key okであることを確認(サーバ秘密鍵) openssl rsa -in server-key.pem -check # CN、SAN、Issuer、NotAfterを確認(サーバ証明書) openssl x509 -in server-cert.pem -noout -text # 署名の検証 openssl verify -CAfile ca-cert.pem server-cert.pem
3.3 CA証明書、サーバ証明書の配置
/etc/ipsec.d 配下にそれぞれ配置。
sudo mkdir -p /etc/ipsec.d/{private,certs,cacerts}
sudo cp ~/pki/ca-cert.pem /etc/ipsec.d/cacerts/
sudo cp ~/pki/server-cert.pem /etc/ipsec.d/certs/
sudo cp ~/pki/server-key.pem /etc/ipsec.d/private/
sudo chmod 600 /etc/ipsec.d/private/server-key.pem
CN = your_dns_name.bf1.jp / SubjectAltName: DNS:your_dns_name.bf1.jp となっていることを確認
openssl x509 -in /etc/ipsec.d/certs/server-cert.pem -noout -subject -ext subjectAltName
3.4 strongSwan・IP転送 の設定
以下のファイルを編集。
-
/etc/ipsec.conf
-
/etc/ipsec.secrets
-
/etc/sysctl.d/99-ikev2.conf
-
/etc/nftables.conf
3.4.1 /etc/ipsec.conf の編集
以下を追加
ipsec.conf# サーバ側(左) left=%any leftid=your_dns_name.bf1.jp # DNSに合わせ読み替え leftcert=server-cert.pem leftsendcert=always leftsubnet=192.168.11.0/24 # 環境に合わせ読み替え # クライアント側(右) right=%any rightid=%any rightauth=eap-mschapv2 rightsendcert=never rightsourceip=10.10.10.0/24 # クライアント配布アドレス eap_identity=%identity ike=aes256-sha256-modp2048,aes128-sha1-modp1024 esp=aes256-sha256,aes128-sha13.4.2 /etc/ipsec.secrets の編集
VPNユーザを追加。
vpnuser :ユーザID
password :パスワードipsec.secrets: RSA "server-key.pem" vpnuser : EAP "password"-modp10243.4.3 IPv4 のパケット転送(IP フォワーディング)の設定と有効化
net.ipv4.ip_forward=1 を設定。
bashecho 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ikev2.conf sudo sysctl --system3.4.4 nftables(FORWARD 許可のみ)設定と有効化
以下を実施。
- VPN サブネット (10.10.10.0/24) → LAN サブネット (192.168.11.0/24) の通信を許可。
- LAN サブネット (192.168.11.0/24) → VPN サブネット (10.10.10.0/24) の通信を許可。
- 設定を /etc/nftables.conf に保存して永続化
- nftables サービスを有効化して再起動後も反映
nftables.conf# 双方向許可 sudo nft insert rule ip filter FORWARD ip saddr 10.10.10.0/24 ip daddr 192.168.11.0/24 counter accept sudo nft insert rule ip filter FORWARD ip saddr 192.168.11.0/24 ip daddr 10.10.10.0/24 counter accept # 永続化 sudo nft list ruleset | sudo tee /etc/nftables.conf >/dev/null sudo systemctl enable --now nftables
3.5 strongSwan の設定
以下を実施。
- strongSwan サービスを有効化・再起動
- ポート確認
- セキュリティアソシエーション (SA) の状態確認
3.5.1 strongSwan サービスを有効化・再起動
bashsudo systemctl enable strongswan-starter sudo systemctl restart strongswan-starter3.5.2 ポート確認
ss -lunp → UDP の LISTEN 状態を表示。
:500 は IKE (ISAKMP) 用ポート。
:4500 は NAT-T (NAT Traversal) 用ポート。
charon プロセスの LISTEN を確認、あればVPN 接続を受け入れ準備ができている。bashsudo ss -lunp | grep -E ':500|:4500' # charon が LISTEN3.5.3 セキュリティアソシエーション (SA) の状態確認
VPN トンネルの確立を確認bashsudo ipsec statusall # SA が貼れたらOK
4. Firewall設定
-
ufw (Uncomplicated Firewall)を利用
4.1 インストール
bashsudo apt update sudo apt install ufw4.2 デフォルトポリシー
- 受信 (incoming): デフォルトは拒否(deny)
- 送信 (outgoing): デフォルトは許可(allow)
bashsudo ufw default deny incoming sudo ufw default allow outgoing4.3 必要ポートの許可
- VPN 用 UDP ポート(Anywhere 許可)
bashsudo ufw allow 500/udp sudo ufw allow 4500/udp- LAN 内限定の HTTP アクセス(80/tcp)
bashudo ufw allow from 192.168.11.0/24 to any port 80 proto tcp4.4 有効化・設定確認
bashsudo ufw enable sudo ufw status verbose
5. 不正アクセス防御設定
-
fail2banを利用
5.1 インストール
bashsudo apt update sudo apt install fail2ban5.2 設定ファイル作成
- vimやnanoで設定ファイル (/etc/fail2ban/jail.local) を作成
jail.local[DEFAULT] backend = systemd banaction = ufw allowipv6 = auto [sshd] enabled = true port = ssh filter = sshd maxretry = 5 bantime = 1h findtime = 10m5.3 有効化・起動・設定確認
bashsudo systemctl enable fail2ban sudo systemctl start fail2ban sudo fail2ban-client status sudo fail2ban-client status sshd
6. クライアント設定(Android/iPhone/iPad)
-
VPNサーバにて作成した ca-cert.cer を利用
6.1 VPNサーバにて ca-cert.pem を DER 変換
作成した ca-cert.cer は Windows/mac の OneDrive/iCloudフォルダ等にSCPして、そこから (OneDrive/iCloudインストール済の) スマホと共有するのが一番簡単
bashcp /etc/ipsec.d/cacerts/ca-cert.pem ~/pki/ openssl x509 -in ~/pki/ca-cert.pem -outform der -out ~/pki/ca-cert.cer6.2 クライアント設定(Android)
- 設定 → セキュリティ → 証明書をインストール → CA証明書(VPNとアプリ向け)で ca-cert.cer を導入
- Play ストアにて strongSwan VPN Client をインストール
- Add VPN Profile にて以下を設定
- Server :yout_dns_name.bf1.jp # DNSに合わせ読み替え
- VPN Type :IKEv2EAP(Username/Password)
- CA Certificate: Select automatically にチェック
- Add VPN Profile にて以下を設定
6.3 クライアント設定(iPhone/iPad)
- 持っていないので試せていません。
7. クライアント設定(Windows)
-
証明書のインストール
- VPNサーバにて作成した ca-cert.cer を利用
- VPNサーバから ca-cert.pem を PC にコピー
- 証明書をダブルクリック → 「証明書のインストール」
- 「ローカルコンピュータ」を選択(管理者権限が必要)
- 証明書ストアの選択で「信頼されたルート証明機関」を指定
- 完了後、インストールが成功したら確認ダイアログが出ます
-
VPN設定
8. クライアント設定(macOS)
- 持っていないので試せていません。
9. コマンドリファレンス
-
strongSwan(IKEv2/IPsec)
- 起動
bashsudo systemctl start strongswan-starter- 停止
bashsudo systemctl stop strongswan-starter- 再起動
bashsudo systemctl restart strongswan-starter- 状態
bashsudo systemctl status strongswan-starter --no-pager -l- 自動起動 ON
bashsudo systemctl enable strongswan-starter- 自動起動 OFF
bashsudo systemctl disable strongswan-starter- ログ(直近)
bashsudo journalctl -u strongswan-starter -n 100 --no-pager- ログ(追尾)
bashsudo journalctl -u strongswan-starter -f- 設定の再読み込み(ipsec.conf, ipsec.secrets を変更後)
bashsudo ipsec reload sudo ipsec rereadsecrets- 状態確認(SA/トンネルの詳細)
サーバ(right=%any)運用では通常「受け側」なので ipsec up/down は不要。bashsudo ipsec statusall
クライアント側から接続すると自動で確立される。 -
nftables(フォワード許可ルール)
- 起動
bashsudo systemctl start nftables- 停止
bashsudo systemctl stop nftables- 再起動
bashsudo systemctl restart nftables- 状態
bashsudo systemctl status nftables --no-pager -l- 自動起動 ON
bashsudo systemctl enable nftables- 自動起動 OFF
bashsudo systemctl disable nftables- 現在のルール表示
bashsudo nft list ruleset- 現在のルールのクリア
bashsudo nft flush ruleset- 現在のルールの保存(永続化)
bashsudo nft list ruleset | sudo tee /etc/nftables.conf >/dev/null-
VPN←→LAN の転送許可
設定済
bashsudo nft insert rule ip filter FORWARD ip saddr 10.10.10.0/24 ip daddr 192.168.11.0/24 counter accept sudo nft insert rule ip filter FORWARD ip saddr 192.168.11.0/24 ip daddr 10.10.10.0/24 counter accept -
IP 転送
- 現在の値を確認(1=有効, 0=無効)
bashsysctl -n net.ipv4.ip_forward- 一時的に有効に変更
bashsudo sysctl -w net.ipv4.ip_forward=1- 一時的に無効に変更
bashsudo sysctl -w net.ipv4.ip_forward=0- 永続化(設定ファイル反映)
bashecho 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ikev2.conf sudo sysctl --system -
動作確認
- UDP 500/4500 の待ち受け(charonがLISTENしているか)
bashsudo ss -lunp | grep -E ':500|:4500'- strongSwan の状態
bashsudo ipsec statusall- 接続直後のログ(原因切り分け)
bashsudo journalctl -u strongswan-starter -n 100 --no-pager- パケットが来ているか(wlan0:宅内側IF。環境によりeth0等)
bashsudo tcpdump -ni wlan0 'udp port 500 or udp port 4500'






