Установка и настройка IPSEC VPN сервера с StrongSwan - CentOS 7

Руководство по настройке VPN сервера IPsec с использованием StrongSwan в качестве сервера IPsec для проверки подлинности.

  • Установка осуществляется на сервер под управлением CentOS 7
  • В качестве клиентов могут выступать операционные системы поддерживающие IPsec IKEv2 (Mac OS, Android 4+, iOS, Win7+, Ubuntu)
    • Используемые порты, которые следует открыть на файрволе 4500/UDP, 500/UDP, 51/UDP и 50/UDP

Установка Epel

yum install epel-release

Установка Strongswan

После включения Epel-релиза установим Strongswan

yum install strongswan

Запускаем VPN

systemctl enable strongswan
systemctl start strongswan

Сертификаты

Сервер VPN идентифицирует себя с сертификатом клиента.
Клиенты могут использовать сертификат для проверки подлинности себя, но в данном случае мы будем использовать простой метод по логину и паролю.

На Android с приложением StrongSwan необходимо импортировать .p12 файл, который мы создадим позднее.

Установим haveged для ускорения процесса генерации ключей.

yum install haveged
systemctl enable haveged
systemctl start haveged

Создаем самоподписанный корневой сертификат.
Генерируем приватный ключ.

cd /etc/strongswan
strongswan pki --gen --type rsa --size 4096 --outform der > ipsec.d/private/strongswanKey.der
chmod 600 ipsec.d/private/strongswanKey.der

Генерируем сертификат

strongswan pki --self --ca --lifetime 3650 --in ipsec.d/private/strongswanKey.der --type rsa --dn "C=NL, O=Example Company, CN=strongSwan Root CA" --outform der > ipsec.d/cacerts/strongswanCert.der

Просмотреть сертификат можно используя команду

strongswan pki --print --in ipsec.d/cacerts/strongswanCert.der
cert: X509
subject: "C=NL, O=Example Company, CN=strongSwan Root CA"
issuer: "C=NL, O=Example Company, CN=strongSwan Root CA"
validity: not before Sep 30 04:44:53 2015, ok
not after Sep 27 04:44:53 2025, ok (expires in 3649 days)
serial: 10:e7:4d:05:5b:1c:2c:38
flags: CA CRLSign self-signed
subjkeyId: 25:b0:d7:14:8c:e7:19:c9:c0:6c:f6:bf:a4:58:cd:dd:4c:78:d1:af
pubkey: RSA 4096 bits
keyid: 65:b7:e2:91:6e:e8:e3:68:0b:5d:3e:7e:d9:89:e6:09:2c:39:59:35
subjkey: 25:b0:d7:14:8c:e7:19:c9:c0:6c:f6:bf:a4:58:cd:dd:4c:78:d1:af

Генерируем VPN хост ключ. Это ключевая пара которую VPN сервер использует для аутентификации своих клиентов.

Сперва приватный ключ:

strongswan pki --gen --type rsa --size 2048 --outform der > ipsec.d/private/vpnHostKey.der
chmod 600 ipsec.d/private/vpnHostKey.der

Затем публичный ключ.

strongswan pki --pub --in ipsec.d/private/vpnHostKey.der --type rsa | strongswan pki --issue --lifetime 730 --cacert ipsec.d/cacerts/strongswanCert.der --cakey ipsec.d/private/strongswanKey.der --dn "C=RU, O=Example Company, CN=vpn.example.org" --san vpn.example.com --san vpn.example.net --san 123.456.789.00 --san @123.456.789.00 --flag serverAuth --flag ikeIntermediate --outform der > ipsec.d/certs/vpnHostCert.der

Доменное имя или IP-адрес сервера VPN, который используется в свойствах подключения клиентов, должны содержаться либо в CN и/или в --san. Если это не соответствует клиенты не смогут подключиться.

Приватный ключ (/etc/openswan/ipsec.d/private/strongswanKey.der) рекомендуется переместить в безопасное место, в место без доступа к интернету (например на флешку).

Кража мастер-ключа может полностью скомпрометировать инфраструктуру открытого ключа. Используйте его только для создания сертификатов клиента при необходимости.

Клиентский сертификат

Клиент должен иметь свой сертификат для использования VPN. Процесс очень похож на генерацию хост сертификата.

Создаем пару для пользователя TestUser.

Приватный ключ

cd /etc/strongswan/
strongswan pki --gen --type rsa --size 2048 --outform der > ipsec.d/private/TestUser.der
chmod 600 ipsec.d/private/TestUser.der

Публичный ключ

strongswan pki --pub --in ipsec.d/private/TestUser.der --type rsa | strongswan pki --issue --lifetime 730 --cacert ipsec.d/cacerts/strongswanCert.der --cakey ipsec.d/private/strongswanKey.der --dn "C=RU, O=Example Company, CN=TestUser@example.org" --san "TestUser@example.org" --san "TestUser@example.net" --outform der > ipsec.d/certs/TestUser.der

Клиентам VPN необходим сертификат клиента, его закрытый ключ, и подписанный сертификат CA. Наиболее удобный способ - все в одном PKCS#12

