Установка VPN-сервера IKEv2 StrongSwan в Ubuntu 18.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 18.04 и подключиться к нему с клиентов Windows, macOS, Ubuntu, iOS и Android.

Требования

Для работы нужен сервер Ubuntu 18.04, настроенный по этому мануалу (включая пользователя sudo  и брандмауэр).

1: Установка StrongSwan

StrongSwan – это открытый демон IPSec, который можно использовать в качестве сервера VPN. Установите StrongSwan.

Также нужно установит компонент для создания инфраструктуры открытых ключей.

Обновите индекс пакетов и введите команду:

sudo apt update
sudo apt install strongswan strongswan-pki

2: Создание центра сертификации

Для идентификации клиентов серверу IKEv2 нужны сертификаты. Поэтому strongswan-pki поставляется с утилитой для генерирования центра сертификации и сертификатов сервера. Для начала создайте каталог для хранения всех этих компонентов. Заблокируйте доступ к этому каталогу.

mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki

Теперь у вас есть отдельный каталог для сертификатов. Сгенерируйте root ключ – 4096-битный RSA-ключ, с помощью которого вы сможете подписать root-сертификат.

:
ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem

Теперь можно создать ЦС и использовать ключ для подписи сертификата root:

ipsec pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
--type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem

Вы можете изменить параметры флага —dn (distinguished name) и указать свою страну, организацию и имя. В данном случае параметр CN(common name) – просто идентификатор, вы можете просто придумать его.

В дальнейшем мы скопируем root-сертификат (server-root-ca.pem) на клиентские устройства, чтобы они могли проверить подлинность сервера при подключении.

Теперь нужно создать сертификат для сервера VPN.

3: Генерирование сертиф2иката для VPN-сервера

Создайте сертификат и ключ для сервера VPN, с помощью которого клиенты смогут проверить его подлинность.

Чтобы создать закрытый ключ, введите команду:

ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem

Затем создайте сертификат для VPN-сервера и подпишите его с помощью ЦС, который вы получили в предыдущем разделе. Запустите следующий набор команд, предварительно указав в параметрах CN (Common Name) и SAN (Subject Alternate Name) доменное имя или IP-адрес сервера.

ipsec pki --pub --in ~/pki/private/server-key.pem --type rsa \
| ipsec pki --issue --lifetime 1825 \
--cacert ~/pki/cacerts/ca-cert.pem \
--cakey ~/pki/private/ca-key.pem \
--dn "CN=server_domain_or_IP" --san "server_domain_or_IP" \
--flag serverAuth --flag ikeIntermediate --outform pem \
>  ~/pki/certs/server-cert.pem

Скопируйте сертификаты в каталог, в котором StrongSwan сможет прочитать их:

Теперь у вас есть сертификаты, которые защитят взаимодействие клиента и сервера. Кроме того, с их помощью клиенты смогут подтвердить подлинность VPN-сервера.

4: Настройка StrongSwan

У StrongSwan есть стандартный конфигурационный файл. Прежде чем внести какие-либо изменения, создайте его резервную копию, чтобы иметь доступ к параметрам по умолчанию, если что-то пойдет не так.

sudo mv /etc/ipsec.conf{,.original}

Создайте новый файл:

sudo nano /etc/ipsec.conf

Настройте регистрацию состояний демона (это пригодится при отладке и устранении неполадок) и разрешите резервные соединения. Добавьте эти строки в файл:

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:

. . .
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-сервера, добавьте после = символ @:

leftid=@vpn.example.com

Если вы хотите использовать IP, просто укажите его:

leftid=203.0.113.7

Затем нужно настроить клиентскую сторону соединения. Укажите следующие параметры (внутренний IP, DNS-сервер и т.д.):

. . .
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

Примечание: Серверная сторона соединения считается левой стороной (left…), а клиентская – правой (right…).

Сервер StrongSwan должен запрашивать учётные данные пользователя при подключении клиента. Для этого добавьте:

. . .
conn ikev2-vpn
. . .
eap_identity=%identity

В результате конфигурационный файл будет выглядеть так:

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

Сохраните и закройте файл.

5: Настройка аутентификации VPN

VPN-сервер поддерживает соединения клиентов. Теперь нужно создать учётные данные, с помощью которых пользователи смогут проходить аутентификацию. Настройка аутентификации происходит в файле ipsec.secrets. В него нужно будет внести следующие поправки:

  • Указать, где StrongSwan сможет найти закрытый ключ к сертификату сервера, с помощью которого сервер будет выполнять аутентификацию.
  • Добавить список пользователей, которые могут подключаться к VPN.

