Skip to content

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

win8_vpn.png

Windows 10

win10_vpn.png

  • Далее нажав на значок сети в трее, можно будет подключиться через созданный 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

macos_vpn.png

iOS

Для настройки VPN подключения на iOS нужно

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

Источник 1

Источник 2

Источник 3