今回はIKEv2環境を整える必要が出てきたので,そのとき環境構築をした際の備忘録.
前々から構築を試みていたのですが,なぜかうまくいかず,今回ようやくうまくいったので,その時のコマンドを残しておきます.
参考にしたサイト
今回は参考にしたサイトを先に記しておきます.当記事の内容としては先方の方の内容の焼き直しなのですが,Ubuntu20.04向けに一部修正してあります.
もしこちらの記事の内容でうまく行かなかった場合は,こちらの先方の方の記事の内容も確かめてみることをおすすめいたします.
How to Set Up an IKEv2 VPN Server with StrongSwan on Ubuntu 20.04 – DigitalOcean
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-20-04
Ubuntu 18.04でStrongSwanを使用してIKEv2 VPNサーバーをセットアップする方法
https://www.codeflow.site/ja/article/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-18-04-2
手順
strongSwanのインストール
まずはIPSecの中核であるstrongSwanをインストールします.古い記事だとlibreSwanとかopenSwanとか書いてたりするかもしれないですが,今の主流はstrongSwanです.
昔のはaptから直でインストールできないと思います.もし昔のをインストールしていたならば,削除して新しいのに乗り換えることをお勧めします.
sudo apt update
sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins
ルート証明書を用意する
ルートの証明書を用意します.Let’s encrypt!から用意してもいいし,オレオレ証明書でもいいです.以下のコマンドでは,これで4096bit長の証明書が作成できます.識別名はなんでもいいです.この例ではVPN root CAとしています.
mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki
sudo ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
sudo 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
strongSwan側の設定
ルート証明書は用意したので,今度はstrongSwan側の設定をしましょう.先ほどのルート証明書を元にVPNに使用する証明書を作成します.PUBLIC_IPの部分はサーバのパブリックIPに変更しておいてください.
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
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=PUBLIC_IP" --san PUBLIC_IP \
--flag serverAuth --flag ikeIntermediate --outform pem \
> ~/pki/certs/server-cert.pem
sudo cp -r ~/pki/* /etc/ipsec.d/
これVPNサーバ側で使用する証明書の作成はできました.
次にstrongSwanの設定ファイルである /etc/ipsec.conf の中身をいじっていきます.先にファイルのバックアップを行っておきましょう.
sudo mv /etc/ipsec.conf{,.original}
今回,VPNに割り当てるプライベートIPの空間は192.168.1.0/24としています.変更が必要であれば行ってください.そのままでも動作はすると思われます.
PUBLIC_IPの部分はVPNサーバのパブリックIPに忘れずに変更してください.ここの項目はドメインでも大丈夫ですが,その場合は「@example.com」という感じに最初にアットマークをつけてください.
/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=PUBLIC_IP
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=192.168.1.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,3des-sha1-modp1024!
esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
ユーザの認証情報
最後にユーザの認証情報を作成しましょう.今回はIDとパスワードを使用する方法で作成します.
/etc/ipsec.secrets に記録しているファイルがあるため,vim等で開いてください.サンプルではpasswordとしていますが,必ず変更してください.
# This file holds shared secrets or RSA private keys for authentication.
# RSA private key for this host, authenticating it to any other host
# which knows the public part.
: RSA "server-key.pem"
sharoron : EAP "password"
保存したら,/etc/ipsec.secrets がroot:rootの600になっていることを必ず確認してください.
root@sharo3:/etc# ls -l /etc/ipsec.secrets
-rw------- 1 root root 606 Nov 12 17:06 ipsec.secrets
ルーティングの設定
VPNサーバの設定は終わりましたが,ルーティングはまだ行っていません.早速行っていきましょう.ファイアウォールはufwを使用しています.大半の人はsshを使用してサーバの設定を行っていると思いますが,その場合は必ずsshをallowしてからenableしてください.sshからアクセスできなくなってしまいます.(これでサーバを現地まで行って再起動する羽目になったこともあります.)
sudo ufw allow OpenSSH
sudo ufw allow ssh
sudo ufw enable
sudo ufw allow 500,4500/udp
IPフォワーディングの設定も行います.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
設定が終わったら設定を再読み込みします.reloadでもいいとは思うけど,念の為,再有効化します.
sudo ufw disable
sudo ufw enable
あとOS側のIPフォワーディングも念の為有効にしておきます./etc/sysctl.conf を開き,設定を変更します.
net.ipv4.ip_forward=1
外へつながるようにする
これだけではサーバー内部のローカルネットワークには接続はできるものの,外へアクセスできません.というわけでNATの設定をしてあげましょう.
他のブログ記事ではNATではなくただのIPフォワードで対処している場合パターンが多いと思いますが,どうなんでしょうね.パブリックIPを持つサーバの場合はNATで対処してあげないと接続できないと思います.
enp0s3の部分はサーバのパブリックIPを持つインターフェースを設定してあげましょう.
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
確認
これで接続できるようになったはずです.VPNに接続するためには,/etc/ipsec.d/cacerts/ca-cert.pemにある証明書をクライアント側にインストール必要があります.scpで引っ張り出してきてもいいし,catして中身を読み出し,頑張ってコピペでもいいです.中身はこんな雰囲気なはず.
-----BEGIN CERTIFICATE-----
AxMLVlBOIHJvb3QgQ0EwHhcNMjAxMTEyMTQyODQxWhcNMzAxMTEwMTQyODQxWjAW
...
K7ueKGieecqoYvyAyj20keLdqZra9SQ1vXkHsarN8PQ3oKb2GaBJDpNiguECL1s4
9Jj908JK2M/LpA2lms0iqzvfAzU=
-----END CERTIFICATE-----
クライアント側にインストールできたら,VPNの設定をしていきましょう.今回はiOSとして説明します.設定項目は以下の通り.
- Type IKEv2
- Description [何でもいいです.わかりやすい名前]
- Server [サーバのパブリックIPアドレス]
- Remote ID [サーバのパブリックIPアドレス]
- Local ID [省略]
- User Authentication Username
- Username [ipsec.secretsに保存したやつ]
- Password [ipsec.secretsに保存したやつ]
このような感じで.スクリーンショットだとこんな感じ.
スクショの内容は適当です.こんな雰囲気ってことで.設定が終わったら保存して早速接続しましょう.Connectedになったら成功です.
まとめ
ご苦労さまです.結構長かったと思いますが,順を踏めば無事設定できたのではないでしょうか.
ubuntuを使用したVPNサーバの構築となると,ほとんどの場合がxl2tpを使用したL2TP/IPSecの設定だと思います.最もメジャーな接続方法だからだとは思いますが,ネットワークが切り替わったときとかに,手動で再接続する必要があり非常に面倒です.
このIKEv2を使用する方法はVPNの証明書を入れる必要があり,IoT機器向きではないかもしれませんが,Always on VPNを実現するのには一番楽で確実かもしれません.
うまく行かない場合は
もし,こちらの内容でうまく行かない場合用に,よくある問題をいくつか上げておきます.
クライアント側に正しく証明書がインストールできていない.
スマートフォンの場合はpemファイルをどうにかしてスマホへ転送し,それを読み込ますだけですぐにインストールできると思います.MacとiPhoneを使っている方はAirDrop経由でもインストールできます.
パソコン側でインストールする場合は,macOSの場合はKeychainの設定を,Windowsの方は証明書ストアへのインストールを確実に行ってください.
VPNサーバのlinuxの方からjournalctl -xefでリアルタイムでログを見ることができます.
IPの設定がうまく行っていない
記事内のPUBLIC_IPとかは,きちんと自身の環境に合わせて修正しましたか?できていない場合が多いです.私もよくやらかします.再度確認をお願いします.