みなさん、こんにちは。
VPN接続は業務で利用したことがある方も多いのではないでしょうか?
私の場合、ここ数年、クラウドサーバーやクラウドストレージが普及して、出先から事務所のネットワークに接続する機会がめっきり減っていたんです。でも、先日、どうしても出先のAndroid端末から事務所のネットワークにアクセスする必要が出てきました。
「よし、VPNでつなぐぞ!」と意気込んで、以前使っていたL2TP/IPsecの設定を使おうとしたら、ここでまさかの問題にぶつかりました。なんと、Android 12以降ではL2TP/IPsecのVPN接続が削除されており、IKEv2/IPsecのVPN接続しか使えなくなっていたんです!
ルーター買い替えか?いや、待てよ、Raspberry Piがあるじゃないか!
仕方がないので、VPNサーバー機能を有効にしているルーターの設定を変更しようと思ったのですが、これがまた困ったことに、事務所のルーターがヤマハのNVR500という年季の入った機種で、IKEv2/IPsecのVPNサーバーに対応していませんでした。
「これはルーターを買い替えるしかないか」と調査を開始したのですが、IKEv2/IPsecサーバーに対応した業務用ルーターというのは意外と値が張るという現実に直面しました。「痛い出費だな」と思っていたところ、ふと手元に使っていないRaspberry Piがあることを思い出しました。これだ!活用しない手はないですよね!
そこで今回は、使っていないRaspberry Piと古き良きヤマハNVR500ルーターを組み合わせて、社外からAndroid 12以降の端末でVPN接続するための方法を解説したいと思います。
今回のVPN構築の概要と前提
まずは、今回構築するVPNの概要をざっくりと見ていきましょう。
- VPNプロトコル: IKEv2/IPsec
- 認証方式: 事前共有鍵(PSK)
- Android 12以降の標準VPN機能に「IKEv2/IPsec PSK」の選択肢があるため、今回はこの方式を優先します。
- ただし、全てのAndroid端末でIKEv2認証が安定して動作するとは限らないので、注意が必要です。必要であれば、証明書認証なども検討してみてくださいね。
- VPNサーバーソフトウェア: strongSwan
- Raspberry PiのIPアドレス: 192.168.xx.50 (LAN内で固定IPアドレスに設定してください)
- VPNクライアントに割り当てるIPアドレス範囲: 10.10.10.0/24 (LAN側のIPアドレス範囲とは絶対に重複しないようにしてください!)
- Raspberry PiのOS: Debian系 (今回はJessieを使ったのですが、Buster、Bullseye、Bookwormでも問題なく動作するはずです)
では早速、具体的な設定に入っていきましょう!
Raspberry Pi (Debian) サーバー側の設定
まずはRaspberry Pi側の設定から進めます。SSHで接続して作業を進めます。
1. strongSwanパッケージのインストール
strongSwanは、IKEv2/IPsec VPNサーバーを実現するためのソフトウェアです。まずはこれをインストールしましょう。
sudo apt-get update
sudo apt-get install strongswan
2. strongSwan設定ファイル(/etc/ipsec.conf)の編集
strongSwanのメイン設定ファイルである/etc/ipsec.conf
を編集します。既存の設定があっても、今回のIKEv2/IPsec PSK用の設定を上書きする形でOKです。既存の設定を壊したくない場合は、conn ikev2-pskブロックのみを追記してください。
sudo vi /etc/ipsec.conf
ファイルを開いたら、以下の内容を追記してください。
# ipsec.conf - strongSwan IPsec configuration file
# basic configuration
config setup
# strictcrlpolicy=yes
# uniqueids = no
conn %defalut
auto=add
conn ikev2-psk
auto=add
keyexchange=ikev2
authby=secret
type=tunnel
left=%any
leftid=mydomain.xxx.netvolante.jp # ここをサーバーのFQDNまたは公開IPアドレスに置き換えてください
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightsourceip=10.10.10.0/24 # クライアント向けIPレンジ。LANのIP(192.168.xx.0/24)と重複しないように注意!
ike=aes256-sha256-modp2048
esp=aes256-sha256
dpdaction=clear
fragmentation=yes
forceencaps=yes # NAT配下の場合に有効
#include /var/lib/strongswan/ipsec.conf.inc
【設定のポイント】
leftid
- ここには、ヤマハのネットボランチDNSで取得したFQDN(例:
mydomain.xxx.netvolante.jp
)を設定します。公開IPアドレスでも構いませんが、今回はネットボランチDNSを前提として進めます。
- ここには、ヤマハのネットボランチDNSで取得したFQDN(例:
rightsourceip
- VPNクライアントに割り当てるIPアドレスの範囲を指定します。事務所のLANのIPアドレス範囲(192.168.xx.0/24)とは絶対に重複させないでください! ここが重複すると、通信障害が発生してしまいます。例として
10.10.10.0/24
を設定していますが、ご自身の環境に合わせて変更してください。
- VPNクライアントに割り当てるIPアドレスの範囲を指定します。事務所のLANのIPアドレス範囲(192.168.xx.0/24)とは絶対に重複させないでください! ここが重複すると、通信障害が発生してしまいます。例として
3. strongSwan秘密情報ファイル(/etc/ipsec.secrets)の編集
次に、事前共有鍵(PSK)を設定するファイル/etc/ipsec.secrets
を編集します。
sudo vi /etc/ipsec.secrets
ファイルを開いたら、以下の内容を設定します。IKEv2/IPsec PSK認証では、このPSK行だけでOKです。
mydomain.xxx.netvolante.jp %any : PSK "psk_frase" # "psk_frase" は任意の強力な事前共有鍵に置き換えてください。
【設定のポイント】
mydomain.xxx.netvolante.jp
- 上記
ipsec.conf
のleftid
と完全に一致するFQDNを設定してください。
- 上記
"psk_frase"
- ここに設定する文字列が、VPNクライアント側で入力する「IPSec事前共有鍵」になります。推測されにくい、強力な文字列を設定しましょう!
4. strongSwanサービスの再起動
設定変更を反映するために、strongSwanサービスを再起動します。
sudo systemctl restart strongswan
5. IP転送の有効化
VPNクライアントから事務所のLAN内のデバイス(例えばプリンターやNASなど)にアクセスできるように、Raspberry PiでIP転送を有効にします。サーバー再起動後も有効になるように、/etc/sysctl.conf
に追記します。
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
tee -a
を使うと、root
権限でファイルに内容を追記できます。便利ですね!
6. iptables(ファイアウォール)の設定
VPNクライアントからの通信をLAN内に転送し、さらにインターネットに出す際にNAT変換(IPアドレスを変換する処理)を行うためのiptables
ルールを設定します。
もし既存のL2TP/IPsecのMASQUERADEルールがある場合でも、今回設定したIKEv2クライアント用のIPアドレス範囲 (10.10.10.0/24
) に対する新しいルールが必要です。
eth0
はRaspberry PiのLAN側インターフェース名に置き換えてください。ip a
コマンドで確認できますよ(例: enp0s3
, ens33
など)。
# VPNクライアントからの通信をLAN外に出す際にNAT変換(MASQUERADE)するルールを追加
sudo iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
# VPNクライアント (10.10.10.0/24) からLAN内 (192.168.xx.0/24) への通信を許可
sudo iptables -A FORWARD -s 10.10.10.0/24 -d 192.168.xx.0/24 -j ACCEPT
# 確立済み/関連する接続のパケット転送を許可 (双方向通信のために重要です!)
sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
【重要!】ルールの永続化
これらのルールは、このままではRaspberry Piを再起動すると消えてしまいます。再起動後もルールを保持するために、iptables-persistent
をインストールし、ルールを保存しましょう。
sudo apt-get install iptables-persistent
インストール時に「現在のiptablesルールを保存しますか?」と聞かれたら、迷わず「はい」を選択してください。
後からルールを変更したり、追加したりした場合は、以下のコマンドで手動で保存できます。
sudo netfilter-persistent save
ヤマハ NVR500 ルーター側の設定
次に、ヤマハNVR500ルーターの設定です。インターネット側からのVPN通信を、先ほど設定したRaspberry Pi(192.168.xx.50
)へ転送する設定が必要になります。
今回はネットボランチDNSサービスの利用を前提としていますので、事前にネットボランチDNSの取得を済ませておいてくださいね。
1. 必要なポートの確認
IKEv2/IPsecに必要なポートは以下の通りです。
- IKE (IKEv1/v2): UDP 500
- NAT Traversal (NAT-T): UDP 4500
- IPsec ESP (カプセル化): IPプロトコル番号 50 (TCP/UDPではありません!)
2. 静的IPマスカレード(ポートフォワード)の設定
NVR500のWeb GUI、またはコマンドラインから設定を行います。
Web GUIでの設定
- NVR500のWeb GUIにログインします。
- 「詳細設定と情報」→「基本接続の詳細な設定」→「設定されているプロバイダの一覧の設定」→「静的IPマスカレード関連の追加」を開きます。
- 以下の項目それぞれを追加します。
- IKEv2用(UDP/500)
- プロトコル: UDP
- ポート番号: 500
- 宛先アドレス:
192.168.xx.50
(Raspberry PiのIPアドレス)
- NAT-T用(UDP/4500)
- プロトコル: UDP
- ポート番号: 4500
- 宛先アドレス:
192.168.xx.50
(Raspberry PiのIPアドレス)
- IPsec ESP(プロトコル番号50)
- プロトコル: ESP
- 宛先アドレス:
192.168.xx.50
(Raspberry PiのIPアドレス)
- IKEv2用(UDP/500)
- 設定後、「設定の確定」→「保存」→「反映」をクリックして適用します。
コマンドラインでの設定例
# nat descriptor type 番号 pp
# nat descriptor address outer 番号 primary
# nat descriptor address inner 番号 192.168.xx.50
# nat descriptor masquerade static 番号 1 500 udp 500
# nat descriptor masquerade static 番号 2 4500 udp 4500
# nat descriptor masquerade static 番号 3 esp esp
番号
は適切なnat descriptor
番号に置き換えてください(例: 1000
など)。
3. IPフィルター(ファイアウォール)の緩和
ポート転送だけでなく、NVR500のファイアウォールで外部からの該当ポートへの通信を「許可」する必要があります。
Web GUIでの設定
- NVR500のWeb GUIで「詳細設定と情報」→「ファイアウォール設定」→「PP(インターネット接続しているインターフェース)」→「IPv4フィルタ」を開きます。
- 以下の項目を設定し、「pass」に設定します。
- 宛先を
192.168.xx.50
とし、プロトコルUDPでポート500を許可。 - 宛先を
192.168.xx.50
とし、プロトコルUDPでポート4500を許可。 - 宛先を
192.168.xx.50
とし、プロトコルESPを許可。
- 宛先を
コマンドラインでの設定例
# ip filter 番号 pass * 192.168.xx.50 udp 500
# ip filter 番号 pass * 192.168.xx.50 udp 4500
# ip filter 番号 pass * 192.168.xx.50 ipsec-esp
# ip pp 番号 ip filter in 番号
番号
は適切な番号に置き換えてください。
Android側の設定
VPNサーバーの設定が完了したら、いよいよAndroid端末でVPN接続を設定してみましょう!
Android (12以降)
Androidの標準VPN機能には「IKEv2/IPSec PSK」の選択肢があります。事前共有鍵のみでVPN接続が可能なはずです。
- 設定 → ネットワークとインターネット → VPN → +ボタン をタップします。
- タイプ:「IKEv2/IPSec PSK」を選択します。
- サーバーアドレス:
mydomain.xxx.netvolante.jp
(サーバーのFQDN)。 - IPSec ID:
mydomain.xxx.netvolante.jp
(サーバーのFQDN。ipsec.conf
のleftid
と一致させてください)。 - IPSec事前共有鍵:
ipsec.secrets
で設定したPSK文字列(例:"psk_frase"
)。
これで接続できるはずです。私は無事接続に成功しました!
最終確認とトラブルシューティング
「あれ?つながらない…?」そんな時は、慌てずに以下の点をチェックしてみてください。
- strongSwanサーバーの再起動
- 全ての設定変更後、必ず
sudo systemctl restart strongswan
を実行しましたか?
- 全ての設定変更後、必ず
- ルーターの再起動
- NVR500の設定変更を確実に適用するため、可能であればルーターも再起動してみましょう。
- ポート開放の確認
- 外部からVPNに必要なポート(UDP 500, 4500、ESPプロトコル)が開いているか、ポートチェックツールなどで確認してみましょう。
- ログの確認
- 接続できない場合は、Raspberry Pi上でstrongSwanのログ(
sudo journalctl -u strongswan
など)を確認してみてください。エラーメッセージが原因特定の手がかりになります。
- 接続できない場合は、Raspberry Pi上でstrongSwanのログ(
- IPアドレスの重複
- VPNクライアントに割り当てるIPアドレス範囲(
rightsourceip
)が、事務所のLANのIPアドレス範囲(192.168.xx.0/24
)と重複していないか、再度確認してください。これが最もよくある問題の一つです!
- VPNクライアントに割り当てるIPアドレス範囲(
これらの手順で、Android 12以降の端末からIKEv2/IPsec PSKでのVPN接続が可能になるはずです!
ちょっとだけ補足
ちなみに、私の場合、Android以外の端末からの接続のためにL2TP/IPsecの設定も残しています。そのため、Android端末でのみ「IKEv2/IPSec PSK」を選択するようにしています。
もしL2TP/IPsecも必要な場合は、別途設定を追加する必要があります。特にiOS/macOSでは、IKEv2/IPsec PSK認証は成功しないケースもあるので、実際の運用では、他の接続方法(証明書認証など)も検討することをおすすめします。
本日も最後までお読みいただきありがとうございました。
それでは、よいVPNライフを!