Откройте файл:

sudo nano /etc/ipsec.secrets

Укажите путь к закрытому ключу:

: RSA "server-key.pem"

Затем укажите учётные данные пользователей. Сервер StrongSwan должен разрешать этим пользователям подключаться из любой точки.

your_username : EAP "your_password"

Примечание: Вместо your_username и your_password укажите свои учётные данные (имя пользователя и пароль).

Сохраните и закройте файл.

Теперь можно перезапустить сервис VPN, чтобы обновить параметры.

sudo systemctl restart strongswan

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 | grep default

Открытый интерфейс указывается после слова dev:

default via 203.0.113.7 dev eth0 proto static

Теперь откройте файл /etc/ufw/before.rules:

sudo nano /etc/ufw/before.rules

В начале файла (перед строкой *filter) укажите следующие конфигурации:

*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]
. . .

Примечание: Вместо eth0 укажите свой открытый интерфейс.

Строки *nat создают правила маршрутизации трафика между клиентами VPN и интернетом. Строки *mangle изменяют максимальный размер сегмента пакета, чтобы предупредить возможные проблемы с отдельными VPN клиентами.

После определений *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 при пересечении ненадежных сетей.

Сохраните и закройте файл.

Прежде чем перезапустить брандмауэр, нужно отредактировать настройки ядра:

sudo nano /etc/ufw/sysctl.conf

В файле нужно:

  • Включить пересылку пакетов IPv4.
  • Отключить Path MTU Discovery, чтобы предотвратить фрагментацию пакетов.
  • Отключить поддержку icmp-редиректов, чтобы предупредить атаки man-in-the-middle.

Все изменения выделены ниже красным:

. . .
# Enable forwarding
# Uncomment the following line
net/ipv4/ip_forward=1
. . .
# Do not accept ICMP redirects (prevent MITM attacks)
# Ensure the following line is set
net/ipv4/conf/all/accept_redirects=0
# Do not send ICMP redirects (we are not a router)
# Add the following lines
net/ipv4/conf/all/send_redirects=0

net/ipv4/ip_no_pmtu_disc=1

Сохраните и закройте файл.

Перезапустите брандмауэр:

sudo ufw disable
sudo ufw enable

Подтвердите операцию.

7: Тестирование VPN-соединений в Windows, iOS и macOS

Теперь всё готово к работе. Пора протестировать настройку. Сначала скопируйте root сертификат на клиентские устройства, которые будут подключаться к VPN. Проще всего для этого подключиться к серверу и запросить содержимое файла сертификата:

cat /etc/ipsec.d/cacerts/ca-cert.pem
-----BEGIN CERTIFICATE-----
MIIFQjCCAyqgAwIBAgIIFkQGvkH4ej0wDQYJKoZIhvcNAQEMBQAwPzELMAkGA1UE
. . .
EwbVLOXcNduWK2TPbk/+82GRMtjftran6hKbpKGghBVDPVFGFT6Z0OfubpkQ9RsQ
BayqOb/Q
-----END CERTIFICATE-----

Скопируйте вывод на компьютер, включая строки ——BEGIN CERTIFICATE—— и ——END CERTIFICATE——. Сохраните эти данные в файл с описательным именем (например, ca-cert.pem). Файл должен иметь расширение .pem.

В качестве альтернативы можно использовать SFTP.

Читайте также: Использование SFTP для безопасного обмена файлами с удаленным сервером

Скопировав сертификат на компьютер, вы можете подключиться к VPN.

Подключение в 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:

  1. Запустите панель управления, перейдите в Network and Sharing Center.
  2. Нажмите Set up a new connection or network и выберите Connect to a workplace.
  3. Выберите Use my Internet connection (VPN).
  4. Введите данные сервера VPN. Укажите домен или IP сервера в поле Internet address. В Destination name укажите описательное имя VPN-соединения. Нажмите Done.

Новое VPN-соединение появится в списке сетевых подключений. Выберите VPN и нажмите Connect. Укажите имя пользователя и пароль, нажмите Ok, после чего вы подключитесь к VPN.

Подключение в 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:

  1. В System Preferences выберите Network. Нажмите кнопку с плюсом.
  2. В появившемся окне в поле Interface укажите VPN, в VPN Type выберите IKEv2 и выберите имя соединения.
  3. В полях Server и Remote ID укажите домен или IP сервера. Поле Local ID оставьте пустым.
  4. В  Authentication Settings выберите Username и введите имя и пароль своего пользователя VPN. Нажмите OK.
  5. Нажмите Connect, чтобы подключиться к VPN.

Подключение в Ubuntu

