В последних версиях мобильной и настольной ОС компании Apple появилась полноценная поддержка VPN подключений по IKEv2. В системах компании Microsoft она была реализована еще с Windows 7. Таким образом можно предположить, что IKEv2 станет мультиплатформенным стандартом для виртуальных сетей, заменив устаревший и небезопасный PPTP.
В данной статье будет описана настройка StrongSwan как сервера IKEv2 VPN, а также проверено подключение к нему с Windows и MacOS.
VPN сервер и клиенты IKEv2 могут аутентифицировать себя как по ключам, так и по сертификатам. Причем для каждой стороны можно задать свой выбор. Для уменьшения требований, предъявляемых к клиентам, было выбрано чтобы сервер StrongSwan аутентифицировал клиентов по логину и паролю, а VPN клиенты аутентифицировали сервер по сертификату, выданному доверенным центром сертификации.
Последовательность действий:
- Получение сертификата для сервера StrongSwan
- Установка и настройка сервера StrongSwan
- Проверка подключения к серверу с Windows и MacOS
-
Получение сертификата
Требование к сертификату:
- Наличие FQDN сервера в SAN сертификата
- Разрешение использования сертификата для проверки подлинности сервера
Самый простой способ получить сертификат, доверяемый клиентами по-умолчанию — это воспользоваться публичным центром сертификации. Большинство из них предлагает сертификат за деньги, но есть и бесплатные, проверенный для этого случая WoSign.
-
Установка и настройка сервера
Устанавливаем репозиторий EPEL
yum install epel-release
Устанавливаем StrongSwan
yum install strongswan
Копируем сертификат и личный ключ в папкиПуть Назначение /etc/strongswan/ipsec.d/cacerts сертификат корневого и промежуточных удостоверяющих центров в формате crt /etc/strongswan/ipsec.d/certs сертификат сервера в формате crt /etc/strongswan/ipsec.d/private личный ключ сервера Указываем личный ключ сервера из папки private и логины и пароли VPN пользователей
/etc/strongswan/ipsec.secrets
: RSA vpn.example.org.key user : EAP "123456"
Настраиваем режим работы сервера
/etc/strongswan/ipsec.conf
conn ikev2-mschapv2 dpdaction=clear dpddelay=35s dpdtimeout=2000s keyexchange=ikev2 auto=add rekey=no reauth=no fragmentation=yes leftid=vpn.example.org leftauth=pubkey leftcert=vpn.example.org.crt leftsendcert=always leftsubnet=0.0.0.0/0 eap_identity=%identity rightauth=eap-mschapv2 rightsendcert=never rightsourceip=10.9.9.0/24 rightdns=8.8.8.8
При настойке VPN нужно указать какой трафик будет отправляться в туннель. Существуют два выбора: туннелировать весь трафик или туннелировать только трафик, предназначенный для удаленной сети (split tunneling). Как можно видеть в приведенной настройке мы указали весь трафик через leftsubnet.
Также мы указали как будет производиться аутентификация сервера (сертификатом) и клиентов (eap-mschapv2, т.е. по протоколу EAP с логином и паролем из файла ipsec.secrets). Далее было указано какой туннельный IP (virtual IP) будет выдаваться клиентам и какой DNS сервер.
Далее необходимо настроить VPN сервер на работу в режиме маршрутизатора, т.е. разрешить ему передавать через себя пакеты из одной сети в другую.
/etc/sysctl.conf
net.ipv4.ip_forward=1
Настроим преобразование адреса источника, так чтобы VPN трафик, исходящий из VPN сервера в Интернет, выглядел бы так, что сервер является его источником
iptables -t nat -A POSTROUTING -s 10.9.9.0/24 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.9.9.0/24 -o eth0 -j MASQUERADE
Просмотреть добавленные правила можно через команду
iptables -vL -t nat
Chain POSTROUTING target prot opt in out source destination ACCEPT all -- any eth0 10.9.9.0/24 anywhere policy match dir out pol ipsec MASQUERADE all -- any eth0 10.9.9.0/24 anywhere
Открываем порты для IKEv2 трафика
iptables -I INPUT -p udp --dport 500 -j ACCEPT
iptables -I INPUT -p udp --dport 4500 -j ACCEPT
iptables -I INPUT -p esp -j ACCEPT
Chain INPUT target prot opt in out source destination ACCEPT esp -- any any anywhere anywhere ACCEPT udp -- any any anywhere anywhere udp dpt:ipsec-nat-t ACCEPT udp -- any any anywhere anywhere udp dpt:isakmp
Поскольку речь идет про дополнительные заголовки, могут возникнуть проблемы с IP фрагментацией. Для того чтобы этого избежать, нужно указать MSS используемый при установке TCP соединения, чтобы сегмент вмещал в себя пакет целиком.
iptables -t mangle -I FORWARD -p tcp -m policy --pol ipsec --dir in --syn -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
iptables -t mangle -I FORWARD -p tcp -m policy --pol ipsec --dir out --syn -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
Chain FORWARD target prot opt in out source destination TCPMSS tcp -- any any anywhere anywhere policy match dir out pol ipsec tcp flags:FIN,SYN,RST,ACK/SYN tcpmss match 1361:1536 TCPMSS set 1360 TCPMSS tcp -- any any anywhere anywhere policy match dir in pol ipsec tcp flags:FIN,SYN,RST,ACK/SYN tcpmss match 1361:1536 TCPMSS set 1360
Для сохранения правил при перезагрузках их нужно добавить в файл
/etc/sysconfig/iptables
Для применения всех настроек лучше перезапустить машину.Проверить статус StrongSwan можно командой
swanctl -L
ikev2-mschapv2: IKEv2 local: %any remote: %any local public key authentication: id: vpn.example.org certs: CN=vpn.example.org remote EAP authentication: ikev2-mschapv2: TUNNEL local: 0.0.0.0/0 remote: dynamic
Статус сервиса сервера выводится командой
systemctl status strongswan
Посмотреть вывод общесистемного лога можно командой
journalctl -e
-
Проверка подключения с Windows
Для создания подключения в Windows последних версий можно воспользоваться современной настройкой «Параметры компьютера». Перейти в раздел Сеть -> Подключения и нажать «Добавление VPN-подключения». Выбрать поставщика Windows, адрес подключения ввести FQDN нашего VPN сервера (сертификат для него должен быть также выдан на это имя). Тип VPN выбрать IKEv2. В имени пользователя и пароле вводим данные, которые ввели в файле ipsec.secret.
В итоге у нас должно получиться следующая настройка
Windows 8.1
Windows 10
Далее нажав на значок сети в трее, можно будет подключиться через созданный VPN.При подключении клиента, StrongSwan добавляет в таблицу маршрутизации №220 маршрут до этого клиента. По умолчанию при выводе таблицы маршрутизации, показываются маршруты только из таблицы по умолчанию, для вывода маршрутов из таблицы 220 нужно использовать команду:
ip route show table 220
10.9.9.1 via 10.1.1.1 dev eth0 proto static
Маршрут показывает, что чтобы достичь туннельного адреса VPN клиента пакет отправляется на шлюз в локальной сети VPN сервера.
Проверим адрес VPN сервера. Обратите внимание, что никакого туннельного адреса VPN серверу не назначается.
ip address show
2: eth0: inet 10.1.1.4/24 brd 10.1.1.255 scope global eth0
Проверим маршрут по умолчанию на VPN сервере
ip route show
default via 10.1.1.1 dev eth0 proto static metric 100
Проверить прослушивание портов можно командой
ss -nuta | grep 500
udp UNCONN 0 0 *:4500 *:* udp UNCONN 0 0 *:500 *:*
Посмотрим таблицу маршрутизации на подключенном Windows клиенте
route print
IPv4 таблица маршрута ============================================================== Активные маршруты: Сетевой адрес Маска сети Адрес шлюза Интерфейс Метрика 0.0.0.0 0.0.0.0 10.3.0.1 10.3.0.43 4235 0.0.0.0 0.0.0.0 On-link 10.9.9.1 11 10.3.0.0 255.255.255.0 On-link 10.3.0.43 4491 10.3.0.43 255.255.255.255 On-link 10.3.0.43 4491 10.3.0.255 255.255.255.255 On-link 10.3.0.43 4491 10.9.9.1 255.255.255.255 On-link 10.9.9.1 266 93.184.216.34 255.255.255.255 10.3.0.1 10.3.0.43 4236
Из таблицы видно, что имеется два маршрута по умолчанию. Маршрут через туннельный IP адрес VPN клиента с меньшей метрикой, а адрес шлюза не указан. Практически это правило означает следующее: весь трафик, не подпадающий под более точные маршруты, отправлять через интерфейс 10.9.9.1. Чтобы добраться до самого VPN сервера создается маршрут до его внешнего IP адреса через шлюз локальной сети.
Просмотрим созданный виртуальный адаптер на VPN клиенте
ipconfig /all
Адаптер PPP vpn.example.org: Описание. . . . . . . . . : vpn.example.org IPv4-адрес. . . . . . . . : 10.9.9.1(Основной) Маска подсети . . . . . . : 255.255.255.255 Основной шлюз. . . . . . .: 0.0.0.0 DNS-серверы. . . . . . . .: 8.8.8.8
Можно увидеть туннельный адрес VPN клиента, и назначенный StrongSwan DNS сервер.
Для настройки VPN подключения на MacOS нужно зайти в Настройки сети, нажать добавить подключение (+), выбрать тип VPN «IKEv2». В адрес сервера нужно ввести FQDN VPN сервера, в Remote ID также FQDN VPN сервера, Local ID оставляем пустым. Далее нажать «Настройки аутентификации» и ввести имя и пароль пользователя из ipsec.secrets.
Для настройки VPN подключения на iOS нужно зайти в Настройки -> VPN, выбрать добавить конфигурацию VPN. Тип VPN указать IKEv2, сервер и удаленный ID указать FQDN нашего сервера, имя пользователя и пароль указать из файла ipsec.secrets.