LinuxからIKEv2を用いてKUINS-III(京大VPN)に接続する

[前記事](https://qiita.com/matsu1024/items/b6db8c864c77f586f8af)に書いた通り, UbuntuでPPTPを用いて京都大学のVPNシステムKUINS-IIIへの接続に成功した. 
しかし, PPTP接続にはセキュリティ上の問題があり, [公式ページ](https://www.iimc.kyoto-u.ac.jp/ja/services/kuins/vpn/)ではIKEv2による接続が推奨されている. 
その一方で, Linuxによる設定方法は示されておらず，今までIKEv2により接続することができなかった. 
前回の成功に味をしめていろいろ検索していると，(Linux から京大の IKEv2 VPN に接続する方法)[https://blog.kmconner.net/archives/201]サイトを発見したので，これを参考にしてIKEv2によるVPN接続を試みる．

## パッケージのインストール
OSはUbuntu 20.04 LTSを想定していますが, 18.04 LTSでも動作すると思います．
IKEv2はstrongswanと呼ばれるパッケージを用いて設定を行うため，必要なパッケージをパッケージマネージャによりインストールします．

```cmd
$ sudo apt-get install strongswan libcharon-extra-plugins 
```

## 接続設定の作成
strongswanをインストールすると，`/etc/ipsec.conf`というファイルが作成されているはずなので，そちらに今回接続するVPNの設定を記述する．

```cmd
$ sudo cat << EOF >> /etc/ipsec.conf
conn KUINS
    auto=start
    right=<IKEv2サーバー>
    rightid=<IKEv2サーバー>
    rightsubnet=10.0.0.0/8
    rightauth=never
    left=%defaultroute
    leftsourceip=%config
    leftid=<ECS-ID>
    leftauth=eap-mschapv2
    eap_identity=%identity
    keyexchange=ikev2
    type=tunnel
    ike=aes128-sha256-modp3072
EOF

```
\<IKEv2サーバー\>の部分は[公式ページ](https://www.iimc.kyoto-u.ac.jp/ja/services/kuins/vpn/ikev2.html)
から確認できる．
KUINS-IIへ接続する場合は[ikev2.kuins.kyoto-u.ac.jp](ikev2.kuins.kyoto-u.ac.jp)とすればよい．VLAN固定接続(KUINS-III)の場合は接続するキャンパスのホスト名を選択する. また，`leftid=<ECS-ID@vlan番号>`としなければならない．
次に，EAP認証する際のパスワードを`/etc/ipsec.secrets`に追記する．

```cmd
$ sudo cat << EOF >> /etc/ipsec.secrets
ECS-ID : EAP "ECS-IDのパスワードを直打ち"
EOF
```

## サーバー証明書の設定
前述の設定でクライアント認証のための設定は完了した．あとは，サーバーまでのルートを認証するための[証明書](https://www.secomtrust.net/service/ninsyo/cer/scrootca2.txt)を設定して置かなければならない．

```cmd
$ sudo curl https://www.secomtrust.net/service/ninsyo/cer/scrootca2.txt >> /etc/ipsec.d/cacerts/key.pem
$ sudo chmod 600 /etc/ipsec.d/cacerts/key.pem
```

## 接続前の前準備
各種設定後，初回接続前に変更内容を反映させる必要がある．

```cmd
$ sudo ipsec restart   # strongswanの再起動
$ sudo ipsec reload    # 設定内容を再読込
$ sudo ipsec listcacerts  # 設定された証明書を表示
List of X.509 CA Certificates

  subject:  "C=JP, O=National Institute of Informatics, CN=NII Open Domain CA - G5"
  issuer:   "C=JP, O=SECOM Trust Systems CO.,LTD., OU=Security Communication RootCA2"
  validity:  not before Mar 22 15:33:29 2018, ok
             not after  Mar 22 15:33:29 2028, ok (expires in 2793 days)
  serial:    22:b9:b1 ...
  flags:     CA CRLSign 
  CRL URIs:  http://repository.secomtrust.net/SC-Root2/SCRoot2CRL.crl
  OCSP URIs: http://scrootca2.ocsp.secomtrust.net
  pathlen:   0
  certificatePolicies:
             1.2.392.200091.100.901.4
             CPS: https://repository.secomtrust.net/SC-Root2/
  authkeyId: 0a:85:a9 ...
  subjkeyId: 67:3a:3a ...
  pubkey:    RSA 2048 bits
  keyid:     8e:c0:9a ...
  subjkey:   67:3a:3a ...

  subject:  "C=JP, O=SECOM Trust Systems CO.,LTD., OU=Security Communication RootCA2"
  issuer:   "C=JP, O=SECOM Trust Systems CO.,LTD., OU=Security Communication RootCA2"
  validity:  not before May 29 14:00:39 2009, ok
             not after  May 29 14:00:39 2029, ok (expires in 3225 days)
  serial:    00
  flags:     CA CRLSign self-signed 
  subjkeyId: 0a:85:a9 ...
  pubkey:    RSA 2048 bits
  keyid:     3b:37:c0 ...
  subjkey:   0a:85:a9 ...

```

上記のような表示がされれば準備はOKである．

## 接続
次のコマンドで接続・切断を行うことができる．

```cmd 
$ sudo ipsec up KUINS    # VPNに接続
$ sudo ipsec down KUINS  # VPNから切断
```

## 感想
公式ページで，「LinuxはiKEv2に対応していない」とお茶を濁す意味がわかった気がする．テキストベースでの設定が多くこの方法を公開すればトラブル対応に追われるのが落ちである．しかしよく考えてみると，KUINS自体がstrongswanで構築されているのでLinuxで接続できないわけがない笑