moriya9n.github.io

View My GitHub Profile

11 July 2018

IPSEC(IKEv2) によるVPN環境構築メモ for mac/windows/android

by moriya9n

a) 社外から社内(もしくは学外から学内)のネットワークに接続したり、b) インターネット上の特定のサーバから接続したように見せかけるのに VPN が利用される。

私の場合、リモートでメンテナンスや開発をすることが多い。セキュリティの関係で、接続が特定の IP アドレスからしか許可されていない場合がほとんどだ。

ssh でポートフォワードしてもよいのだが、毎度、ssh 接続をしたり、ssh が切れた場合につなぎなおしたりするのも面倒になってきた。また、開発中の WEB サイトが特定の IP アドレスからしか接続を許可されていない場合に、スマートフォンで確認するためには、ある程度の範囲の IP アドレスから接続を許可してやらないといけない。開発中なので、バグがあるだろうし、ちょっと恐い。テスト中のサイトが見える可能性があるというのもどうかと思う。

mac、windows、android からインターネット上のサーバに VPN 接続をしようと、システム標準の VPN メニューを使って接続しようとトライしたもののこれまで何度挫折してきたことだろうか・・・クライアント、サーバとも選択肢が多く、何を設定すれば、どこに効くのかわかりづらい。openvpn を使いたいと何度思ったことであろうか。

今回は、ipsec での接続を試行錯誤してみた。結論としては、strongswan を使って ikev2 + 証明書で設定するのが最も簡単かつ安全で、色々な端末からの接続が可能になる組み合わせではないかと思う。android に限り、strongSwan VPN Client をインストールする必要があるが、mac(High Sierra)で/windows(Windows 10) からは、他にインストールするものも不要で、システム環境設定のメニューから VPN 接続を追加するだけでよかった。

VPN サーバの環境

さくらインターネット VPS+CENTOS7。さくらインターネットの場合は、インタフェースにグローバルIPアドレスが直接割り当てられている。AWS はプライベート IP アドレスが割り振られている。(NAT?)面倒を避けるため、さくらインターネットの VPS を使用。

os インストール後、strongswan をインストールする。

(# yum install epel-release)
# yum install strongswan

設定ファイル

サーバ側

/etc/strongswan/ipsec.conf

conn ikev2
        keyexchange=ikev2
        ike=aes256-sha256-modp2048,aes256-sha256-modp1024,aes128-sha256-modp3072,aes256-sha1-modp1024!

        dpdaction=clear
        dpddelay=300s
        rekey=no
        
        left=%any
        leftsubnet=0.0.0.0/0
        leftauth=pubkey
        leftcert=cert_server.der
        leftsendcert=always
        leftid=@vpn.runserver.jp
        right=%any
        rightsourceip=10.101.1.0/24
        #rightauth=eap-mschapv2 # ユーザー名、パスワードを使う場合
        rightauth=eap-tls # 証明書を使う場合
        rightdns=8.8.8.8
        eap_identity=%any
        auto=add

(leftid のところは適当に自分のサイト用のものを設定。)

以下のファイルを作る。

作り方は、Setting-up a Simple CA Using the strongSwan PKI Toolを参考に。ipsec コマンドは strongswan コマンドに読みかえる。

ca_cert.der (dn の引数は自分の好みのものに)

$ strongswan pki --gen > ca_key.der
$ strongswan pki --self --in ca_key.der --dn "C=JP, O=runserver, CN=runserver private ca" --ca --flag sererAuth > ca_cert.der

(–flag serverAuth が必要かどうか未検証)

cert_server.der (CN=の後ろは VPN サーバの DNS 名を入れておく)

$ strongswan pki --gen > key_server.der
$ strongswan pki --pub --in key_server.der | strongswan pki --issue --cacert ca_cert.der --cakey $ ca_key.der --dn "C=JP, O=runserver, CN=vpn.runserver.jp" --flag serverAuth --san vpn.runserver.jp > cert_server.der 

(–san が必要かどうか未検証)

/etc/strongswan/ipsec.secrets

: RSA key_server.der
moriya : EAP "hogehoge"

2行目は、ユーザー名、パスワードを使用する場合、接続時に指定するユーザー名、パスワード。(証明書を使う場合は不要)

サーバ起動

/etc/sysctl.d/00-ipsec.conf

net.ipv4.ip_forward=1

(再起動、もしくは、systemctl restart systemd-sysctl)

以下を実行。

# firewall-cmd --permanent --zone=public --add-service=ipsec
# firewall-cmd --permanent --zone=public --add-port=4500/udp
# firewall-cmd --permanent --add-masquerade
# systemctl enable strongswan
# systemctl start strongswan

クライアント側

ca_cert.der もインストール。Mac の場合は、キーチェーンアクセスで証明書を信頼(情報を見る->信頼->常に信頼する)しないと接続できなかった。

クライアント側の証明書も同様にして作り、p12 ファイルにしてクライアントにインストールする。

$ strongswan pki --gen > key_client1.der
$ strongswan pki --pub --in key_client1.der | strongswan pki --issue --cacert ca_cert.der --cakey ca_key.der --dn "C=JP, O=runserver, CN=moriya@vpn.runserver.jp" --san moriya@vpn.runserver.jp > cert_client1.der

$ openssl x509 -inform der -outform pem -in ca_cert.der -out ca_cert.pem
$ openssl x509 -inform der -outform pem -in cert_client1.der -out cert_client1.pem
$ openssl rsa -inform der -outform pem -in key_client1.der -out key_client1.pem
$ openssl pkcs12 -export -inkey key_client1.pem -in cert_client1.pem -certfile ca_cert.pem -out client1.p12

(–san が必要かどうか未検証)

Windows の場合は、 IKEv2 ユーザー名とパスワード ユーザー名 パスワード を設定した後、「アダプタのオプションを変更する」で、WAN MINI Port(IKEv2) アダプタのプロパティの ネットワークタブ / インターネットプロトコルバージョン4 プロパティ 全般タブ / 詳細設定 IP 設定タブにある、「リモートネットワークでデフォルトゲートウェイを使う」 をチェックして OK。

Mac の場合は、IKEv2 の設定画面で、上記設定だと、以下のように設定する。

サーバアドレス:vpn.runserver.jp
リモートID:vpn.runserver.jp
ローカルID:moriya@vpn.runserver.jp

トラブルシュート

  1. Windows のイベントビューワで見て 13801 番のエラーコードで失敗する場合は、Troubleshooting IKEv2 VPN Connectionsなどが参考になった。
  2. 「no trusted rsa public key found」のエラーがログに表示されている場合は、自己署名した ca certificate をインストールしたか確認。

aws を使う場合

参考サイト

strongSwan のサイト

少し見づらいが、役にたった。

VPN 接続テスト用のサイト

IPSEC(IKEv2)が通過するかどうか確認するためのVPNサーバ(無料)

tags: