VPN сервер на основе StrongSwan на CentOS

В последних версиях мобильной и настольной ОС компании Apple появилась полноценная поддержка VPN подключений по IKEv2. В системах компании Microsoft она была реализована еще с Windows 7. Таким образом можно предположить, что IKEv2 станет мультиплатформенным стандартом для виртуальных сетей, заменив устаревший и небезопасный PPTP.

В данной статье будет описана настройка StrongSwan как сервера IKEv2 VPN, а также проверено подключение к нему с Windows и MacOS.

VPN сервер и клиенты IKEv2 могут аутентифицировать себя как по ключам, так и по сертификатам. Причем для каждой стороны можно задать свой выбор. Для уменьшения требований, предъявляемых к клиентам, было выбрано чтобы сервер StrongSwan аутентифицировал клиентов по логину и паролю, а VPN клиенты аутентифицировали сервер по сертификату, выданному доверенным центром сертификации.

Последовательность действий:

  1. Получение сертификата для сервера StrongSwan
  2. Установка и настройка сервера StrongSwan
  3. Проверка подключения к серверу с Windows и MacOS

  1. Получение сертификата

    Требование к сертификату:

    • Наличие FQDN сервера в SAN сертификата
    • Разрешение использования сертификата для проверки подлинности сервера

    Самый простой способ получить сертификат, доверяемый клиентами по-умолчанию — это воспользоваться публичным центром сертификации. Большинство из них предлагает сертификат за деньги, но есть и бесплатные, проверенный для этого случая WoSign.

  2. Установка и настройка сервера

    Устанавливаем репозиторий 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

  3. Проверка подключения с 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.

    MacOS El Capitan

    Для настройки VPN подключения на iOS нужно зайти в Настройки -> VPN, выбрать добавить конфигурацию VPN. Тип VPN указать IKEv2, сервер и удаленный ID указать FQDN нашего сервера, имя пользователя и пароль указать из файла ipsec.secrets.

    1. Источник 1
      Источник 2
      Источник 3

      Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s