KUSONEKOの見る世界

iPhoneで strongSwan (IPsec VPN) に接続する (EAP-MSCHAPv2)

iPhone7 (iOS10.2) で、strongSwan 5.5.1 への接続が成功したので、記載しておきます。

接続方式としては、IKEv2 EAP-MSCHAPv2です。

strongSwanのインストールや証明書の作成については記載しません。

strongSwan側

strongSwanのコンパイル時は以下を指定しています。(不要な物も入っています。)
# ./configure --prefix=/usr --sysconfdir=/etc --enable-eap-mschapv2 --enable-eap-peap --enable-eap-radius --enable-eap-tls --enable-eap-ttls --enable-openssl --enable-eap-identity --enable-aesni

以下は、各設定ファイルです。チューニングの余地はあります。
斜体の部分は環境に応じて設定してください。

/etc/ipsec.conf

conn ios10
     left=%defaultroute
     leftcert=server.pem
     leftauth=pubkey
     leftsubnet=192.168.0.0/24
     #leftfirewall=yes
     #lefthostaccess=yes
     leftsendcert=always
     leftid=vpn.example.com
     right=%any
     rightsourceip=192.168.255.0/24
     rightauth=eap-mschapv2
     keyexchange=ikev2
     eap_identity=%any
     auto=add
     ike=aes256-sha256-modp2048!
     esp=aes256-sha256!
     dpdaction=clear
     dpddelay=30s
     dpdtimeout=10s
     rekey=no

/etc/ipsec.secrets

: RSA server-private.key 
username: EAP "password"

iPhone側

iPhoneに設定をインストールするための構成プロファイル(mobileconfig, plist)を作成します。
プロファイルの最後の方のMIIから始まる部分は、Base64 (PEM)のCA証明書の内容を貼り付けます。
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PayloadDisplayName</key>
    <string>Strongswan</string>
    <key>PayloadIdentifier</key>
    <string>com.example.vpn</string>
    <key>PayloadUUID</key>
    <string>9f93912b-5fd2-4455-99fd-13b9a47b4581</string>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
    <key>PayloadContent</key>
    <array>
        <dict>
            <key>PayloadIdentifier</key>
            <string>com.example.vpn.conf1</string>
            <key>PayloadUUID</key>
            <string>29e4456d-3f03-4f15-b46f-4225d89465b7</string>
            <key>PayloadType</key>
            <string>com.apple.vpn.managed</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>UserDefinedName</key>
            <string>Strongswan EAP</string>
            <key>VPNType</key>
            <string>IKEv2</string>
            <key>IKEv2</key>
            <dict>
                <key>RemoteAddress</key>
                <string>vpn.example.com</string>
                <key>RemoteIdentifier</key>
                <string>vpn.example.com</string>
                <key>LocalIdentifier</key>
                <string></string>
                <key>ServerCertificateIssuerCommonName</key>
                <string>vpn.example.com</string>
                <key>ServerCertificateCommonName</key>
                <string>vpn.example.com</string>
                <key>AuthenticationMethod</key>
                <string>None</string>
                <key>ExtendedAuthEnabled</key>
                <integer>1</integer>
                <key>AuthName</key>
                <string>username</string>
                <key>AuthPassword</key>
                <string>password</string>
                <key>IKESecurityAssociationParameters</key>
                <dict>
                    <key>EncryptionAlgorithm</key>
                    <string>AES-256</string>
                    <key>IntegrityAlgorithm</key>
                    <string>SHA2-256</string>
                    <key>DiffieHellmanGroup</key>
                    <integer>14</integer>
                </dict>
                <key>ChildSecurityAssociationParameters</key>
                <dict>
                    <key>EncryptionAlgorithm</key>
                    <string>AES-256</string>
                    <key>IntegrityAlgorithm</key>
                    <string>SHA2-256</string>
                    <key>DiffieHellmanGroup</key>
                    <integer>14</integer>
                </dict>
            </dict>
        </dict>
        <dict>
            <key>PayloadIdentifier</key>
            <string>com.example.vpn</string>
            <key>PayloadUUID</key>
            <string>64988b2c-33e0-4adf-a432-6fbcae543408</string>
            <key>PayloadType</key>
            <string>com.apple.security.pem</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>PayloadContent</key>
            <data>
            MII*************************************************************(省略)****************************************
            </data>
        </dict>
    </array>
</dict>
</plist>

上記をテキストファイルに貼り付け、strongswan.mobileconfig というファイル名で保存し、
iPhoneにメールなどで転送します。
あとは、iPhoneでプロファイルをインストールすれば、接続準備は完了です。

2017/01/09 追記

ipsec.conf の以下はコメントアウトしました。
     leftfirewall=yes
     lefthostaccess=yes
理由は、iptablesのルール追加に時間が掛かり、その間にiPhoneがタイムアウトで接続を切ってしまうからです。
あらかじめ、iptablesに以下のように許可しておいて、接続時のiptablesの更新をしないようにすれば、タイムアウトせずにすぐVPNが張れます。
iptables -A INPUT -s 192.168.255.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.255.0/24  -j ACCEPT
iptables -A FORWARD -d 192.168.255.0/24  -j ACCEPT

2017/12/30 追記

strongSwan 5.6.1 以降、MODP-1024がIKEのプロポーザルから外されたため、DiffieHellmanGroup 2 が使えなくなってしまいました。
以下の通り変更しています。
  • /etc/ipsec.conf
         ike=aes256-sha256-modp2048!
  • 構成プロファイル
                        <key>DiffieHellmanGroup</key>
                        <integer>14</integer>
Windowsを接続する場合は、以下のレジストリを追加する必要があります。
キー名前
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters\NegotiateDH2048_AES256REG_DWORD1

また、CPUがAES-NIに対応しているにも関わらず、有効にしていなかったので、コンパイルのオプションを追加しました。
--enable-aesni

2018/03/18 追記

こちらで、各OSで使用できるクライアント証明書をまとめました。

IKEv2で接続できた各OSの認証方式とクライアント証明書

各OSでIKEv2のVPN接続で使用できた認証方式と証明書と内容をまとめました。

2018/08/15 追記

iPhoneでクライアント証明書の認証が成功しました。

iPhoneで strongSwan (IPsec VPN) に接続する (Machine Certificates)

iPhoneでstrongSwanに証明書で接続する設定を記載しています。