IPSec MSCHAPv2で接続できるstrongSwanを構築
History
#Linux #Android #Windows #Ipsec #Strongswan

前回IKEv2/IPSec PSKで接続できるように構成したが、今回はIKEv2/IPSec MSCHAPv2で接続できるようにする。
今回もUbuntu 24.04で検証を行った。

1. インストール

基本的に前回 と同じだが、追加でlibcharon-extra-pluginsをインストールする。

2. strongswan.confの編集

ここも前回 と同様。

3. サーバー証明書の設定

自己証明書を使うことも可能だが、いちいちクライアントにCA証明書をインポートする必要があるのでLet’s Encryptなどを使うのが楽。
ここではexample.comとしているので、適宜置き換える。
鍵の形式は必ずRSAにする。(RSAにしないと一部接続できないクライアントがあるため)

Let’s Encryptを使う場合(Certbot)

$ sudo certbot certonly --key-type rsa -d example.com
$ sudo cp /etc/letsencrypt/live/example.com/privkey.pem /etc/swanctl/private/
$ sudo cp /etc/letsencrypt/live/example.com/fullchain.pem /etc/swanctl/x509/
$ sudo cp /etc/letsencrypt/live/example.com/chain.pem /etc/swanctl/x509ca/

Let’s Encryptを使う場合(Lego)

$ lego --key-type rsa2048 --email <EMAIL> --domains example.com --http run
$ sudo cp ~/.lego/certificates/example.com.key /etc/swanctl/private/
$ sudo cp ~/.lego/certificates/example.com.crt /etc/swanctl/x509/
$ sudo cp ~/.lego/certificates/example.com.issuer.crt /etc/swanctl/x509ca/

自己署名証明書を使う場合

以下のようにして作成する。

#CAの秘密鍵を作成
$ pki --gen --type rsa --size 4096 --outform pem > ca-key.pem

#CAの証明書を作成
$ pki --self --ca --lifetime 3650 --in ca-key.pem \
    --dn "C=CH, O=strongSwan, CN=strongSwan Root CA" \
    --outform pem > ca-cert.pem

#サーバーの秘密鍵を作成
$ pki --gen --type rsa --size 4096 --outform pem > server-key.pem

#サーバー証明書の作成
$ pki --pub --in server-key.pem | pki --issue --lifetime 3650 \
    --cacert ca-cert.pem \
    --cakey ca-key.pem \
    --dn "C=CH, O=strongSwan, CN=example.com" --san="example.com" \
    --flag serverAuth --flag ikeIntermediate --outform pem > server-cert.pem
    
#場所を移動
$ sudo mv server-key.pem /etc/swanctl/private/
$ sudo mv server-cert.pem /etc/swanctl/x509/

自己署名証明書を作成したら、CA証明書をクライアントにインストールする。

Android端末の場合は、ca-cert.pemを設定の証明書のインストールCA証明書からインストールする。

Windowsの場合は、ca-cert.pemの拡張子をcrtに変更しダブルクリック。 証明書のインストールローカルコンピューター証明書をすべての次のストアに配置する信頼されたルート証明機関を選択→完了の流れでインストールする。

4. 設定ファイルの作成

この例では、クライアントに10.1.0.0/24のアドレスを割り当てる。
サーバーのIPは、NATの中にある場合はグローバルIPではなくプライベートIPを入力する。

sudoedit /etc/swanctl/conf.d/mschapv2.conf

connections {
  mschapv2 {
    version = 2
    send_cert = always
    pools = pool1
    proposals = aes128gcm16-aes256gcm16-sha1-sha256-sha384-modp1024,default #これがないとWindowsが接続できない

    local_addrs = <サーバーのIPかFQDN> #接続できない場合はプライベートIPや%anyを試す
    remote_addrs = %any	
    
    local {
      auth = pubkey
      id = <グローバルIPかFQDN>
      certs = <FILENAME> #/etc/swanctl/x509/に保存したサーバー証明書のファイル名
    }

    remote {
      auth = eap-mschapv2
      eap_id = %any
    }

    children {
      net {
        local_ts = 0.0.0.0/0 #クライアントにアクセスを許可するサブネット
      }
    }
  }
}

pools {
  pool1 {
    addrs = 10.1.0.0/24 #クライアントに割り振るIP
    #dns = 1.1.1.1,1.0.0.1
  }
}

secrets {
  eap-1 {
    id = <USERNAME>
    secret = <PASSWORD>
  }
}

5. ufwの設定

前回 と同様のため省略。

6. strongSwanの起動

$ sudo systemctl start ipsec

7. クライアントの設定

Android端末の場合

VPN設定から、タイプをIKEv2/IPSec MSCHAPv2にして設定を入力する。
自己署名証明書を使っている場合は、IPSec CA 証明書でインストールしたものを選択する。
IPSec IDは入力しないと保存できないため適当な値を入力しておく

android vpn setting

Windowsの場合

VPN設定から、VPNの種類をIKEv2にし、サインイン情報の種類はユーザー名とパスワードにする。

windows vpn setting

« PythonでWebスクレイピング(Selenium)
Android12以降の端末からstrongSwanに接続 »