1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RaspberryPi5 + strongSwan による VPN サーバ構築

Last updated at Posted at 2025-09-20

はじめに

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
nw.png


手順

1. DynamicDNS の設定

固定IPを持たない家庭用回線でも、ダイナミックDNS を利用して外部からアクセスできるようにする。
今回はBafalloのダイナミックDNSサービスを利用。
初回登録日から翌月末まで無料(以降は 3,960円/年) ※2025.9.20執筆時点

  • 例: your_dns_name.bf1.jp ※取得したDNSに合わせて読み替え
    ddns.png

2. ルータのポートフォワーディング設定

  • 利用するルータ(今回は Buffalo WSR-5400XE)で、以下の設定を行う。

    • プロトコル : UDP
    • ポート番号 : 4500/500
    • LAN側ポート: 4500/500
    • 転送先 : 192.168.11.102 ※Raspberry Pi の Local IP アドレスは利用環境に合わせ読み替え
    • パススルー設定: 使用
    2.1 UDPポート4500番の追加

    以下のように登録。
    port1.png

    2.2 UDPポート500番の追加

    以下のように登録。
    port2.png

    2.3 追加したポートの一覧確認

    以下のように表示される。
    port3.png

    2.4 パススルー設定

    以下のように設定。
    pass-through.png

3. Raspberry Pi 上で VPN サーバ構築

  • 今回は strongSwan を導入。(Version5.9.8) ※2025.9.20執筆時点
  • Raspberry Pi にログインして作成。

3.1 インストール

bash
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 鍵で作成

    bash
    sudo mkdir -p ~/pki
    cd ~/pki
    openssl genrsa -out ca-key.pem 2048
    
    3.2.2 ca-cert.pem(CA証明書)

    有効期限を 365日(1年) に設定。

    bash
    cd ~/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 2048
    
    3.2.4 server-cert.pem(サーバ証明書)の作成
    bash
    cd ~/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 x
    
    3.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 配下にそれぞれ配置。

bash
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 となっていることを確認

bash
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-sha1
    
    3.4.2 /etc/ipsec.secrets の編集

    VPNユーザを追加。
    vpnuser :ユーザID
    password :パスワード

    ipsec.secrets
    : RSA "server-key.pem"
    vpnuser : EAP "password"-modp1024
    
    3.4.3 IPv4 のパケット転送(IP フォワーディング)の設定と有効化

    net.ipv4.ip_forward=1 を設定。

    bash
    echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ikev2.conf
    sudo sysctl --system 
    
    3.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 サービスを有効化・再起動
    bash
    sudo systemctl enable strongswan-starter
    sudo systemctl restart strongswan-starter
    
    3.5.2 ポート確認
    ss -lunp → UDP の LISTEN 状態を表示。
    :500 は IKE (ISAKMP) 用ポート。
    :4500 は NAT-T (NAT Traversal) 用ポート。
    charon プロセスの LISTEN を確認、あればVPN 接続を受け入れ準備ができている。
    bash
    sudo ss -lunp | grep -E ':500|:4500'    # charon が LISTEN
    
    3.5.3 セキュリティアソシエーション (SA) の状態確認
    VPN トンネルの確立を確認
    bash
    sudo ipsec statusall                    # SA が貼れたらOK
    

4. Firewall設定

  • ufw (Uncomplicated Firewall)を利用
    4.1 インストール
    bash
    sudo apt update
    sudo apt install ufw
    
    4.2 デフォルトポリシー
    • 受信 (incoming): デフォルトは拒否(deny)
    • 送信 (outgoing): デフォルトは許可(allow)
    bash
    sudo ufw default deny incoming
    sudo ufw default allow outgoing
    
    4.3 必要ポートの許可
    • VPN 用 UDP ポート(Anywhere 許可)
    bash
    sudo ufw allow 500/udp
    sudo ufw allow 4500/udp
    
    • LAN 内限定の HTTP アクセス(80/tcp)
    bash
    udo ufw allow from 192.168.11.0/24 to any port 80 proto tcp
    
    4.4 有効化・設定確認
    bash
    sudo ufw enable
    sudo ufw status verbose
    