Конвертируем ключи в PEM и конвертируем в .p12

cd /etc/strongswan/
openssl rsa -inform DER -in ipsec.d/private/TestUser.der -out ipsec.d/private/TestUser.pem -outform PEM
openssl x509 -inform DER -in ipsec.d/certs/TestUser.der -out ipsec.d/certs/TestUser.pem -outform PEM
openssl x509 -inform DER -in ipsec.d/cacerts/strongswanCert.der -out ipsec.d/cacerts/strongswanCert.pem -outform PEM

И собираем .p12

openssl pkcs12 -export -inkey ipsec.d/private/TestUser.pem -in ipsec.d/certs/TestUser.pem -name "TestUser's VPN Certificate" -certfile ipsec.d/cacerts/strongswanCert.pem -caname "strongSwan Root CA" -out TestUser.p12

IPSEC конфигурация

Открываем файл конфигурации

nano /etc/strongswan/ipsec.conf

и добавляем следующее

# ipsec.conf - strongSwan IPsec configuration file
config setup
charondebug="ike 2, knl 2, cfg 2, net 2, esp 2, dmn 2, mgr 2"
conn %default
keyexchange=ikev2
ike=aes128-sha256-ecp256,aes256-sha384-ecp384,aes128-sha256-modp2048,aes128-sha1-modp2048,aes256-sha384-modp4096,aes256-sha256-modp4096,aes256-sha1-modp4096,aes128-sha256-modp1536,aes128-sha1-modp1536,aes256-sha384-modp2048,aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha256-modp1024,aes128-sha1-modp1024,aes256-sha384-modp1536,aes256-sha256-modp1536,aes256-sha1-modp1536,aes256-sha384-modp1024,aes256-sha256-modp1024,aes256-sha1-modp1024!
esp=aes128gcm16-ecp256,aes256gcm16-ecp384,aes128-sha256-ecp256,aes256-sha384-ecp384,aes128-sha256-modp2048,aes128-sha1-modp2048,aes256-sha384-modp4096,aes256-sha256-modp4096,aes256-sha1-modp4096,aes128-sha256-modp1536,aes128-sha1-modp1536,aes256-sha384-modp2048,aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha256-modp1024,aes128-sha1-modp1024,aes256-sha384-modp1536,aes256-sha256-modp1536,aes256-sha1-modp1536,aes256-sha384-modp1024,aes256-sha256-modp1024,aes256-sha1-modp1024,aes128gcm16,aes256gcm16,aes128-sha256,aes128-sha1,aes256-sha384,aes256-sha256,aes256-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftsubnet=0.0.0.0/0
leftcert=vpnHostCert.der
right=%any
rightdns=8.8.8.8,8.8.4.4
rightsourceip=10.20.30.0/24
conn IPSec-IKEv2
keyexchange=ikev2
auto=add
conn IPSec-IKEv2-EAP
also="IPSec-IKEv2"
rightauth=eap-mschapv2
rightauthby2=pubkey
rightsendcert=never
eap_identity=%any
conn CiscoIPSec
keyexchange=ikev1
forceencaps=yes
authby=xauthrsasig
xauth=server
auto=add

Эта конфигурация имеет настройки для трех типов VPN: IKEv2 + RSA, IKEv2 + EAP, и IKEv1 + Xauth RSA, таким образом, обеспечивая совместимость для широкого круга клиентов IPsec.

Клиентам с прошивкой ниже iOS 8 нужно использовать IKEv1. Apple добавила поддержку для IKEv2 в 8 версию iOS, но он должен быть настроен с помощью пользовательского профиля конфигурации.

OS X не поддерживает IKEv2 (10.10 или ниже), поэтому использовать нужно IKEv1.

Android 4+ и Windows 7+ имеют поддержку IKEv2 и могут спокойно использовать это.

Клиенты получают публичный DNS от Google и IP-адрес в диапазоне 10.20.30.0/24. В данном случае используется мощное шифрование.

leftcert=vpnHostCert.der это путь до /etc/strongswan/ipsec.d/certs/vpnHostCert.der

VPN клиенты и пароли

Клиенты настраиваются в файле конфигурации:

nano /etc/strongswan/ipsec.secrets
: RSA vpnHostKey.der
admin : EAP "YzCgnveYuL429fH"
user : EAP "E23pOjvW8z248iAp"
katy: XAUTH "xauth_ikev1_example_password"

Файрвол и роутинг пакетов

firewall-cmd --zone=dmz --permanent --add-rich-rule='rule protocol value="esp" accept'
firewall-cmd --zone=dmz --permanent --add-rich-rule='rule protocol value="ah" accept'
firewall-cmd --zone=dmz --permanent --add-port=500/udp firewall-cmd --zone=dmz --permanent --add-port=4500/udp
firewall-cmd --permanent --add-service="ipsec"
firewall-cmd --zone=dmz --permanent --add-masquerade
firewall-cmd --permanent --set-default-zone=dmz
firewall-cmd --reload
firewall-cmd --list-all
nano /etc/sysctl.conf
# VPN
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
Поделиться Комментарии