GCPにIKEv2のVPNを設定してAppleデバイスから接続する
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サーバの設定
基本的には以下サイトの手順をそのまま実行する。
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
の項目を記述することで接続できた。
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
: 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
以下項目が有効になってるのかどうか確認
すでに、記述されていない場合や、コメントアウトされている場合があるため、必要があれば追記編集する。
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設定の追加
- システム設定に移動し、ネットワーク
- ネットワークのリストの右下にある3点リーダーボタンをクリックする。
- 表示されるプルダウンでVPN構成を追加 > IKEv2を選択
- ダイアログで表示名を任意の名前で入力
- 「サーバアドレス」、「リモートID」のフィールドにサーバの外部IPアドレスを入力する。ローカルIDは空のままにする。
- 認証項目で、種類をユーザ名にして、VPNユーザとして構成したユーザ名とパスを入力する。
- 「作成」で保存する
チェックボックスを操作することで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台のみのため、原因とか設定とか調べたい
参考文献
正直ほとんど真似して作った
Discussion