5. 不正アクセス防御設定

  • fail2banを利用
    5.1 インストール
    bash
    sudo apt update
    sudo apt install fail2ban
    
    5.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 = 10m  
    
    5.3 有効化・起動・設定確認
    bash
    sudo 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インストール済の) スマホと共有するのが一番簡単

    bash
    cp /etc/ipsec.d/cacerts/ca-cert.pem ~/pki/
    openssl x509 -in ~/pki/ca-cert.pem -outform der -out ~/pki/ca-cert.cer
    
    6.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設定

    • 「スタート」⇒「設定」⇒「ネットワークとインターネット」⇒「VPN」⇒「VPNを追加」
    • 以下の設定を行う
      vpn_connect_win.png
    • 保存後、VPN接続が追加されているので「接続」を押下。
      成功すれば下記の表示になる。
      vpn_connected_win.png

8. クライアント設定(macOS)

  • 持っていないので試せていません。

9. コマンドリファレンス

  • strongSwan(IKEv2/IPsec)
    • 起動
    bash
    sudo systemctl start  strongswan-starter
    
    • 停止
    bash
    sudo systemctl stop   strongswan-starter
    
    • 再起動
    bash
    sudo systemctl restart strongswan-starter
    
    • 状態
    bash
    sudo systemctl status strongswan-starter --no-pager -l
    
    • 自動起動 ON
    bash
    sudo systemctl enable  strongswan-starter
    
    • 自動起動 OFF
    bash
    sudo systemctl disable strongswan-starter
    
    • ログ(直近)
    bash
    sudo journalctl -u strongswan-starter -n 100 --no-pager
    
    • ログ(追尾)
    bash
    sudo journalctl -u strongswan-starter -f
    
    • 設定の再読み込み(ipsec.conf, ipsec.secrets を変更後)
    bash
    sudo ipsec reload
    sudo ipsec rereadsecrets
    
    • 状態確認(SA/トンネルの詳細)
    bash
    sudo ipsec statusall
    
    サーバ(right=%any)運用では通常「受け側」なので ipsec up/down は不要。
    クライアント側から接続すると自動で確立される。
  • nftables(フォワード許可ルール)
    • 起動
    bash
    sudo systemctl start nftables
    
    • 停止
    bash
    sudo systemctl stop  nftables
    
    • 再起動
    bash
    sudo systemctl restart nftables
    
    • 状態
    bash
    sudo systemctl status nftables --no-pager -l
    
    • 自動起動 ON
    bash
    sudo systemctl enable  nftables
    
    • 自動起動 OFF
    bash
    sudo systemctl disable nftables
    
    • 現在のルール表示
    bash
    sudo nft list ruleset
    
    • 現在のルールのクリア
    bash
    sudo nft flush ruleset
    
    • 現在のルールの保存(永続化)
    bash
    sudo nft list ruleset | sudo tee /etc/nftables.conf >/dev/null
    
    • VPN←→LAN の転送許可
      設定済
    bash
    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
    
  • IP 転送
    • 現在の値を確認(1=有効, 0=無効)
    bash
    sysctl -n net.ipv4.ip_forward
    
    • 一時的に有効に変更
    bash
    sudo sysctl -w net.ipv4.ip_forward=1
    
    • 一時的に無効に変更
    bash
    sudo sysctl -w net.ipv4.ip_forward=0
    
    • 永続化(設定ファイル反映)
    bash
    echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ikev2.conf
    sudo sysctl --system
    
  • 動作確認
    • UDP 500/4500 の待ち受け(charonがLISTENしているか)
    bash
    sudo ss -lunp | grep -E ':500|:4500'
    
    • strongSwan の状態
    bash
    sudo ipsec statusall
    
    • 接続直後のログ(原因切り分け)
    bash
    sudo journalctl -u strongswan-starter -n 100 --no-pager
    
    • パケットが来ているか(wlan0:宅内側IF。環境によりeth0等)
    bash
    sudo tcpdump -ni wlan0 'udp port 500 or udp port 4500'
    
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?