Содержание

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
Если Вы так же используете сертификаты от 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

Настройка пользователей

Осталось прописать пользователей и их пароли. Делается это в файле /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

Если нет ошибок, то идем настраивать клиента и пробуем подключится.