====== 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
Если нет ошибок, то идем настраивать клиента и пробуем подключится.