☎️

EdgerouterでIKEv2/IPSec VPN Roadwarrior

2021/10/28に公開
1

外出先から自宅に接続するために、EdgerouterにL2TP/IPSec VPNを設定していた。先日スマホをAndroid12にアップグレードしたところ、L2TP/IPSec方式はInsecureだと警告が出るようになってしまった。そもそもAndroid12からはVPNに新規接続するにはIKEv2/IPSec以外の選択肢がない。安全ではないVPN方式ということで切り捨てられてしまった模様。。。

android12

ということで、今回はこの機会に自宅のEdgerouterにIKEv2/IPSecを設定してみた。
公式ドキュメントにはSite-to-Siteのゲートウェイ間VPNの設定手順はいくつか記載がある一方で、外部のある端末からLANにVPNトンネルを作成する(Roadwarriorというらしい)設定手順の記載はない。

IKEv2/IPSecとは

IKEv2(Internet Key Exchange Version2)はIPsecをベースにCiscoとマイクロソフトによって開発・実装された比較的新しいプロトコル。Windows/Linux/Mac/Android/iOSとほとんどのOSに対応していて、L2TPやPPTP,SSTPと比較してもセキュリティを犠牲にすること無くより高速接続する事が出来る。
というわけでIKEv2/IPSecが使える環境なら、あえてL2TP/IPSecに固執する必要はないと思われる。

証明書の作成

IKEv2/IPSecではVPNトンネルで使う鍵の交換を自動的に行うために、X.509証明書を利用する。認証局(CA)、サーバー証明書、クライアント証明書(ユーザごと)をそれぞれ作成する。

認証局

まずはEdgerouterで自己署名ルートCA証明書を/config/authディレクトリに作成する。

edgerouter:~$ mkdir -p /config/auth
edgerouter:~$ cd /config/auth

edgerouter:/config/auth$ pki --gen --outform pem > caKey.pem
edgerouter:/config/auth$ pki --self --in caKey.pem --dn "C=JP,CN=Edgerouter Certificate Authority" --ca --outform pem > caCert.pem

RSA秘密鍵caKey.pemと自己署名CA証明書caCert.pemが作成される。

サーバー証明書

次にVPNサーバーの認証に使用する証明書を/config/authディレクトリに作成する。
なお、以下ではVPNサーバー(EdgerouterのDDNS名)をvpn.example.comと仮定する。

edgerouter:/config/auth$ pki --gen --outform pem > vpnKey.pem
edgerouter:/config/auth$ pki --pub --in vpnKey.pem | pki --issue --cacert caCert.pem --cakey caKey.pem --dn "C=JP,CN=vpn.example.com" --san="vpn.example.com" --flag serverAuth --flag --outform pem --digest sha256 > vpnCert.pem

RSA秘密鍵vpnKey.pemが作成され、抽出した公開鍵からサーバー証明書vpnCert.pemを発行してCAで署名する。サーバー証明書はFQDN(例:vpn.example.com)で識別する。

クライアント証明書

最後にクライアントからVPNに接続するための個人証明書を作成する。クライアント証明書はFQDNではなくクライアントのメールアドレス(例:client@vpn.example.com)を使ってクライアント証明書を識別するところが違う。

edgerouter:/config/auth$ pki --gen --outform pem > clientKey.pem
edgerouter:/config/auth$ pki --pub --in clientKey.pem | pki --issue --cacert caCert.pem --cakey caKey.pem --dn "C=JP,CN=client@vpn.example.com" --san="client@vpn.example.com" --outform pem --flag clientAuth --digest sha256 > clientCert.pem
edgerouter:/config/auth$ openssl pkcs12 -export -inkey clientKey.pem -in clientCert.pem -name "client" -certfile caCert.pem -caname "Edgerouter Certificate Authority" -out clientCert.p12

RSA秘密鍵clientKey.pemが作成され、抽出した公開鍵からクライアント証明書clientCert.pemを発行してCAで署名する。

作成された必要な証明書と鍵を全てPKCS#12ファイルに詰め込んでclientCert.p12を生成してしまえば、各クライアントにはこのclientCert.p12さえ配ればOK。

VPNサーバー

EdgerouterにはIKEv2/IPSec VPNサーバーとして以下のコンフィグを投入する。

esp-settings proposalike-settings proposalには接続するクライアントに合わせてCipher Suiteを指定する。下記ではAndroid12端末向けの設定をproposal 1に、Windows10端末向けの設定をproposal 2に設定した。

{{USERNAME}}{{PASSWORD}}はクライアントからのVPN接続時に要求するローカルアカウントを任意に指定する。

