- VPN везде и всюду: IPsec без L2TP со strongSwan
- Небольшое введение в мир IPsec
- IPsec в Linux
- Переходим к настройке
- Проблемы MTU
- Настройка клиентов
- Windows
- OS X и iOS
- Android
- Установка VPN-сервера IKEv2 StrongSwan в Ubuntu 20.04
- Требования
- 1: Установка StrongSwan
- 2: Создание центра сертификации
- 3: Генерирование сертификата для VPN-сервера
- 4: Настройка StrongSwan
- 5: Настройка аутентификации VPN
- 6: Настойка брандмауэра и IP forwarding
- 7: Тестирование VPN-соединений в Windows, iOS и macOS
- Подключение в Windows
- Подключение в macOS
- Подключение в Ubuntu
- Подключение в iOS
- Подключение в Android
- Устранение неполадок
- Заключение
VPN везде и всюду: IPsec без L2TP со strongSwan
достаточно сильный лебедь
Если вы когда-либо искали VPN, который будет работать на десктопах, мобильных устройствах и роутерах без установки дополнительного ПО и перепрошивки роутера, вы, вероятно, выбирали между PPTP и L2TP+IPsec. У протокола PPTP имеются проблемы с безопасностью и прохождением через брандмауеры и NAT, так что в 2015 году его уже использовать не стоит, а использование L2TP излишне, т.к. L2 VPN, по моему мнению, для обычного удаленного доступа не нужен практически никогда.
Удивительно, что в интернете не так-то просто можно найти информацию о настройке чего-то помимо L2TP+IPsec в транспортном режиме, учитывая, что это обширный стек протоколов, который можно конфигурировать буквально как душе угодно, поэтому я попытаюсь устранить такое несовершенство мира.
Небольшое введение в мир IPsec
Вообще говоря, не совсем правильно называть IPsec VPN. IPsec не предназначен для построения «виртуальных частных сетей», а создан для шифрования или защиты от подмены передаваемых по IP данных. Это специальный слой поверх IP, который, в зависимости от режима и настроек, работает по-разному. В отличие от привычного VPN, который создает новый интерфейс в системе, на который вы, как это чаще всего бывает, назначаете IP-подсеть из диапазона частных адресов (т.е. создаете новый сетевой сегмент), и через который маршрутизируется трафик в зашифрованном виде, IPsec просто шифрует трафик магическим образом между «внешними» интерфейсами сервера и клиента.
В современном IPsec используются:
- Authentication Header (AH) — протокол, обеспечивающий аутентификацию отправителя и целостность данных. Подписывает не только данные пакета, но и все заголовки, кроме изменяемых полей (ToS, TTL, чексумма).
- Encapsulating Security Payload (ESP) — протокол, обеспечивающий аутентификацию, целостность и конфиденциальность
- Security Association (SA) — параметр с настройками шифрования канала
- Internet Key Exchange (IKE и IKEv2) — протокол обмена параметрами, настройками и согласования SA
AH и ESP — транспортные протоколы, инкапсулируемые прямо в IP, имеющие собственные значение для поля Protocol в IP-заголовке. В современном мире, где NAT стоит за NAT у NAT с NAT’ом, следует использовать что-то более привычное, поэтому сейчас повсеместно используется инкапсуляция ESP-пакетов в UDP. AH не поддерживает работу через NAT.
Сам IPsec поддерживает работу в двух режимах:
- Транспортный режим. Подписывает заголовки и данные (если AH) или подписывает и шифрует данные (если ESP) пакета. Не скрывает IP-адрес получателя пакета, если он маршрутизируется. Этот режим используется для связки L2TP+IPsec.
- Туннельный режим. Подписывает (если AH) и еще шифрует (если ESP) весь пакет.
Протокол IKE позволяет проводить аутентификацию клиента с использованием X.509-сертификатов, Pre-Shared Key и Extensible Authentication Protocol (EAP). Поддерживается двухэтапная аутентификация.
Все современные десктопные ОС (Windows Vista/7/8/8.1, OS X, Linux), мобильные устройства (Android, iOS, Windows Phone, Blackberry) и некоторые роутеры поддерживают VPN с использованием IPsec ESP в туннельном режиме и его настройкой через протокол Internet Key Exchange (IKE) версии 1 или 2, а значит IPsec мы именно так и будем настраивать.
Кстати, писать правильно IPsec, но Cisco IPSec.
IPsec в Linux
В OpenVZ есть поддержка IPsec, и она вполне себе годна для запуска L2TP+IPsec, но там что-то явно не так с маршрутизацией на не-локальные интерфейсы. Вероятно, это можно починить добавлением пары правил на хостовую машину, но это довольно проблематично, если у вас нет доступа к ней, как бывает во подавляющем большинстве случаев. Поэтому для OpenVZ необходимо использовать userspace IPsec, который можно собрать параметром —enable-kernel-libipsec
Жизнь со swanctl:
Жизнь без swanctl:
Нам могут потребоваться некоторые модули, которых может не быть в стандартной поставке:
- xauth-noauth — поддельный аутентификатор, позволяет вводить любой логин и пароль. Нужен для iPhone и iPad при аутентификации только по ключам, т.к. там нет возможности отключить аутентификацию по логину и паролю.
- vici — интерфейс для swanctl.
- libipsec — для userspace IPsec (для OpenVZ и, возможно, других контейнеров).
Если вас не смущает необходимость вводить логин и пароль на iPhone, вам не нужен swanctl и вы не собираетесь запускать это все в OpenVZ-контейнере, то и пересобирать ничего не нужно.
К большому сожалению, мейнтейнеры strongSwan в Debian не запаковали ничего из этого (на февраль 2015), поэтому я сделал патчик, который вы можете использовать.
Переходим к настройке
Будем настраивать подключение через IKEv2 (Windows, Linux, Blackberry), IKEv1+XAUTH (iOS, OS X, Android) и IKEv2+EAP-TLS (Windows Phone). Используем ключи, никаких PSK!
Разработчики strongSwan предлагают нам использовать команду «ipsec pki» для генерации ключей, но она настолько же неудобная, насколько и обычный openssl, поэтому я адаптировал Easy-RSA v3 из OpenVPN для генерации как OpenVPN, так и IPsec-совместимых ключей. С ним вы можете использовать одну связку ключей для двух протоколов!
github.com/ValdikSS/easy-rsa-ipsec
Easy-RSA чрезвычайно простой, поддерживать PKI-инфраструктуру с ним одно удовольствие!
Итак, инициализируем PKI и создаем CA, серверный и клиентский ключи. Важно, чтобы название серверного ключа совпадало с FQDN (доменом, проще говоря) вашего сервера!
Ключи сгенерированы. Я добавлял параметр nopass на каждом шагу, чтобы ключи не были защищены паролем (его можно установить позже в любое время).
Теперь нам необходимо скопировать их в нужные директории внутри /etc/ipsec.d/ , чтобы strongSwan нашел их:
Переходим к настройке strongSwan!
Первым делом, указываем наш приватный ключ в /etc/ipsec.secrets
Редактируем конфигурационный файл /etc/ipsec.conf
Как видите, конфигурационный файл состоит из нескольких секций. В секции config setup два закомментированных параметра: strictcrlpolicy = yes будет требовать неистекший лист отзывов для проведения аутентификации клиента, а uniqueids = no позволяет подключаться нескольким клиентам с одним сертификатом одновременно.
Далее идут секции с описаниями подключений. Секция с названием %default описывает подключение по умолчанию, от которого будут наследоваться другие подключения. Здесь устанавливаются следующие параметры:
- dpdaction=clear включает механизм Dead Peer Detection (DPD) и указывает, что нужно забывать о клиенте, если он не отзывался дольше таймаута
- dpddelay=35s — задержка до включения DPD
- dpdtimeout=300s — таймаут для DPD
- fragmentation=yes — включение внутренней фрагментации пакетов. Позволяет использовать IPsec с провайдерами, у которых сломана IP-фрагментация пакетов (привет, мобильный МТС!)
- rekey=no — выключение инициации смены ключей со стороны сервера. Windows это не любит.
- ike — перечень ciphersuites для использования с IKE (т.е. во время установки шифрованного соединения для передачи конфигурационных параметров, в том числе и ключей для установки SA)
- esp — перечень ciphersuites для шифрования трафика
- left и right — случаем все интерфейсы и принимаем всех клиентов
- leftid — указываем наш FQDN. Нужно для сломанного IKEv2 в OS X El Capitan
- leftauth/rightauth=pubkey — используем аутентификацию по ключам
- leftsubnet — подсети, которые мы отправляем клиенту для маршрутизации (весь IPv4 и IPv6-интернет). Уберите IPv6, если не используете его.
- rightsourceip — пул IP-адресов, из которого выдаем адрес клиенту. Уберите IPv6, если не используете его.
- rightdns — IP-адреса DNS-серверов
Давайте разберемся с ciphersuites в ike и esp. Здесь перечислены методы шифрования в порядке убывания приоритета, и их так много из-за того, что некоторые из них могут быть недоступны на каких-то устройствах, например, мобильных. Первым делом идут так называемые AEAD-алгоритмы, т.е. такие шифры, которые не требуют отдельного алгоритма для аутентификации, с убывающей группой Диффи-Хеллмана для реализации Perfect Forward Secrecy (PFS). Это самые быстрые шифры, которые доступны в IPsec. Хоть это и AEAD-режим, в ike должны быть алгоритмы хеширования для процесса хендшейка. Затем идет привычный AES-CBC с группами Диффи-Хеллмана. Клиентам, которые не поддерживают PFS, мы не позволим подключиться.
Если у вас нет модуля xauth-noauth для соединения ikev1-fakexauth , то вы можете заменить его просто на xauth и создать пользователя в /etc/ipsec.secrets , например, с логином и паролем client1:
Теперь у нас есть три подключения: ikev2-pubkey для IKEv2, ikev1-fakexauth для IKEv1 с фейковой проверкой логина и пароля и ikev2-eap-tls — IKEv2+EAP-TLS для Windows Phone. Перезапускаем strongSwan.
Если все верно, вы увидите следующий вывод команды swanctl -L
Проблемы MTU
Из-за особенностей и ошибок в реализации разных IPsec-клиентов, MTU внутри туннеля нельзя угадать заранее, а на Android вообще устанавливается MTU 1500, из-за чего большие пакеты не передаются и вообще ничего не работает. Чтобы нивелировать этот недостаток, достаточно изменять параметр TCP MSS в момент установки TCP-соединения на стороне сервера. Будем использовать значение 1360 для IPv4 и 1340 для IPv6, чтобы размер пакета не превышал 1400 байт внутри туннеля:
На этом настройка сервера закончена. Не забудьте настроить NAT, если вам он нужен!
Настройка клиентов
Алгоритм настройки клиентов в общих чертах заключается в импорте сертификатов из файла *.p12, создании нового подключения с типом IPsec PKI, IPsec XAUTH RSA или IKEv2 (в зависимости от устройства), указания клиентского сертификата и адреса сервера.
Внимание! Нужно вводить именно тот адрес сервера, который вы вводили при создании серверного ключа. Подключиться по другому домену или просто по IP-адресу, если сертификат был сгенерирован на домен, не получится!
Windows
OS X и iOS
Android
Вы можете использовать как IPsec-клиент Android и подключаться по протоколу IKE, так и клиент strongSwan и использовать IKEv2. Клиент strongSwan работает стабильнее и надежно переподключает в случае потери соединения.
Импортируйте сертификат либо через файловый менеджер, либо используя пункт «Установка с SD-карты» в разделе «Безопасность». Перейдите в настройки VPN, создайте новое подключение с типом «IPSec Xauth RSA», в поле «Адрес сервера» впишите, собственно, адрес сервера, в поле «Сертификат пользователя IPSec» и «Сертификат ЦС IPSec» укажите сертификат «client1». Нажмите на соединение, введите любые логин и пароль и попробуйте подключиться.
Источник
Установка VPN-сервера IKEv2 StrongSwan в Ubuntu 20.04
Виртуальная частная сеть (или VPN) обеспечивает шифрование трафика при работе в небезопасных сетях (например, в публичной сети кафе или аэропорта и т.п.).
IKEv2 (Internet Key Exchange v2) – это протокол, который предоставляет прямое туннелирование IPSec между сервером и клиентом. В VPN-реализациях протокола IKEv2 IPSec шифрует сетевой трафик. IKEv2 по умолчанию поддерживается новыми платформами (OS X 10.11+, iOS 9.1+, Windows 10) без каких-либо дополнительных приложений.
Этот мануал поможет установить VPN-сервер IKEv2 StrongSwan на сервер Ubuntu 20.04 и подключиться к нему с клиентов Windows, macOS, Ubuntu, iOS и Android.
Требования
Для работы нужен сервер Ubuntu 20.04, настроенный по этому мануалу (включая пользователя sudo и брандмауэр).
1: Установка StrongSwan
Для начала мы установим StrongSwan. Это открытый демон IPSec, который можно использовать в качестве VPN-сервера. Также нужно установить компонент для создания инфраструктуры открытых ключей (PKI), для этого мы создадим свой центр сертификации.
Обновите индекс пакетов:
sudo apt update
Чтобы установить необходимые пакеты, введите:
sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins
Дополнительный пакет libcharon-extauth-plugins позволяет разным клиентам авторизоваться по общему имени и паролю.
2: Создание центра сертификации
Для идентификации клиентов серверу IKEv2 нужны сертификаты. Поэтому пакет strongswan-pki поставляется с отдельной утилитой pki для генерирования центра сертификации и самих сертификатов сервера.
Для начала создайте каталоги для хранения всех этих компонентов. Структура каталогов совпадает с некоторыми каталогами в /etc/ipsec.d, куда мы позже переместим созданные нами файлы.
Заблокируйте доступ к этим файлам:
Теперь у вас есть отдельная структура каталогов для сертификатов. Сгенерируйте 4096-битный RSA-ключ, с помощью которого вы сможете подписать центр сертификации.
pki —gen —type rsa —size 4096 —outform pem >
Теперь можно создать root ЦС и использовать ключ для подписи сертификата root:
pki —self —ca —lifetime 3650 —in
/pki/private/ca-key.pem \
—type rsa —dn «CN=VPN root CA» —outform pem >
Флаг –lifetime 3650 задает срок действия root-сертификата ЦС, в данном случае это 10 лет. Как правило, такой сертификат не меняется, в противном случае его придется повторно распространять между всеми серверами и клиентами, которые зависят от этого ЦС. Потому мы установили такой продолжительный срок действия для этого сертификата.
Вы можете изменить значение флага –dn (distinguished name) и указать свою страну, организацию и имя. В данном случае параметр CN (common name) – просто идентификатор, вы можете просто придумать его, он не должен совпадать с чем-либо в вашей инфраструктуре.
Теперь нужно создать сертификат для сервера VPN.
3: Генерирование сертификата для VPN-сервера
Создайте сертификат и ключ для сервера VPN, с помощью которого клиенты смогут проверить его подлинность.
Чтобы создать закрытый ключ, введите команду:
pki —gen —type rsa —size 4096 —outform pem >
Затем создайте сертификат для VPN-сервера и подпишите его с помощью ЦС, который вы создали в предыдущем разделе. Запустите следующий набор команд, предварительно указав в параметрах CN (Common Name) и SAN (Subject Alternate Name) ваше доменное имя или IP-адрес сервера.
/pki/private/server-key.pem —type rsa \
| pki —issue —lifetime 1825 \
—cacert
/pki/private/ca-key.pem \
—dn «CN=server_domain_or_IP» —san server_domain_or_IP \
—flag serverAuth —flag ikeIntermediate —outform pem \
>
Примечание: Если вы используете IP-адрес вместо домена, вам нужно указать несколько записей –san. Строку в предыдущем блоке команд, где вы указываете Distinguished Name (–dn …), необходимо дополнить такой записью:
—dn «CN=IP address —san @IP_address —san IP_address \
Эта дополнительная запись –san @IP_address нужна для тех клиентов, которые при проверке подлинности сертификата ищут и запись DNS, и запись IP-адреса сервера.
Параметр –flag serverAuth указывает, что сертификат будет явно использоваться для аутентификации сервера перед установкой зашифрованного туннеля. Параметр –flag ikeIntermediate используется для поддержки старых клиентов macOS.
Теперь, когда мы сгенерировали все файлы TLS/SSL, необходимые для StrongSwan, мы можем переместить их в правильное место, в каталог /etc/ipsec.d:
Теперь у вас есть сертификаты, которые защитят взаимодействие клиента и сервера. Кроме того, с их помощью клиенты смогут подтвердить подлинность VPN-сервера.
4: Настройка StrongSwan
У StrongSwan есть стандартный конфигурационный файл с примерами настроек. Прежде чем внести какие-либо изменения, создайте его резервную копию, чтобы иметь доступ к параметрам по умолчанию, если что-то пойдет не так.
sudo mv /etc/ipsec.conf
Создайте новый файл:
sudo nano /etc/ipsec.conf
Примечание: В этом разделе по настройке серверной части VPN вы столкнетесь с параметрами, относящимися к левой и правой сторонам соединения (параметры left и right). В контексте IPSec VPN левая сторона по соглашению относится к локальной системе (в нашем случае к серверу). Правая сторона в этих настройках относится к удаленным клиентам, таким как телефоны и другие компьютеры.
Позже, когда вы перейдете к настройке клиентов в этом руководстве, конфигурационные файлы клиентов будут ссылаться на себя с помощью различных левых директив, а сервер будет упоминаться с помощью терминологии правой стороны.
Настройте регистрацию состояний демона (это пригодится при отладке и устранении неполадок) и разрешите резервные соединения. Добавьте эти строки в файл:
config setup
charondebug=»ike 1, knl 1, cfg 0″
uniqueids=no
Затем нужно добавить конфигурации для VPN. Включите VPN-туннели IKEv2 и настройте автоматическую загрузку этого раздела конфигураций при запуске. Добавьте следующие строки в файл:
. . .
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
Теперь настройте выявление нерабочих серверов.
. . .
conn ikev2-vpn
. . .
dpdaction=clear
dpddelay=300s
rekey=no
Затем мы настроим параметры IPSec левой – серверной – стороны. Все эти параметры гарантируют, что сервер сможет принимать подключения от клиентов и правильно идентифицироваться. Прежде чем поместить эти параметры в файл /etc/ipsec.conf, давайте посмотрим, что они делают и почему они используются:
- left=%any: значение %any позволяет серверу использовать сетевой интерфейс, через который он принимает входящие соединения, для последующего взаимодействия с клиентами. Например, если вы подключаете клиента через частную сеть, сервер будет использовать внутренний IP-адрес, на который он будет получать трафик для остальной части соединения.
- leftid=@server_domain_or_IP: эта опция определяет имя, которое сервер представляет клиентам. В сочетании со следующей опцией leftcert опция leftid гарантирует, что настроенное здесь имя сервера совпадает с Distinguished Name (DN), содержащимся в публичном сертификате.
- leftcert=server-cert.pem: этот параметр определяет путь к публичному сертификату для сервера, который вы настроили в разделе 3. Без него сервер не сможет аутентифицировать себя с клиентами или завершить согласование настройки IKEv2.
- leftsendcert=always: значение always гарантирует, что любой клиент, который подключается к серверу, всегда будет получать копию публичного сертификата сервера как часть начальной установки соединения.
- leftsubnet=0.0.0.0/0: это последняя левая опция, она сообщает клиентам о подсетях, доступных на сервере. В этом случае значение 0.0.0.0/0 используется для представления всего набора IPv4-адресов, а это означает, что сервер по умолчанию позволяет клиентам отправлять весь свой трафик через VPN.
Теперь, когда вы знакомы с каждым из параметров левой стороны, добавьте их в файл:
. . .
conn ikev2-vpn
. . .
left=%any
leftid=@server_domain_or_IP
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
Примечание: Если в параметре leftid в качестве ID вы хотите использовать домен VPN-сервера, добавьте после = символ @:
Если вы хотите использовать IP, просто укажите его:
Затем нужно настроить правую –клиентскую – сторону соединения IPSec. Каждый из последующих параметров сообщает серверу, как принимать соединения от клиентов, как клиенты должны проходить аутентификацию на сервере, а также задает диапазоны внутренних IP-адресов и DNS-серверы, которые будут использовать клиенты. Давайте рассмотрим эти параметры подробнее:
- right=%any: значение %any для правой стороны соединения позволяет серверу принимать входящие соединения от любого удаленного клиента.
- rightid=%any: эта опция гарантирует, что сервер не будет отклонять соединения от клиентов, которые предоставляют идентификационные данные, до установления зашифрованного туннеля.
- rightauth=eap-mschapv2: этот параметр настраивает метод аутентификации, который будут использовать клиенты. Значение eap-mschapv2 используется здесь для широкой совместимости и для поддержки таких клиентов, как устройства Windows, macOS и Android.
- rightsourceip=10.10.10.0/24 Этот параметр позволяет серверу присваивать клиентам внутренние IP-адреса из пула IP-адресов 10.10.10.0/24.
- rightdns=8.8.8.8,8.8.4.4: эти IP-адреса являются общедоступными DNS преобразователями Google. Вы можете изменить это значение, если хотите использовать любые другие доступные преобразователи (другие публичные преобразователи, преобразователи VPN-сервера и так далее).
- rightsendcert=never: этот параметр сообщает серверу, что для аутентификации клиентам не нужно отправлять сертификат.
Теперь, когда вы знакомы со всеми необходимыми опциями правой стороны, добавьте следующие строки в /etc/ipsec.conf:
. . .
conn ikev2-vpn
. . .
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=10.10.10.0/24
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
Сервер StrongSwan должен запрашивать учётные данные пользователя при подключении клиента. Для этого добавьте:
. . .
conn ikev2-vpn
. . .
eap_identity=%identity
Затем добавьте следующие строки для поддержки клиентов Linux, Windows, macOS, iOS и Android. Эти строки определяют различные алгоритмы обмена ключами, хеширования, аутентификации и шифрования (обычно называемые наборами шифров), которые StrongSwan позволит использовать различным клиентам:
. . .
conn ikev2-vpn
. . .
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
Список шифров следует разделить запятыми (например, chacha20poly1305-sha512-curve25519-prfsha512 – это первый набор, а aes256gcm16-sha384-prfsha384-ecp384 – второй, и между ними должна стоять запятая). Перечисленные здесь наборы шрифтов обеспечивают наиболее широкий диапазон совместимости для клиентов Windows, macOS, iOS, Android и Linux.
В результате конфигурационный файл будет выглядеть так:
config setup
charondebug=»ike 1, knl 1, cfg 0″
uniqueids=no
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=@server_domain_or_IP
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=10.10.10.0/24
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
eap_identity=%identity
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
Сохраните и закройте файл.
5: Настройка аутентификации VPN
Сейчас VPN-сервер поддерживает соединения клиентов. Теперь нужно создать учётные данные, с помощью которых пользователи смогут проходить аутентификацию. Настройка аутентификации происходит в файле ipsec.secrets. В него нужно будет внести следующие поправки:
- Указать, где StrongSwan сможет найти закрытый ключ к сертификату сервера, с помощью которого сервер будет выполнять аутентификацию.
- Добавить список пользователей, которые могут подключаться к VPN.
sudo nano /etc/ipsec.secrets
Укажите путь к закрытому ключу:
Затем укажите учётные данные пользователей. Сервер StrongSwan должен разрешать этим пользователям подключаться из любой точки.
your_username : EAP «your_password»
Примечание: Вместо your_username и your_password укажите свои учётные данные (имя пользователя и пароль).
Сохраните и закройте файл.
Теперь можно перезапустить сервис VPN, чтобы обновить параметры.
sudo systemctl restart strongswan-starter
6: Настойка брандмауэра и IP forwarding
Теперь нужно настроить брандмауэр для поддержки VPN-трафика.
Если вы включили UFW в мануале по начальной настройке, у вас уже есть базовые профили. Если вы не включили базовый брандмауэр ранее, сделайте это сейчас:
sudo ufw allow OpenSSH
sudo ufw enable
Затем добавьте правило для поддержки UDP трафика по стандартным портам IPSec, 500 и 4500:
sudo ufw allow 500,4500/udp
Теперь откройте конфигурационный файл UFW и добавьте политики нижнего уровня для маршрутизации и форвардинга пакетов IPSec. Но для начала нужно определить сетевые интерфейсы, по которым происходит доступ в интернет на данной машине. Для этого введите:
ip route show default
Открытый интерфейс указывается после слова dev (в нашем случае это eth0):
default via your_server_ip dev eth0 proto static
Теперь откройте файл /etc/ufw/before.rules. Правила, перечисленные в этом файле, добавляются к правилам брандмауэра перед базовыми правилами ввода и вывода. Они используются для настройки преобразования сетевых адресов (NAT), чтобы сервер мог правильно маршрутизировать соединения между клиентами и интернетом.
sudo nano /etc/ufw/before.rules
В начале файла (перед строкой *filter) укажите следующий блок конфигураций.
Вместо eth0 укажите имя вашего интерфейса, которое вы узнали с помощью команды ip route. Строки *nat создают правила, с помощью которых брандмауэр может правильно маршрутизировать и управлять трафиком между VPN-клиентами и Интернетом. Строки *mangle изменяют максимальный размер сегмента пакета, чтобы предупредить возможные проблемы с отдельными VPN клиентами.
*nat
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy —pol ipsec —dir out -j ACCEPT
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
COMMIT
*mangle
-A FORWARD —match policy —pol ipsec —dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp —tcp-flags SYN,RST SYN -m tcpmss —mss 1361:1536 -j TCPMSS —set-mss 1360
COMMIT
*filter
:ufw-before-input — [0:0] :ufw-before-output — [0:0] :ufw-before-forward — [0:0] :ufw-not-local — [0:0] . . .
После определений *filter и цепочек добавьте такие строки:
. . .
*filter
:ufw-before-input — [0:0] :ufw-before-output — [0:0] :ufw-before-forward — [0:0] :ufw-not-local — [0:0] -A ufw-before-forward —match policy —pol ipsec —dir in —proto esp -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward —match policy —pol ipsec —dir out —proto esp -d 10.10.10.0/24 -j ACCEPT
Эти строки позволяют брандмауэру поддерживать форвардинг трафика ESP (Encapsulating Security Payload), благодаря чему клиенты VPN могут подключиться. ESP обеспечивает дополнительную защиту пакетов VPN при пересечении ненадежных сетей.
Сохраните и закройте файл.
Прежде чем перезапустить брандмауэр, нужно отредактировать настройки ядра, чтобы разрешить перенаправление между интерфейсами. Для этого отредактируйте файл /etc/ufw/sysctl.conf.
В файле нужно сделать следующее:
- Включить пересылку пакетов IPv4.
- Отключить Path MTU Discovery, чтобы предотвратить фрагментацию пакетов.
- Отключить поддержку icmp-редиректов, чтобы предупредить атаки man-in-the-middle.
Откройте файл в редакторе:
sudo nano /etc/ufw/sysctl.conf
Чтобы включить форвардинг пакетов между интерфейсами, добавьте в конец файла строку:
Чтобы заблокировать получение и отправку пакетов ICMP, добавьте в конец файла эти строки:
Отключите обнаружение пути MTU, добавив эту строку в конец файла:
Сохраните и закройте файл.
sudo ufw disable
sudo ufw enable
Подтвердите операцию, нажав Y.
7: Тестирование VPN-соединений в Windows, iOS и macOS
Теперь всё готово к работе. Пора протестировать настройку. Сначала скопируйте root сертификат на клиентские устройства, которые будут подключаться к VPN. Проще всего для этого подключиться к серверу и запросить содержимое файла сертификата:
Вы получите такой вывод:
——BEGIN CERTIFICATE——
MIIFNDCCAxygAwIBAgIIHCsidG5mXzgwDQYJKoZIhvcNAQEMBQAwODELMAkGA1UE
. . .
H2YUdz8XNHrJHvMQKWFpi0rlEcMs+MSXPFWE3Q7UbaZJ/h8wpSldSUbQRUlphExJ
dJ4PX+MUJO/vjG1/ie6Kh25xbBAc3qNq8siiJZDwrg6vjEK7eiZ1rA==
——END CERTIFICATE——
Скопируйте вывод на компьютер, включая строки —–BEGIN CERTIFICATE—– и —–END CERTIFICATE—–. Сохраните эти данные в файл с описательным именем (например, ca-cert.pem). Файл должен иметь расширение .pem.
В качестве альтернативы можно использовать SFTP.
Скопировав сертификат на компьютер, вы можете подключиться к VPN.
Подключение в Windows
Есть несколько способов импортировать корневой сертификат и настроить Windows для подключения к VPN. Первый метод использует графические инструменты, а второй – команды PowerShell, которые можно изменить в соответствии с вашей конфигурацией VPN.
Примечание: Эти инструкции были протестированы на установках Windows 10 версий 1903 и 1909.
Настройка Windows с помощью графических инструментов
Импортируйте сертификат root:
- Нажмите WINDOWS+R, чтобы открыть диалог Run, и введите mmc.exe, чтобы запустить консоль управления Windows.
- Из меню File перейдите в Add or Remove Snap-in, выберите в списке Certificates и нажмите Add.
- Чтобы к VPN мог подключиться любой пользователь, выберите Computer Account и нажмите Next.
- Настройка выполняется на локальном компьютере, потому нужно выбрать Local Computer и нажать Finish.
- В Console Root разверните Certificates (Local Computer) → Trusted Root Certification Authorities и выберите Certificates.
- В меню Action выберите All Tasks и нажмите Import, чтобы вызвать мастер импортирования сертификатов. Нажмите Next.
- В поле File to Import выберите файл сертификата, который вы скопировали ранее. Нажмите Next.
- Убедитесь, что в Certificate Store выбрано Trusted Root Certification Authorities. Нажмите Next.
- Нажмите Finish, чтобы импортировать сертификат.
Чтобы настроить VPN:
- Запустите панель управления, перейдите в Network and Sharing Center.
- Нажмите Set up a new connection or network и выберите Connect to a workplace.
- Выберите Use my Internet connection (VPN).
- Введите данные сервера VPN. Укажите домен или IP сервера в поле Internet address. В Destination name укажите описательное имя VPN-соединения. Нажмите Done.
Настройка Windows с помощью PowerShell
Чтобы импортировать сертификат корневого ЦС с помощью PowerShell, сначала откройте командную строку PowerShell с правами администратора. Для этого щелкните правой кнопкой мыши значок меню «Пуск» и выберите Windows PowerShell (Admin). Вы также можете открыть командную строку от имени администратора и ввести powershell.
Затем мы импортируем сертификат с помощью командлета Import-Certificate PowerShell. В следующей команде первый аргумент –CertStoreLocation импортирует сертификат в хранилище компьютера Trusted Root Certification Authorities, чтобы все программы и пользователи могли проверить сертификат сервера VPN. Аргумент -FilePath должен указывать на место, куда вы скопировали сертификат. В следующем примере указан путь C:\Users\8host\Documents\ca-cert.pem. Убедитесь, что вы указали в команде правильное расположение сертификата.
Import-Certificate `
-CertStoreLocation cert:\LocalMachine\Root\ `
-FilePath C:\users\8host\Documents\ca-cert.pem
Команда выведет примерно такой результат:
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\Root
Thumbprint Subject
———- ——-
DB00813B4087E9367861E8463A60CEA0ADC5F002 CN=VPN root CA
Чтобы настроить VPN с помощью PowerShell, выполните следующую команду. Укажите домен или IP-адрес своего сервера в строке -ServerAddress. Использованные здесь флаги позволяют правильно настроить Windows с соответствующими параметрами безопасности, установленными в /etc/ipsec.conf.
Add-VpnConnection -Name «VPN Connection» `
-ServerAddress «server_domain_or_IP» `
-TunnelType «IKEv2» `
-AuthenticationMethod «EAP» `
-EncryptionLevel «Maximum» `
-RememberCredential `
Если команда выполнена успешно, вывода на экране не будет. Чтобы убедиться, что VPN настроен правильно, используйте командлет Get-VPNConnection:
Get-VpnConnection -Name «VPN Connection»
Вы получите следующий результат:
Name : VPN Connection
ServerAddress : your_server_ip
AllUserConnection : False
Guid :
TunnelType : Ikev2
AuthenticationMethod :
EncryptionLevel : Maximum
L2tpIPsecAuth :
UseWinlogonCredential : False
EapConfigXmlStream : #document
ConnectionStatus : Disconnected
RememberCredential : True
SplitTunneling : False
DnsSuffix :
IdleDisconnectSeconds : 0
По умолчанию Windows выбирает более старые и более медленные алгоритмы. Запустите командлет Set-VpnConnectionIPsecConfiguration, чтобы обновить параметры шифрования, которые Windows будет использовать для обмена ключами IKEv2 и для шифрования пакетов:
Set-VpnConnectionIPsecConfiguration -Name «VPN Connection» `
-AuthenticationTransformConstants GCMAES256 `
-CipherTransformConstants GCMAES256 `
-DHGroup ECP384 `
-IntegrityCheckMethod SHA384 `
-PfsGroup ECP384 `
-EncryptionMethod GCMAES256
Примечание: Если вы хотите удалить VPN-соединение и перенастроить его с другими параметрами, вы можете запустить командлет Remove-VpnConnection.
Remove-VpnConnection -Name «VPN Connection» -Force
Флаг -Force пропустит запрос на подтверждение операции. Вы должны отключиться от VPN, чтобы удалить соединение с помощью этой команды.
Подключение к VPN
После того как вы импортировали сертификат и настроили VPN, ваше новое VPN-соединение появится в списке доступных сетей. Выберите VPN и нажмите Connect. Вам будет предложено ввести имя пользователя и пароль. Введите их, нажмите OK, и вы подключитесь к этой сети.
Подключение в macOS
Чтобы импортировать сертификат:
- Дважды кликните по файлу сертификата. Появится окно Keychain Access с сообщением «Keychain Access is trying to modify the system keychain. Enter your password to allow this».
- Введите пароль и нажмите Modify Keychain.
- Дважды кликните по импортированному сертификату VPN. На экране появится окно свойств, где нужно выбрать уровень доверия. Установите Always Trust в IP Security (IPSec). Система снова запросит пароль.
Чтобы настроить VPN-соединение на устройстве macOS:
- В System Preferences выберите Network. Нажмите кнопку с плюсом.
- В появившемся окне в поле Interface укажите VPN, в VPN Type выберите IKEv2 и выберите имя соединения.
- В полях Server и Remote ID укажите домен или IP сервера. Поле Local ID оставьте пустым.
- В Authentication Settings выберите Username и введите имя и пароль своего пользователя VPN. Нажмите OK.
- Нажмите Connect, чтобы подключиться к VPN.
Подключение в Ubuntu
Чтобы подключиться к VPN в Ubuntu, нужно настроить StrongSwan как сервис или же использовать команду каждый раз, когда вам нужно подключиться.
StrongSwan как сервис
Обновите индекс локальных пакетов:
sudo apt update
sudo apt install strongswan libcharon-extra-plugins
Скопируйте сертификат ЦС в каталог /etc/ipsec.d/cacerts:
sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts
Отключите StrongSwan, чтобы VPN не включался автоматически.
sudo systemctl disable —now strongswan-starter
Затем откройте в редакторе этот файл:
sudo nano /etc/ipsec.conf
Укажите имя и пароль пользователя VPN в файле /etc/ipsec.secrets:
your_username : EAP «your_password»
Затем добавьте в файл такие конфигурации:
config setup
conn ikev2-rw
right=server_domain_or_IP
# This should match the `leftid` value on your server’s configuration
rightid=server_domain_or_IP
rightsubnet=0.0.0.0/0
rightauth=pubkey
leftsourceip=%config
leftid=username
leftauth=eap-mschapv2
eap_identity=%identity
auto=start
Чтобы подключиться к VPN, введите:
sudo systemctl start strongswan-starter
Чтобы отключиться, введите:
sudo systemctl stop strongswan-starter
Простой клиент charon-cmd для одноразового подключения
Чтобы управлять StrongSwan как сервисом, вам необходимо выполнить следующие шаги.
Сначала обновите индекс локальных пакетов:
sudo apt update
Установите charon-cmd и связанные с ним пакеты:
sudo apt install strongswan libcharon-extra-plugins
Создайте копию сертификата ЦС в каталоге /etc/ipsec.d/cacerts, чтобы клиент мог проверить подлинность сервера.
sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts
Подключитесь к VPN с помощью charon-cmd, указав сертификат CA, домен или IP сервера VPN и имя пользователя:
sudo charon-cmd —cert ca-cert.pem —host vpn_domain_or_IP —identity your_username
По запросу ведите свой пароль. Чтобы закрыть соединение, нажмите CTRL+C.
Подключение в iOS
Чтобы настроить VPN-соединение на устройстве iOS:
- Отправьте себе электронное письмо с сертификатом root.
- Откройте письмо на устройстве iOS и нажмите на прикрепленный файл сертификата, нажмите Install и введите пароль. После завершения нажмите Done.
- Откройте Settings → General → VPN и выберите Add VPN Configuration. На экране появится окно настройки VPN.
- Нажмите Type и выберите IKEv2.
- В поле Description укажите короткое имя VPN-соединения на свое усмотрение.
- В полях Server и Remote ID укажите доменное имя или IP сервера. Поле Local ID можно оставить пустым.
- Введите имя пользователя и пароль в разделе Authentication и нажмите Done.
- Выберите только что созданное VPN-соединение, нажмите переключатель в верхней части страницы, и вы подключитесь.
Подключение в Android
- Отправьте себе электронное письмо с сертификатом. Сохраните сертификат в папку загрузок.
- Загрузите StrongSwan VPN клиент.
- Откройте приложение. В правом верхнем углу нажмите «more» (иконка с тремя точками) и выберите CA certificates.
- Вправом верхнем углу снова нажмите «more» и выберите Import certificate.
- Найдите нужный сертификат CA в папке загрузок и импортируйте его в приложение.
Чтобы настроить VPN-соединение:
- В верхней панели приложения нажмите ADD VPN PROFILE.
- В Server укажите домен или внешний IP-адрес сервера VPN.
- Выберите IKEv2 EAP (Username/Password) как VPN Type.
- Заполните Username Password.
- Снимите флажок Select automatically в разделе CA certificate и кликните Select CA certificate. Откройте вкладку IMPORTED и выберите импортированный CA.
- По желанию можно заполнить Profile name (optional) – укажите более описательное имя.
После этого кликните по созданному профилю в приложении StrongSwan.
Устранение неполадок
Если вы не можете импортировать сертификат, убедитесь, что он находится в файле с расширением .pem, а не .pem.txt.
Если у вас не получается подключиться к VPN, проверьте правильность доменного имени сервера или IP-адреса. Домен или IP должен совпадать со значением, указанным в параметре common name (CN) во время создания сертификата. Если они не совпадают, вы не сможете подключиться к VPN. К примеру, если в сертификате (в CN) вы указали vpn.example.com, вы должны использовать домен vpn.example.com при создании подключения к VPN.
Если вы указывали доменное имя, тогда также нужно проверить параметры VPN и убедиться, что в leftid перед доменом стоит символ @:
Если же вы указывали IP, убедитесь, что символа @ перед адресом нет. Также убедитесь, что при создании файла server-cert.pem вы включили флаги –san @IP_address и –san IP_address
Заключение
Теперь вы умеете создавать VPN-серверы на основе протокола IKEv2.
Чтобы добавить или удалить пользователей, обратитесь к разделу 5. Каждый пользователь должен быть записан в отдельную строку. Соответственно, чтобы добавить пользователя, добавьте в файл его данные; чтобы удалить пользователя, удалите строку с его данными из файла.
Источник