Установка 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:
- Запустите панель управления, перейдите в 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.
Новое 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:
- В 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
Установите 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:
- Отправьте себе электронное письмо с сертификатом 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 перед доменом стоит символ @:
leftid=@vpn.example.com
Если же вы указывали IP, убедитесь, что символа @ перед адресом нет.
Заключение
Теперь вы умеете создавать VPN-серверы на основе протокола IKEv2.
Чтобы добавить или удалить пользователей, обратитесь к разделу 5. Каждый пользователь должен быть записан в отдельную строку. Соответственно, чтобы добавить пользователя, добавьте в файл его данные; чтобы удалить пользователя, удалите строку с его данными из файла.
Читайте также: Установка и использование лог-анализатора Logwatch
Tags: IKEv2, StrongSwan, Ubuntu, Ubuntu 18.04, VPN
4 комментария
Не работает. На сервере при попытке
ipsec start
Starting strongSwan 5.6.2 IPsec [starter]…
/etc/ipsec.conf:2: syntax error, unexpected STRING [charondebug]
invalid config file ‘/etc/ipsec.conf’
unable to start strongSwan — fatal errors in config
Если закоментировать charondebug он на следующую строку ругается и тд.
Подскажите в чем проблема?
Ввожу логин и пароль, но подключения нет. Проверил всё правильно.
Статья не рабочая!
Всё ок, но как всегда кто статью ни напишет, сами не читают что написали. Это копия статьи с англоязычного ресурса. Автор опечатался как и в той статье.
Решение такое
your_username : EAP”your_password”
Пропущен пробел. Должно быть
your_username : EAP “your_password”
И всё заработает