Есть сервер с FreeBSD 12.1. За ним находится приватная сеть. Необходимо предоставить клиентам из интернета доступ к ресурсам, которые находятся внутри этой сети. Поскольку устанавливать никакого дополнительно программного обеспечения на устройства клиентов не хочется, то выбор пал на нативный ipsec IKEv2. Реализовывать это будем при помощи Strongswan. Для шифрования трафика возмем сертификаты от Let's Encrypt.
Имеется сервер под управлением FreeBSD 12.1, с доменным именем vpn.example.com, и уже выпущенными сертификатами SSL от letsencrypt. IP адреса в локальной сети: 10.0.2.0/24.
Устанавливаем security/strongswan, и включаем его в /etc/rc.conf:
# pkg install strongswan # service strongswan enable
Создаем линки на сефтификаты:
# ln -sf /usr/local/etc/letsencrypt/live/example.com/chain.pem /usr/local/etc/ipsec.d/cacerts/chain.pem # ln -sf /usr/local/etc/letsencrypt/live/example.com/fullchain.pem /usr/local/etc/ipsec.d/certs/fullchain.pem # ln -sf /usr/local/etc/letsencrypt/live/example.com/privkey.pem /usr/local/etc/ipsec.d/private/privkey.pem
# wget https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem -O /usr/local/etc/ipsec.d/cacerts/lets-encrypt-x3-cross-signed.pem
Создаем файл /usr/local/etc/ipsec.conf со следующим содержимым:
# strongSwan IPsec configuration file # basic configuration config setup # strictcrlpolicy=yes # uniqueids = no charondebug = ike 3, cfg 3 conn %default dpdaction=clear dpddelay=35s dpdtimeout=2000s fragmentation=yes rekey=no keyexchange=ikev2 ike=aes256-aes128-sha256-sha1-modp3072-modp2048-modp1024 auto=add reauth=no compress=yes left=%any leftsubnet=10.0.2.0/24 leftauth=pubkey leftcert=fullchain.pem leftfirewall=yes leftsendcert=always right=%any rightsendcert=never rightid=%any rightsourceip=10.1.2.0/24 rightdns=10.0.2.1 eap_identity=%identity # IKEv2 conn IPSec-IKEv2 keyexchange=ikev2 auto=add # BlackBerry, Windows, Android conn IPSec-IKEv2-EAP also="IPSec-IKEv2" rightauth=eap-mschapv2 # macOS, iOS conn IKEv2-MSCHAPv2-Apple also="IPSec-IKEv2" rightauth=eap-mschapv2 leftid=vpn.example.com # Android IPsec Hybrid RSA conn IKEv1-Xauth keyexchange=ikev1 rightauth=xauth auto=add
Осталось прописать пользователей и их пароли. Делается это в файле /usr/local/etc/ipsec.secrets:
# filename of private key located in /usr/local/etc/ipsec.d/private/ : RSA privkey.pem # syntax is `username : EAP "plaintextpassword"` user1 : EAP "password1" user2 : EAP "password2" user3 : EAP "password3" #user2 : XAUTH "password2"
Последний штрих - необходимо открыть на вход UDP порты 500 и 4500. А также регламентировать действия клиентов vpn. На примере pf это делается следующим образом:
pass in quick on $ext_if proto udp from any to ($ext_if) port { 500 4500 } keep state
pass from 10.1.2.1 to 10.0.2.0/24 keep state
Теперь все готово к запуску:
# service strongswan start
Если нет ошибок, то идем настраивать клиента и пробуем подключится.