Всё началось с того что возникла необходимость защитить передаваемые на сервер пользовательские данные. И сделать нужно было так, что бы не заморачивать при этом пользователей корпоративных 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. Я лишь хочу обратить внимание на несколько важных моментов туториала:
- Значение поля common name (CN) сертификата должно в точности воспадать с ip или доменным именем VPN сервера. В случае Amazon EC2 это будет что-то вроде «ecX-XX-XXX-XX-XX.eu-west-1.compute.amazonaws.com».
- При установке сертификатов на iPad нужно не забыть кроме клиентского PKCS#12 (*.p12) установить ещё и корневой. В туториале она называется caCert.pem.
Приступим
Перед установкой рекомендуется прочитать и внять рекомендациям по «хакингу». А точнее по сборке пакета из репозитория.
После установки всех необходимых библиотек и тулзов перейдём к сборке:
- Выкачаем branch с тем самым волшебным плагином: git clone git://git.strongswan.org/strongswan.git xauth-noauth strongswan-git-xauth-noauth/
- Создадим скрипты конфигурации: ./autogen.sh
- Сконфигурируем: ./configure --prefix=/usr --sysconfdir=/etc --enable-xauth-noauth
- Соберём пакет: sudo checkinstall -D --install=no
- И, наконец, установим его: 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