StrongSwan. Remote Access VPN с использованием MSCHAPv2-EAP

  • Tutorial

О чем пойдет речь?


В данной статье я расскажу о том как настроить на Linux-сервере демон StrongSwan для подключения удаленных пользователей (Remote Access VPN) по протоколу IPSEC IKEv2, а в качестве протокола аутентификации клиентов будет использоваться связка MSCHAPv2-EAP.

Описание решения


В данной реализации Remote Access VPN для подключения к шлюзу клиент используется протокол EAP (RFC 3748) совместно с Microsoft CHAP version 2 для аутентификации.
Этот протокол используется в VPN – клиенте Windows 7 Agile. В дополнении к идентификации IKEv2 по IP-адресу клиент использует EAP идентификацию по определенному на шлюзе имени и паролю.
Шлюз проходит аутентификацию на клиенте с помощью сертификата RSA.
Схема моего стенда и решения на рисунке ниже.
image
Virtual IP interface — виртуальный адрес, который назначается клиенту шлюзом. Настраивается в конфигурационных файлах StrongSwan.
Основное преимущество данного решения по отношению к VPN на сертификатах в том, что не нужно импортировать каждый сертификат на клиента, достаточно знать только логин и пароль. Дополнительным преимуществом является использование для установки IPSEC соединения протокола IKEv2, который обладает рядом преимуществ по отношению к IKEv1. Описание преимуществ успешно гуглиться.

Генерация сертификатов


Генерация сертификатов является самой ответственной частью и самой трудной, именно от нее будет зависеть работоспособность нашего IPSEC=тунеля.
Сертификаты генерировались с помощью OPENSSL.
Сначала настраиваем OPENSSL:
vi  /usr/lib/ssl/openssl.cnf
[ CA_default ] 
dir     = /etc/ipsec.d              # Основная директория, в ней будут храниться все сертификаты
certificate = $dir/cacerts/strongswanCert.pem       # Здесь у нас будет лежать CA сертификат
private_key = $dir/private/strongswanKey.pem        # А здесь закрытый ключ CA сертификата

Создаем директорию для новых сертификатов и файл с серийником для OPENSSL
cd /etc/ipsec.d
mkdir newcerts
touch index.txt
echo “00” > serial

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

Создаем CA сертификат.
openssl req -x509 -days 3650 -newkey rsa:2048 -keyout private/strongswanKey.pem -out cacerts/strongswanCert.pem

Конвертируем CA сертификат в формае p.12, который понимает Windows и большинство клиентов, чтобы не было проблем с импортом
openssl pkcs12 -export -inkey private/strongswanKey.pem -in certs/strongswanCert.pem -name "host" -certfile cacerts/strongswanCert.pem -caname "strongSwan Root CA" -out CAcert.p12 


Генерируем сертификат для сервера.

Создаем запрос на сертификат.
openssl req -newkey rsa:1024 -keyout private/serverkey.pem -out reqs/serverreq.pem  

Запрашиваем сертификат у CA, с помощью ранее созданного запроса.
openssl ca -in reqs/serverreq.pem -days 730 -out certs/servercert.pem -notext

При генерации сертификата обязательно нужно задать для серверного сертификата в openssl.cnf параметр subjectAltName=IP:<external_IP>

Настройка демона StrongSwan


Установка StrongSwan легко происходит из репазитория, либо из исходников.
Вот так должен выглядеть файл /etc/strongswan.conf:
charon {
  load = curl test-vectors aes des sha1 sha2 md5 pem pkcs1 gmp random x509 revocation hmac xcbc cmac ctr ccm gcm stroke kernel-netlink socket-default updown eap-identity
}

Основные настройки должны быть выполнены в файле /etc/ipsec.conf
Секция config setup, которая определяет базовые параметры:
config setup  
       strictpolicy=no
       charonstart=yes
       plutostart=no    
       charondebug="ike 2, knl 3, cfg 0"

