В данной статье описана настройка 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://stackoverflow.com/questions/70542297/tpm-2-0-could-not-load-libtss2-tcti-tabrmd-so-0