Настройка IKEv2 VPN сервера с StrongSwan на Ubuntu 22.04

В данной статье описана настройка IKEv2 VPN сервера на StrongSwan в операцонной системе Ubuntu 22.04.

В качестве хостинга используется провайдер IHC, в котором на текущий момент можно заказать VPS за 54 и 101 рубль (раздел “Дешёвые VDS на SSD”).

Подготовка

Все действия в инструкции производятся от имени root. Для начала надо будет установить пакеты. Перед установкой обновим кеш

apt update

Установим необходимые пакеты

apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins

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

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

Генерируем ключи

Сгенерируем корневой ключ

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

На этом шаге может возникнуть ошибка

TPM 2.0 - could not load "libtss2-tcti-tabrmd.so.0"
plugin 'tpm': failed to load - tpm_plugin_create returned NULL

Её можно решить установив недостающий пакет. После установки надо вернуться на предыдущий шаг и сгенерировать ключ.

apt-get install libtss2-tcti-tabrmd0

Теперь сгенерируем корневой сертификат сроком на 10 лет

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) можно изменить на что-нибудь другое, главное, чтобы он не совпадал ни с чем другим в вашей организации.

Теперь сгенерируем ключ и сертификат для сервера

pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
pki --pub --in ~/pki/private/server-key.pem --type rsa | 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

Обратите внимание, что в параметре dn и san необходимо указать доменное имя сервера или ip адрес vpn-сервера, в зависимости от того, как в последствии будет происходить подключение к серверу – по имени или по адресу.

Так же, обратите внимание, что если вы указываете ip адрес, то надо добавить дополнительны параметр san с ip-адресом начинающимся со знака ‘@’

...--dn "CN=IP_address" --san @IP_address --san IP_address...

Теперь все сгенерированные файлы необходимо перенести в папку

cp -r ~/pki/* /etc/ipsec.d/

Настройка StrongSwan

Нужно иметь ввиду, что в терминологии IPSec встречаются слова left и right. Под left понимается сам сервер, который мы настраиваем, под right имеется ввиду удалённые клиенты – компьютеры, телефоны и т.д.

Первым делом делаем резервную копию конфигурации

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

Создаем новую конфигурацию

nano /etc/ipsec.conf

Вот пример конфигурации, которая требует аутентификации при подключении и позволяет подключаться из систем Linux, Windows, macOS, iOS, и Android

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!

Параметр leftid нужно настроить – указать доменное имя или ip адрес нашего vpn-сервера. Если указываете доменное имя, то надо начинать его со знака @, например @vpn.example.com, если ip адрес, то знак @ не нужен.

Аутентификация

Для аутентификации будем использовать ipsec.secrets.

Необходимо указать две вещи – где Swan будет находить пользователей и сам список пользователей.

Откроем файл где будут храниться секреты

nano /etc/ipsec.secrets

Первым делом в файле укажем каким ключем и как именно работать с паролями. Обратите внимание, что строка начинается с двоеточия

: RSA "server-key.pem"

Далее укажите логины и пароли

your_username : EAP "your_password"

В конце перезапускаем Swan

systemctl restart strongswan-starter

Фаервол и маршрутизация

В конце настроим фаервол и маршрутизацию для работы сервера.

Для начала настроим фаервол ufw, разрешим ssh (иначе не получится управлять нашим сервером) и стандартные порты IPSec, и включим ufw

ufw allow OpenSSH
ufw allow 500,4500/udp
ufw enable

Теперь надо посмотреть, какой интерфейс используется для доступа в интернет

ip route show default

возможный вывод

default via your_server_ip dev eth0 proto static

Вам нужно запомнить ваш интерфейс, в примере это eth0.

Теперь откроем правила маршрутизации, которые начинают работать до того, как начинают работать все входные и выходные правила.

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 надо указать интерфейс, который вы получили в предыдущем шаге.

После блока 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

Теперь надо настроить пару параметров в сетевом ядре.

Сначала необходимо включить пересылку пакетов IPv4, чтобы трафик мог перемещаться между VPN и общедоступными сетевыми интерфейсами на сервере. Затем вы отключите обнаружение Path MTU, чтобы предотвратить проблемы с фрагментацией пакетов. Наконец, мы не будем принимать перенаправления ICMP и отправлять перенаправления ICMP, чтобы предотвратить атаки посредника.

Откроем параметры ядра UFw

nano /etc/ufw/sysctl.conf

Добавим в конец файла эти строки

net/ipv4/ip_forward=1
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/all/send_redirects=0
net/ipv4/ip_no_pmtu_disc=1

Теперь перезапустим фаервол

ufw disable
ufw enable

На этом всё – настройка VPN-сервера закончена

Подключение к VPN

Для начала нам понадобится сертификат.

cat /etc/ipsec.d/cacerts/ca-cert.pem

Вы увидите что-то подобное

-----BEGIN CERTIFICATE-----
MIIE7DCCAtigAwIB3gIIJQIvoWLM0EYwDQYJKo2hvcNAQEMBQAwFjEUMBIGA1UE
...
OXq7yhw2dpJpxY/k4EYh545mM7SY=
-----END CERTIFICATE-----

Вам необходимо скопировать все строки, включая BEGIN CERTIFICATE и END CERTIFICATE и сохранить в текстовом файле, поменяв расширение на .pem (например, назвав файл ca-cert.pem)

Подключения к VPN в разных ОС:

Настройка подключения в других системах будет добавлена позднее.

Использованные материалы:

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-22-04

https://stackoverflow.com/questions/70542297/tpm-2-0-could-not-load-libtss2-tcti-tabrmd-so-0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *