В рабочем процессе встала задача установить IPSec туннель c IKEv2. По условиям, партнер прислал конфигурацию ipsec.conf, со своей стороны мы сгенерировали сертификаты, ключи и все что необходимо, запускали изначально на Ubuntu 20.04, ядро 5.4.0-86. Версия StrongSwan 5.8.2. После настройки и установки системы все поднялось и работало, мы перешли к тестированию, через некоторое время систему начало очень сильно freeze-ить. А далее ядро начало выдавать следующее:
watchdog: BUG: soft lockup - CPU#3 stuck for 24s! [kswapd0:132]
При этом все процессы зависали. При отключении туннеля все приходило в норму. Возможно помогла бы сборка своего .deb пакета со свежей версией StrongSwan, но делать этого не хотелось и как всегда «у нас сроки», было принято решение перейти на FreeBSD, начиная с версии 11 поддержка модулей IPSec уже включена в generic ядро. После установки системы и обновления портов встала вторая проблема, начиная с версии StrongSwan 5.9.x, производитель отказался от устаревшего формата ipsec.conf а так же ipsec.secret и полностью перешли на новый формат swanctrl.conf. Что было немного неожиданно. Старая конфигурация из ipsec.conf не работала, хотя производитель утверждает что обратная совместимость со старыми версиями есть и поддерживается. На деле это не так. Пришла пора почитать новую документацию. Ссылки прилагаю.
https://github.com/strongswan/strongswan
https://wiki.strongswan.org/projects/strongswan/wiki/Fromipsecconf
https://wiki.strongswan.org/projects/strongswan/wiki/Swanctlconf
Надо сразу оговориться что теперь сертификаты, ключи и корневые сертификаты располагаются по другим путям, отличным от привычных /etc/ipsec.d/{ acerts | acerts | cacerts | certs | crls | ocspcerts | policies | private | reqs} с новой версии это будет /etc/swanctl/{ bliss | ecdsa | pkcs8 | pubkey | x509 | x509ac | x509crl | private | rsa | x509aa | x509ca | x509ocsp }. Идем в порты и ставим StrongSwan. При конфигурировании пакета обязательно отметим утилиты для pki.
cd /usr/ports/security/strongswan/
make config-recursive
make install clean
Создаем приватный ключ для CA::
ipsec pki --gen --size 4096 --type rsa --outform pem > ca.key.pem
Создаем основной СА сертификат:
ipsec pki --self --in ca.key.pem --type rsa --dn "CN=yakunin.dev" --ca --lifetime 3650 --outform pem > ca.cert.pem
Создаем приватный ключ для сертификата сервера:
ipsec pki --gen --size 4096 --type rsa --outform pem > server.key.pem
Наконец создаем запрос на сертификат сервера, подписываем его и выпускаем:
ipsec pki --pub --in server.key.pem --type rsa | ipsec pki --issue --lifetime 3650 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=vpn.yakunin.dev" --san="vpn.yakunin.dev" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
Проверяем сертификаты:
openssl x509 -in ca.cert.pem -noout -text
openssl x509 -in server.cert.pem -noout -text
Теперь можно выполнять настройку самого StrongSwan, делаем бекап конфигурационного файла (вообще лучше взять это за профессиональную привычку, прежде чем редактировать что-то, сделай копию!), редактируем /usr/local/etc/swanctl/swanctl.conf
connections {
myvpn {
local_addrs = <ваш_внешний>
remote_addrs = <удаленный_внешний>
mobike = yes
proposals = aes256-sha1-modp2048,aes256-sha256-modp2048,aes256-sha256-ecp384
version=2
local {
auth = pubkey
certs = server.cert.pem
id = "CN=vpn.yakunin.dev"
}
remote {
auth = pubkey
id = "CN=<Common Name указанный в сертификате удаленного сервера>"
}
children {
myvpn {
# приватные сети которые мы хотим анонсировать, наша, удаленная.
local_ts = 100.10.0.0/24
remote_ts = 100.20.0.0/24
start_action = none
esp_proposals = aes256-sha256,aes256-sha1,aes256-sha256-ecp384
}
}
}
}
secrets {
private_myvpn {
file = server.key.pem
}
}
Полученные сертификаты, необходимо разложить по нужным папкам, то есть ca.cert.pem в папку x509ca, ключи в папку private и т.д., после чего можно стартовать сервер. После запуска проверяем:
# ipsec status
Security Associations (1 up, 0 connecting):
myvpn[4]: ESTABLISHED 3 hours ago, 1.1.1.1 [CN=vpn.yakunin.dev]...2.2.2.2 [CN=ipsec-remote-server.com]
myvpn{21}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: ceb5f799_i cbc20e81_o
myvpn{21}: 100.10.0.0/24 === 100.20.0.0/24
# ipsec statusall
Status of IKE charon daemon (strongSwan 5.9.3, FreeBSD 13.0-RELEASE-p4, amd64):
uptime: 15 hours, since Sep 30 21:58:54 2021
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 9
loaded plugins: charon pkcs11 aes des blowfish rc2 sha2 sha1 md4 md5 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl fips-prf curve25519 xcbc cmac hmac drbg curl sqlite attr kernel-pfkey kernel-pfroute resolve socket-default stroke vici updown eap-identity eap-md5 eap-mschapv2 eap-tls eap-ttls eap-peap xauth-eap xauth-pam whitelist addrblock counters
[skip]
Собственно, на этом все. Далее прописываем маршруты, поднимем NAT если это необходимо и прочее, прочее.
Спасибо! Убил много времени, пока не добрался до твоей статьи.
Полезно еще про WireGuard, там целый конфликт оказался вокруг драйвера if_wg.
Спасибо. Добавил!
Чтобы ipsec.conf читался, нужно указать в /etc.rc.conf
strongswan_interface=»stroke»
Да, все верно, но, так как разработчик решил перейти на новый формат, я уже решил писать статью, да и делать тоже, уже по новой версии.
А так, да, вы правы!