Настраиваем IPSec VPN сервер через strongSwan и On-Demand на iOS

в 16:44, , рубрики: iOS, ipsec, linux, vpn, метки: , , ,

Как же меня достало это сообщение

Всё началось с того что возникла необходимость защитить передаваемые на сервер пользовательские данные. И сделать нужно было так, что бы не заморачивать при этом пользователей корпоративных iPad'ов. Я не смог придумать ничего умнее как использовать IPSexc и VPN On-Demand на iOS. И поднимать я его решил через strongSwan.

Как же я намучился с этим… Как же я возненавидел это сообщение на картинке сверху… В интернете полно статей и готовых примеров, но все они используют авторизацию по логину и паролю.
И теперь я хочу сэконосить время тем кто отважится пройти этот тернистый путь.

Начало пути

Определимся что должны получить на выходе:

  • настроенный VPN сервер
  • клиентские сертификаты, которые мы установим на iOS

Как должно работать:
VPN должен включиться на iPad'е сам как только мы обратимся к определённом хосту, например «ya.ru». При этом не запрашивая пароль у пользователя.
Что будем использовать:

  • Ubuntu
  • strongSwan 5.0.3

Что будем делать:

  • Снегерим ключи
  • Выкачаем из git-репозитория и соберём руками strongSwan
  • Настроим конфиги

Первая кровь

Как выяснилось, RSA-авторизация в strongSwan сделана через xauth. И этот самый xauth, помимо сертификата, обязательно требует ещё и логин с пароль. Вот такая у них реализация. У strongSwan есть вполне сносное описание как поднять IPSec VPN для работы с iOS. Но проблема здесь как раз в запросе пароля. Поэтому этот вариант нам не подходит.

Но не всё так плохо! Нас спасёт Tobias Brunner и его коммит! Как раз без этого коммита у нас ничего бы и не получилось. Спасибо ему огромное. Этот код представляет собой плагин к xauth, который не требует дополнительной аутентификации пользовательского логина и пароль. Т.е. происходит только RSA-аутентификация по ключам. Что нам и нужно было!

Сертификаты

Не буду рассказывать про то как сгенерировать ключи. Это очень подробно описано в туториале от strongSwan. Я лишь хочу обратить внимание на несколько важных моментов туториала:

  1. Значение поля common name (CN) сертификата должно в точности воспадать с ip или доменным именем VPN сервера. В случае Amazon EC2 это будет что-то вроде «ecX-XX-XXX-XX-XX.eu-west-1.compute.amazonaws.com».
  2. При установке сертификатов на iPad нужно не забыть кроме клиентского PKCS#12 (*.p12) установить ещё и корневой. В туториале она называется caCert.pem.

Приступим

Перед установкой рекомендуется прочитать и внять рекомендациям по «хакингу». А точнее по сборке пакета из репозитория.

После установки всех необходимых библиотек и тулзов перейдём к сборке:

  1. Выкачаем branch с тем самым волшебным плагином: git clone git://git.strongswan.org/strongswan.git xauth-noauth strongswan-git-xauth-noauth/
  2. Создадим скрипты конфигурации: ./autogen.sh
  3. Сконфигурируем: ./configure --prefix=/usr --sysconfdir=/etc --enable-xauth-noauth
  4. Соберём пакет: sudo checkinstall -D --install=no
  5. И, наконец, установим его: dpkg -i strongswan-git-xauth_5.0.3-xauth-noauth-1_amd64.deb

Не забудьте открывать на firewall'е 500 и 4500 UDP порты, т.к. через них работает IPSec.
Разрешим проброску пакетов через NAT:

iptables --table nat --append POSTROUTING --jump MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
for each in /proc/sys/net/ipv4/conf/*
do
    echo 0 > $each/accept_redirects
    echo 0 > $each/send_redirects
done

Наконец мы можем приступить к конфигурации.

/etc/ipsec.conf

version 2.0     # conforms to second version of ipsec.conf specification

config setup
        
conn ios
      keyexchange=ikev1
      xauth=server
      leftauth=rsa
      rightauth=rsa
      rightauth2=xauth-noauth
      left=%defaultroute
      leftsubnet=0.0.0.0/0
      leftfirewall=yes
      leftcert=serverCert.pem
      right=%any
      rightsubnet=10.0.0.0/24
      rightsourceip=10.0.0.0/24
      rightcert=clientCert.pem
      auto=add
/etc/ipsec.secrets

: RSA serverKey.pem
/etc/strongswan.conf

charon {

        # number of worker threads in charon
        threads = 16
        dns1 = 8.8.8.8

        plugins {
        }
}

pluto {
        dns1 = 8.8.8.8
}

charon {
  dns1 = 8.8.8.8
}

libstrongswan {
}

Init.d скрипт слишком длинный. Его можно будет забрать здесь.

Установка сертификатов на iOS

Установить сертификаты (clientCert.p12 и caCert.pem) можно несколькоми способами:

  • Используя iPhone Configuration Utility
  • Отправив сертификаты себе по почте. И дальше получить из на iPad.
  • Скачав их с помощью Safari прямо на самом устройстве.

Лично я советую использовать iPhone Configuration Utility, т.к. только там можно задать домены для которых должен быть On-Demand VPN.

Вопросы, комментарии, критика приветствуется.
Спасибо за внимание.

Автор: iznakurnozh

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js