FreeBSD, StrongSwan гордый лебедь…

В рабочем процессе встала задача установить 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 если это необходимо и прочее, прочее.

4 комментария к “FreeBSD, StrongSwan гордый лебедь…

  1. Спасибо! Убил много времени, пока не добрался до твоей статьи.
    Полезно еще про WireGuard, там целый конфликт оказался вокруг драйвера if_wg.

  2. Чтобы ipsec.conf читался, нужно указать в /etc.rc.conf
    strongswan_interface=»stroke»

  3. Да, все верно, но, так как разработчик решил перейти на новый формат, я уже решил писать статью, да и делать тоже, уже по новой версии.
    А так, да, вы правы!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *