====== Strongswan: приручаем сильного и независимого лебедя. ====== ---- ===== Задача ===== Есть сервер с FreeBSD 12.1. За ним находится приватная сеть. Необходимо предоставить клиентам из интернета доступ к ресурсам, которые находятся внутри этой сети. Поскольку устанавливать никакого дополнительно программного обеспечения на устройства клиентов не хочется, то выбор пал на нативный ipsec IKEv2. Реализовывать это будем при помощи **Strongswan**. Для шифрования трафика возмем сертификаты от [[freebsd:network:letsencrypt|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 ==== SSL ==== Создаем линки на сефтификаты: # 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 Если Вы так же используете сертификаты от letsencrypt, то у windows клиентов могут возникнуть проблемы с проверкой сертификата. Для того, чтобы это исправить надо скачать еще один сертификат и положить его в /usr/local/etc/ipsec.d/cacerts. Клиенты с macOS и iOS будут подключатся и без этого. # wget https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem -O /usr/local/etc/ipsec.d/cacerts/lets-encrypt-x3-cross-signed.pem ==== ipsec.conf ==== Создаем файл /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 * **leftsubnet** сюда прописываем диапазон ip адресов, которые будут доступны через туннель. В моем случае это 10.0.2.0/24 * **rightsourceip** здесь прописываем какие адреса будут выдаваться клиентам: 10.0.2.0/24 * **rightdns** список DNS серверов, которые необходимо добавить клиенту. * Для клиентов с macOS и iOS надо еще прописать **leftid** ==== Настройка пользователей ==== Осталось прописать пользователей и их пароли. Делается это в файле /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" ==== Firewall ==== Последний штрих - необходимо открыть на вход 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 Если нет ошибок, то идем настраивать клиента и пробуем подключится.