🌐

GCPにIKEv2のVPNを設定してAppleデバイスから接続する

2022/11/20に公開

GCPにStrongSwanを使ってIKEv2のVPNサーバを構築し、Appleデバイス(mac, iPhone)から接続できるようにするための手順メモ。

接続デバイス

  • macOS 13.1 Ventura
  • iOS 16.1
  • iPadOS 16

サーバ側

  • Ubuntu 20.04 LTS
  • StrongSwan

GCPインスタンスの用意

GCPのインスタンスを作る。

とりあえずパラメータは↓の感じで

IP転送は入れておかないと後から変更できない

  • 名前:vpn-server
  • リージョン:asia-northeast1(東京)
  • ゾーン: asia-northeast1-a (東京)
  • シリーズ: E2
  • マシンタイプ: e2-micro
  • ブートディスク
    • OS: Ubuntu
    • バージョン:20.04 LTS
    • ブートディスクの種類: 標準永続ディスク
    • サイズ(GB): 20GB
  • ネットワーキング
    • ネットワークタグ: ikev2-vpn
    • IP転送: 許可

設定したら「作成」でインスタンスを作成

必要があれば外部IPを固定しておくと使いやすい

ファイアウォールの設定

メニュー > VPCネットワーク > ファイアウォール > ファイアウォールルールの作成
でファイアウォールのルールを追加する。

とりあえず設定は↓の感じ

  • 名前: ikev2-vpn
  • ターゲットタグ: ikev2-vpn
  • 送信元IPv4範囲: 0.0.0.0/0
  • プロトコルとポート
    • UDP: 500, 4500

設定したら「作成」

VPNサーバの設定

基本的には以下サイトの手順をそのまま実行する。

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-20-04

ssh はgcloudコマンドを使えばできる

gcloud compute ssh <インスタンス名>

StrongSwanのインストール

パッケージの更新後、StrongSwanのインストールを実行する。

sudo apt update
sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins

認証局の作成

IKEv2サーバは、クライアントに対して自身を識別するための証明書が必要になる。

strongswan-pkiパッケージを使用して証明書を作る。

ディレクトリの作成

mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki

キーの作成

ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem

証明書の署名

VPN root CAの部分は任意の文字列で問題ない

ipsec pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
    --type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem

VPNサーバの証明書を作成

VPNサーバの秘密鍵を作成する

pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem

VPNサーバー証明書を作成して署名

IP_ADDRESSの部分はGCPのパブリックIPアドレス(外部IPアドレス)を設定する

pki --pub --in ~/pki/private/server-key.pem --type rsa \
               | pki --issue --lifetime 1825 \ 
	--cacert ~/pki/cacerts/ca-cert.pem \
	--cakey ~/pki/private/ca-key.pem \
	--dn "CN=IP_ADDRESS" --san @IP_ADDRESS --san IP_ADDRESS \
	--flag serverAuth --flag ikeIntermediate --outform pem \
	> ~/pki/certs/server-cert.pem

ドメイン名の時は--dn "CN=IP_ADDRESS" --san @IP_ADDRESS --san IP_ADDRESS \の行が

      --dn "CN=server_domain" --san server_domain \

の設定になるらしい

設定ファイルの移動