Секция conn, в которой настраиваются соединения
conn %default  / определяет базовые параметры всех IPSEC-соединений
     ikelifetime=60m
     keylife=20m
     rekeymargin=3m
     keyingtries=1
     dpdaction=restart
     dpdelay=30s
     dpdtimeout=180s
conn rw / название IPSEC-соединения
  left=<external_IP> / адрес внешнего интерфейса
  leftsubnet=<subnet/prefix> / подсеть, к которой мы даем доступ
  leftid=<external_IP>
  leftcert=/etc/ipsec.d/certs/servercert.pem / говорим какой сертификат использовать для установки IKE SA
  leftauth=pubkey / говорим, что мы авторизуемся у клиента с помощью сертификата RSA
  right=%any / к нам можно подключиться с любого IP
  rightauth=eap-mschapv2 
  rightsendcert=never
  rightsourceip=<subnet/prefix>  / из этой подсети будет выдаваться IP-адрес для клиента
  auto=add / подключение будет инициироваться клиентом
  keyexhcnage=ikev2
  type=tunnel


Так же нам нужно указать в файле /etc/ipsec.secrets файл открытого ключа для сертификата шлюза и учетки для EAP-пользователей
: RSA /etc/ipsec.d/private/serverkey.pem "password"
ivan : EAP "pass1"
max : EAP "pass2"


Приведенные выше настройки хранятся в файле /etc/ipsec.conf

Настройка клиента


В качестве клиента может использоваться Windows 7 или любой девайс под управлением ОС Android с установленным приложением StrongSwan VPN Client
Настройка клиента состоит из следующих пунктов:
  1. Импорт сертификата СА на клиент
  2. Настройка клиента
  3. Запуск клиента

Для Android в общем то все тоже самое.

Заключение


После того как настроили клиента и сервер можно перезапустить StrongSwan на сервере, делается это командой ipsec restart и пробовать подключиться клиентом. В случае успеха на шлюзе при выводе команды ipsec statusall состояние подключения будет в статусе established и будут весело бегать пинги между клиентом и сервером.
Чуть не забыл, чтобы у клиента был доступ к локальным ресурсам из подсети которая определяется в параметре leftsubnet нужно будет настроить маршрутизацию соответствующим образом и правила межсетевого экранирования (iptables).
Так же возможно использование StrongSwan для реализации L2TP over IPSEC (IKEv1), вероятно про это напишу позднее.
  • +5
  • 16.4k
  • 9
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 9

    0
    Спасибо.
    Напишите, как связать accel-pptp в l2tp режиме с IPSEC.
      0
      Я настраивал x2ltpd, если интересно, то распишу, пока смотреть через альтернативные варианты нет времени и не особо интересно.
    • UFO just landed and posted this here
        0
        Ок, напишу, но схем, когда VPN-шлюз является и МСЭ, и стоит на периметре очень много, а если есть NAT, то обычно транслируют один в один (порт 500 в порт 500), а т.к. NAT-T включен по умолчанию в IKEv2 все будет работать без доп. настроек в большинстве случаев. Иначе это плохой дизайн сети, непродуманный.
        • UFO just landed and posted this here
            0
            Напишу другими словами. Т.к. включен NAT-T, а NAT-устройства не блокируют IPSEC-пакеты и правильно их транслирует все работает и в такой конфигурации. В рабочей сети у меня сервер имеет белый IP, а клиенты нет и все замечательно работает именно по причине, которую указал.
            Сегодня проверю работает ли в туннельном режиме, но должно работать.
              0
              Проверил, с type=tunnel тоже работает все нормально. В общем исходя из теории согласен, что так более правильно.
        0
        Хотелось бы увидеть описание связки с RADIUS и разделения доступа для групп пользователей.
          0
          Не хочу выглядеть некропостером, но
          openssl pkcs12 -export -inkey private/strongswanKey.pem -in certs/strongswanCert.pem -name «host» -certfile cacerts/strongswanCert.pem -caname «strongSwan Root CA» -out CAcert.p12

          — здесь что-то не так.

          Only users with full accounts can post comments. Log in, please.