Чтобы подключиться к VPN в Ubuntu, нужно настроить StrongSwan как сервис или же использовать команду каждый раз, когда вам нужно подключиться.

StrongSwan как сервис

Обновите индекс локальных пакетов:

sudo apt update

Установите StrongSwan:

sudo apt install strongswan libcharon-extra-plugins

Скопируйте сертификат CA в каталог /etc/ipsec.d/cacerts:

sudo cp /tmp/ca-cert.pem/etc/ipsec.d/cacerts

Отключите StrongSwan, чтобы VPN не включался автоматически.

sudo systemctl disable --now strongswan

Укажите имя и пароль пользователя VPN в файле /etc/ipsec.secrets:

your_username : EAP"your_password"

В файле /etc/ipsec.conf укажите конфигурации:

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

Чтобы отключиться, введите:

sudo systemctl stop strongswan

Простой клиент для одноразового подключения

Обновите индекс локальных пакетов:

sudo apt update

Установите charon-cmd и связанные пакеты:

sudo apt install charon-cmd libcharon-extra-plugins

Перейдите в каталог с копией сертификата CA:

cd <^>/path/to/ca-cert.pem

Подключитесь к VPN с помощью charon-cmd, указав сертификат CA, домен или IP сервера VPN и имя пользователя:

sudo charon-cmd --cert ca-cert.pem --hostvpn_domain_or_IP --identity your_username

По запросу ведите свой пароль.

Подключение в iOS

Чтобы настроить VPN-соединение на устройстве iOS:

  1. Отправьте себе электронное письмо с сертификатом root.
  2. Откройте письмо на устройстве iOS и нажмите на прикрепленный файл сертификата, нажмите Install и введите пароль. После завершения нажмите Done.
  3. Откройте Settings → General → VPN и выберите Add VPN Configuration. На экране появится окно настройки VPN.
  4. Нажмите Type и выберите IKEv2.
  5. В поле Description укажите короткое имя VPN-соединения на свое усмотрение.
  6. В полях Server и Remote ID укажите доменное имя или IP сервера. Поле Local ID можно оставить пустым.
  7. Введите имя пользователя и пароль в разделе Authentication и нажмите Done.
  8. Выберите только что созданное VPN-соединение, нажмите переключатель в верхней части страницы, и вы подключитесь.

Подключение в Android

Импортируйте сертификат:

  • Отправьте себе электронное письмо с сертификатом. Сохраните сертификат в папку загрузок.
  • Загрузите StrongSwan VPN клиент.
  •  Откройте приложение. В правом верхнем углу нажмите «more» (иконка с тремя точками) и выберите CA certificates.
  • Вправом верхнем углу снова нажмите «more» и выберите Import certificate.
  • Найдите нужный сертификат CA в папке загрузок и импортируйте его в приложение.

Чтобы настроить VPN-соединение:

  1. В верхней панели приложения нажмите ADD VPN PROFILE.
  2. В Server укажите домен или внешний IP-адрес сервера VPN.
  3. Выберите IKEv2 EAP (Username/Password) как VPN Type.
  4. Заполните Username Password.
  5. Снимите флажок Select automatically в разделе CA certificate и кликните Select CA certificate. Откройте вкладку IMPORTED и выберите импортированный CA.
  6. По желанию можно заполнить Profile name (optional) – укажите более описательное имя.

После этого кликните по созданному профилю в приложении StrongSwan.

Устранение неполадок

Если вы не можете импортировать сертификат, убедитесь, что он находится в файле с расширением .pem, а не .pem.txt.

Если у вас не получается подключиться к VPN, проверьте правильность доменного имени сервера или IP-адреса. Домен или IP должен совпадать со значением, указанным в параметре common name (CN) во время создания сертификата. Если они не совпадают, вы не сможете подключиться к VPN. К примеру, если в сертификате (в CN) вы указали vpn.example.com, вы должны использовать домен vpn.example.com при создании подключения к VPN.

Если вы указывали доменное имя, тогда также нужно проверить параметры VPN и убедиться, что в leftid перед доменом стоит символ @:

leftid=@vpn.example.com

Если же вы указывали IP, убедитесь, что символа @ перед адресом нет.

Заключение

Теперь вы умеете создавать VPN-серверы на основе протокола IKEv2.

Чтобы добавить или удалить пользователей, обратитесь к разделу 5. Каждый пользователь должен быть записан в отдельную строку. Соответственно, чтобы добавить пользователя, добавьте в файл его данные; чтобы удалить пользователя, удалите строку с его данными из файла.

Читайте также: Установка и использование лог-анализатора Logwatch

Tags: , , , ,