sudo cp -r ~/pki/* /etc/ipsec.d/

StrongSwanの設定

設定ファイルを編集するため、編集前のものはバックアップ

sudo mv /etc/ipsec.conf{,.original}

vim等ディターを使って設定ファイルを編集

sudo nano /etc/ipsec.conf

leftを指しているのは構成しているサーバ側
rightを指しているのはクライアント側のパラメータになる

leftidには@<サーバドメイン>もしくは外部IPアドレスを記述する

また 、参考文献の設定だとiOSからの接続はできたが、macOS (Ventura)からの接続ができなかった。
ike にaes256-sha256-prfsha256-modp2048の項目を記述することで接続できた。

/etc/ipsec.conf
config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=@server_domain_or_IP
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.10.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
    eap_identity=%identity
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,aes256-sha256-prfsha256-modp2048,3des-sha1-modp1024!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!

VPN認証の設定

VPNアカウントの設定を行う

ファイルの編集

sudo vim /etc/ipsec.secrets
/etc/ipsec.secrets
: RSA "server-key.pem"
your_username : EAP "your_password"

保存して閉じる

サービスの再起動

sudo systemctl restart strongswan-starter
sudo ipsec restart

ファイアウォールの設定

VPNトラフィックを転送して許可するようにufwパッケージでファイアウォールを構成する必要がある。

sshの許可

sudo ufw allow OpenSSH
sudo ufw enable

IPsecポートの許可

sudo ufw allow 500,4500/udp

トラフィックの転送設定

以下コマンドでインターフェース名を調べる。

ip route show default

出力↓

default via xxx.xxx.xxx.xxx dev ens4 proto dhcp src xxx.xxx.xxx.xxx metric 100

この場合、インターフェース名はens4になる。

以下ファイルを編集

sudo vim /etc/ufw/before.rules

*filter項目の前に記述する。ens4の部分は適宜修正する。

*nat
-A POSTROUTING -s 10.10.10.0/24 -o ens4 -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.10.10.0/24 -o ens4 -j MASQUERADE
COMMIT

*mangle
-A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o ens4 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
COMMIT

*filterの項目の後ろに記述する

-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT

保存して閉じる。

ufwの設定編集

設定ファイルを開く

sudo vim /etc/ufw/sysctl.conf

以下項目が有効になってるのかどうか確認
すでに、記述されていない場合や、コメントアウトされている場合があるため、必要があれば追記編集する。

/etc/ufw/sysctl.conf
net/ipv4/ip_forward=1
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/all/send_redirects=0
net/ipv4/ip_no_pmtu_disc=1

ufwを有効化

sudo ufw disable
sudo ufw enable

接続テスト

証明書の取得

/etc/ipsec.d/cacerts/ca-cert.pemのファイルをscpやコピぺでクライアント側に移す。

ファイル名は.pemにしておく。

macOS

macOSの場合作成したファイルをダブルクリックしてシステムキーチェーン > 証明書に追加されるようにファイルを追加する。
インポートした証明書をダブルクリックすると信頼レベルを指定できるダイアログが開くため、IP Security (IPSec)Always Trustに設定する。(パスワード入力を求められる)

iPhone, iPad

証明書ファイルをAirDrop等で転送し、プロファイルとしてインストール。
VPN構成を設定すると接続可能

VPN設定の追加

  1. システム設定に移動し、ネットワーク
  2. ネットワークのリストの右下にある3点リーダーボタンをクリックする。
  3. 表示されるプルダウンでVPN構成を追加 > IKEv2を選択
  4. ダイアログで表示名を任意の名前で入力
  5. 「サーバアドレス」、「リモートID」のフィールドにサーバの外部IPアドレスを入力する。ローカルIDは空のままにする。
  6. 認証項目で、種類をユーザ名にして、VPNユーザとして構成したユーザ名とパスを入力する。
  7. 「作成」で保存する

チェックボックスを操作することでVPNに接続できる。

# デバッグとか

macOS

コンソールアプリにてNEIKEv2Providerとかでログを確認できる

サーバ側

syslogを確認する

sudo tail -f /var/log/syslog

charon:とかのプロセスを見るとIKEv2とかのログが流れてる。

メモ

ルーティング設定のデバイス名間違えてたので、接続しても外部ネットワークに出られない状態があった。

macOS Venturaからの接続でikeの暗号化?が設定と合わず接続でなかった時の対処に時間がかかった。

StrongSwanのドキュメントによると、以下の項目は使用が推奨されていなかったりするからちゃんと確認した方がいいかもしれない

modp512,modp768,modp1024,modp1024s160,modp1536,modp2048s224,modp2048s256,ecp192

ドメイン名で対応させたい

同時接続が1台のみのため、原因とか設定とか調べたい

参考文献

正直ほとんど真似して作った

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-20-04

https://www.codeflow.site/ja/article/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-18-04-2

https://yryr.me/linux/ubuntu-20-04-1-lts/strongswan-ipsec-ikev2-vpn-server.html

https://blog.goo.ne.jp/rabbit5151/e/bb353179593413f4f0eafcf412605cd4

https://github.com/strongswan/strongswan/discussions

Discussion