Содержание
Strongswan: приручаем сильного и независимого лебедя.
Задача
Есть сервер с 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
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
# 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
Если нет ошибок, то идем настраивать клиента и пробуем подключится.