set vpn ipsec allow-access-to-local-interface enable
set vpn ipsec auto-firewall-nat-exclude enable
set vpn ipsec remote-access authentication local-users username {{USERNAME}} password {{PASSWORD}}
set vpn ipsec remote-access authentication mode local
set vpn ipsec remote-access client-ip-pool subnet 192.168.3.0/24
set vpn ipsec remote-access compatibility-mode disable
set vpn ipsec remote-access dns-servers server-1 192.168.1.1
set vpn ipsec remote-access dns-servers server-2 8.8.8.8
set vpn ipsec remote-access esp-settings proposal 1 dh-group 14
set vpn ipsec remote-access esp-settings proposal 1 encryption aes256
set vpn ipsec remote-access esp-settings proposal 1 hash sha256
set vpn ipsec remote-access esp-settings proposal 2 dh-group 2
set vpn ipsec remote-access esp-settings proposal 2 encryption aes256
set vpn ipsec remote-access esp-settings proposal 2 hash sha1
set vpn ipsec remote-access ike-settings authentication mode x509
set vpn ipsec remote-access ike-settings authentication x509 ca-cert-file /config/auth/caCert.pem
set vpn ipsec remote-access ike-settings authentication x509 local-id vpn.example.com
set vpn ipsec remote-access ike-settings authentication x509 remote-id %any
set vpn ipsec remote-access ike-settings authentication x509 remote-ca-cert-file /config/auth/caCert.pem
set vpn ipsec remote-access ike-settings authentication x509 server-cert-file /config/auth/vpnCert.pem
set vpn ipsec remote-access ike-settings authentication x509 server-key-file /config/auth/vpnKey.pem
set vpn ipsec remote-access ike-settings authentication x509 server-key-type rsa
set vpn ipsec remote-access ike-settings fragmentation disable
set vpn ipsec remote-access ike-settings ike-lifetime 86400
set vpn ipsec remote-access ike-settings operating-mode ikev2-mobike
set vpn ipsec remote-access ike-settings proposal 1 dh-group 14
set vpn ipsec remote-access ike-settings proposal 1 encryption aes256
set vpn ipsec remote-access ike-settings proposal 1 hash sha256
set vpn ipsec remote-access ike-settings proposal 2 dh-group 2
set vpn ipsec remote-access ike-settings proposal 2 encryption aes256
set vpn ipsec remote-access ike-settings proposal 2 hash sha256
set vpn ipsec remote-access inactivity 28800
set vpn ipsec remote-access outside-address 0.0.0.0

なお、IKEではUDPポート500番と4500番を、ESPではIPプロトコル50番を使うため、WANインタフェースにこれらを通すようファイアウォールを事前に設定しておく必要がある。
詳しくはこちらを参照のこと。

set firewall name PPPoE_LOCAL default-action drop
set firewall name PPPoE_LOCAL description 'WAN(PPPoE) to Router'
set firewall name PPPoE_LOCAL rule 10 action accept
set firewall name PPPoE_LOCAL rule 10 description 'Allow established/related'
set firewall name PPPoE_LOCAL rule 10 state established enable
set firewall name PPPoE_LOCAL rule 10 state related enable
set firewall name PPPoE_LOCAL rule 20 action accept
set firewall name PPPoE_LOCAL rule 20 description 'Allow ping'
set firewall name PPPoE_LOCAL rule 20 destination group address-group ADDRv4_pppoe0
set firewall name PPPoE_LOCAL rule 20 log disable
set firewall name PPPoE_LOCAL rule 20 protocol icmp
set firewall name PPPoE_LOCAL rule 30 action accept
set firewall name PPPoE_LOCAL rule 30 description 'Allow IKE, NAT-T'
set firewall name PPPoE_LOCAL rule 30 destination port 500,4500
set firewall name PPPoE_LOCAL rule 30 protocol udp
set firewall name PPPoE_LOCAL rule 40 action accept
set firewall name PPPoE_LOCAL rule 40 description 'Allow ESP'
set firewall name PPPoE_LOCAL rule 40 protocol esp
set firewall name PPPoE_LOCAL rule 50 action drop
set firewall name PPPoE_LOCAL rule 50 description 'Drop invalid state'
set firewall name PPPoE_LOCAL rule 50 state invalid enable

VPNクライアント

Android端末

作成していたPKCS#12ファイルclientCert.p12を端末に配布しておき、VPN & app user certificateとしてインストールする。

そしてVPN新規作成画面から、以下のように設定する。

Name: VPN接続名
Type: IKEv2/IPSec MSCHAPv2
Server address:   vpn.example.com (VPNサーバー名)
IPSec identifier: vpn.example.com (VPNサーバー名)
IPSec CA certificate: client (インストールしたPKCS#12ファイル名)
Username: {{USERNAME}} (Edgerouterに設定したローカルユーザ)
Password: {{PASSWORD}} (Edgerouterに設定したローカルユーザのパスワード)

あとはConnectを押すとVPN接続が開始されて、出先から自宅環境にアクセスできる。
楽しい🎉

Windows端末

作成していたPKCS#12ファイルclientCert.p12を端末に配布しておき、インストールする。このとき、証明書の保存場所としては現在のユーザではなくローカルコンピュータを選択しなくてはいけないことに注意。

そしてVPN新規作成画面から、以下のように設定する。

Name: VPN接続名
VPNの種類: IKEv2
拡張認証プロトコル(EAP)を使う: Microsoft セキュリティで保護されたパスワード(EAP-MSCHAPv2) (暗号化は有効)
Username: {{USERNAME}} (Edgerouterに設定したローカルユーザ)
Password: {{PASSWORD}} (Edgerouterに設定したローカルユーザのパスワード)

あとは接続を押すとVPN接続が開始されて、出先から自宅環境にアクセスできる。
楽しい🎉

Discussion