VPN сервер на основе StrongSwan на CentOS
В последних версиях мобильной и настольной ОС компании Apple появилась полноценная поддержка VPN подключений по IKEv2
. В системах компании Microsoft она была реализована еще с Windows 7. Таким образом можно предположить, что IKEv2 станет мультиплатформенным стандартом для виртуальных сетей, заменив устаревший и небезопасный PPTP.
В данной статье будет описана настройка StrongSwan как сервера IKEv2 VPN, а также проверено подключение к нему с Windows и MacOS.
VPN сервер и клиенты IKEv2 могут аутентифицировать себя - по ключам - по сертификатам.
Причем для каждой стороны можно задать свой выбор. Для уменьшения требований, предъявляемых к клиентам, было выбрано чтобы сервер StrongSwan аутентифицировал клиентов по логину и паролю, а VPN клиенты аутентифицировали сервер по сертификату, выданному доверенным центром сертификации.
Последовательность действий:
- Получение сертификата для сервера StrongSwan
- Установка и настройка сервера StrongSwan
- Проверка подключения к серверу с Windows и MacOS
Получение сертификата
Требование к сертификату:
- Наличие FQDN сервера в SAN сертификата
- Разрешение использования сертификата для проверки подлинности сервера
Самый простой способ получить сертификат, доверяемый клиентами по-умолчанию - это воспользоваться публичным центром сертификации. Большинство из них предлагает сертификат за деньги, но есть и бесплатные, проверенный для этого случая WoSign.
Другая статья по Let's Encrypt.
Установка и настройка VPN сервера
-
Устанавливаем репозиторий 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
Новая конфигурация StrongSwan через /etc/swanctl/swanctl.conf
Включает настройку как сервера так и пользователей. Выбирать нужно одну из конфигурацией (не одновременно обе).
swanctl {
load = pem pkcs1 x509 revocation constraints pubkey openssl pkcs8 random
}
connections {
eap {
local {
auth = pubkey
certs = fullchain.pem
id = vpn.domain.com
}
remote {
auth = eap-mschapv2
eap_id = %any
}
children {
eap {
local_ts = 0.0.0.0/0
start_action = start
}
}
unique = never
version = 2
dpd_delay = 30s
send_cert = always
proposals=aes128-aes192-aes256-sha1-sha256-sha384-modp1024,default
pools = ipv4
}
}
pools {
ipv4 {
addrs = 10.90.1.0/24
dns = 94.140.14.14
}
}
secrets {
private {
file=privkey.pem
}
eap-username {
id = username
secret = "userpassword"
}
}
Маршрутизация пакета в тунель
При настойке VPN нужно указать какой трафик будет отправляться в туннель. Существуют два выбора:
- туннелировать весь трафик
- туннелировать только трафик, предназначенный для удаленной сети (
split tunneling
).
Как можно видеть в приведённой конфигурации мы указали весь трафик через local_ts = 0.0.0.0/0
.
Если мы хотим туннелировать только определённую сеть, то можно изменить local_ts
. Главное не забыть добавить подсеть самого туннеля. Например, local_ts = 10.90.1.0/24, 213.59.0.0/8
.
Также мы указали как будет производиться аутентификация сервера (сертификатом) и клиентов (eap-mschapv2
, т.е. по протоколу EAP
с логином и паролем из eap-username
).
Далее было указано какой туннельный 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
MSS
Поскольку речь идет про дополнительные заголовки, могут возникнуть проблемы с 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 сервер.
MacOS
Для настройки VPN подключения на MacOS нужно
- зайти в Настройки сети
- нажать добавить подключение
+
- выбрать тип VPN
IKEv2
- В адрес сервера нужно ввести FQDN VPN сервера
- в Remote ID также FQDN VPN сервера
- Local ID оставляем пустым
- Далее нажать
Настройки аутентификации
- ввести имя и пароль пользователя из
ipsec.secrets
.
MacOS El Capitan
iOS
Для настройки VPN подключения на iOS нужно
- зайти в
Настройки -> VPN
- выбрать добавить конфигурацию VPN
- Тип VPN указать
IKEv2
- сервер и удаленный ID указать FQDN нашего сервера
- имя пользователя и пароль указать из файла
ipsec.secrets
.