Эта статья о том, как перестать мучиться с сертификатами для IKEv2-RSA и их установкой.
В Интернете есть множество статей и видео по настройке аутентификации IKEv2 с использованием сертификатов. Главная проблема такой конфигурации — необходимость генерации множества сертификатов, доставки и установки их на каждое клиентское устройство. Довольно замороченный процесс, согласитесь?
Вместе с тем, протокол IKEv2 предоставляет быстрый, защищенный доступ к локальной сети с возможностью автоматической передачи маршрутов и параметров DNS VPN‑клиенту.
Но схему доступа можно существенно упростить используя аутентификацию по логину и паролю. Полученную схему можно масштабировать на прочие VPN‑протоколы — l2tp, pptp, sstp, ovpn. Для этого необходимо VPN‑сервер MikroTik перевести на седьмую версию RouterOS. И нам потребуется сгенерировать всего один сертификат — для VPN‑сервера.
В седьмой версии RouterOS появились очень полезные функции, которые позволяют превратить MikroTik в полноценный VPN‑сервер. Среди того, что существенно облегчает жизнь админу для нашей задачи очень подходят два новшества:
- Работа с сертификатами Let’s Encrypt
- Встроенный Radius‑сервер
Теперь, для отдельно взятого vpn‑сервера MikroTik больше не требуется сторонний генератор и установщик сертификатов. Механизм запроса и установки действительного сертификата от Let’s Encrypt позволяет сделать это за несколько секунд. Встраиваемый Radius‑сервер решает проблему отсутствия такового в небольшой локальной сети или невозможности использования по иным причинам.
Важное уточнение по сертификатам от Let’s Encrypt в составе ОС.
Необходимо убедиться, правильно ли на клиенте установлены действующие сертификаты от Let’Encrypt. Это важно не только для нашей задачи, но и для корректной работы других служб и приложений использующих сертификаты.
Дело в том, что цепочка доверия Let’s Encrypt выглядит на сегодня так:
https://letsencrypt.org/certificates/

Все автоматически выдаваемые клиентам‑микротикам сертификаты подписаны от имени R3.
В клиентской ОС Windows сертификат R3 обязательно должен быть установлен как «промежуточный доверенный центр сертификации» в хранилище КОМПЬЮТЕРА (Local Machine). Самая распространенная проблема при импорте сертификата обычно находится в метре от ПК и кликает «мышкой». ОС Windows по‑умолчанию пытается данный сертификат установить в хранилище пользователя, что ведет к проблемам доступа.
Итак. Убедитесь, что сертификат R3 присутствует в хранилище «промежуточные доверенные центры сертификации» КОМПЬЮТЕРА. Если нет — скачайте по ссылке https://letsencrypt.org/certs/lets‑encrypt‑r3.pem и установите сертификат правильно.

Начальные условия:
- Внешний IP (FQDN): gw1.mt-courses.ru
- Локальная сеть: 10.10.4.0/24
- Адреса для ikev2-клиентов: 192.0.2.0/24
- Маршрутизатор под управлением MikroTik RouterOS версии 7.x
Настройка MikroTik RouterOS. Подготовка
1. Генерация запроса и установка сертификата на сервер
Необходимые условия: на роутере должен быть открыт и доступен извне порт http (tcp:80). По‑умолчанию, на этом порту работает служба webfig. Доступ к ней извне всем подряд оставлять крайне НЕ рекомендуется, так что можно открывать порт только в момент генерации/обновления сертификата.
Также желательно наличие FQDN связанного с внешним IP вашего MikroTik. Например, gw1.mt‑courses.ru.
Скрипт получения сертификата:
/ip/firewall/filter add chain=input protocol=tcp dst-port=80 action=accept comment="temporary filter rule" place-before=1
/certificate/enable-ssl-certificate dns-name=gw1.mt-courses.ru
/ip/firewall/filter remove [find comment="temporary filter rule"]
Если в результате работы команды вы увидели сообщение «progress: [success] ssl certificate updated«, значит сертификат успешно сгенерирован и установлен в хранилище. Проверяем:
/certificate/print
Результат:
Flags: K — PRIVATE‑KEY; A — AUTHORITY; I, R — REVOKED; T — TRUSTED
Columns: NAME, COMMON‑NAME
0 K T letsencrypt‑autogen_2023–xx–xxThh:mm:ssZ gw1.mt‑courses.ru
2. Получение и установка дополнительного пакета user-manager на MikroTIk
Для этого Вам потребуется зайти на сайт https://www.mikrotik.com в раздел «Software» и скачать оттуда архив «extra packages» соответствующий аппаратной архитектуре Вашего роутера MikroTik.

Обратите внимание, чтобы номер версии пакета точно соответствовал установленной версии RouterOS! Невозможно установить пакеты версии, отличающейся от версии установленной на роутере операционной системы.
Из архива Вам потребуется единственный файл «user‑manager-7.x.npk»

Данный файл необходимо извлечь из архива, скопировать в корень файловой системы маршрутизатора MikroTik и произвести перезагрузку (/system reboot ).
В случае, если пакет успешно установлен, в корневом меню WinBox появится новый пункт «User Manager» (если нет — читайте LOG. В начале будет описана причина ошибки)

Настройка IKEv2
Теперь переходим к самому основному, собственно настройке VPN‑сервера доступа по протоколу IKEv2. Поскольку при подключении клиента, ему выделяется некий виртуальный IP‑адрес, то сначала нам необходимо создать пул адресов для подключаемых клиентов:
/ip/pool add name=vpn-pool ranges=192.0.2.1–192.0.2.254
Переходим непосредственно к настройке IPSec. Настройка IPSec требует создания нескольких сущностей:

- Profile
- Proposal
- Group
- Policy Template
- Peer (шаблон)
- Modeconf
- Identity
Group используется как тег для связывания Identity и Policy Template для генерации индивидуальных Policy из шаблона (template) при подключении клиента. По сути, Identity, это то, что собирает во едино все настройки, когда клиент подключится к серверу. По этому Identity настраивается в последнюю очередь, когда остальные параметры созданы.
Здесь хочу дать вам совет: Никогда. Н‑и-к‑о-г‑д-а, без острой необходимости не изменяйте в RouterOS профили с названием «Default», если точно НЕ знаете, как это повлияет на дальнейшую работу. В Winbox всегда есть возможность создать копию профиля и проводить эксперименты с копией. В консоли тоже есть такая возможность — ключевое слово «copy‑from=».
1,2) Для наглядности создадим копии имеющихся Proposal и Profile. При этом отключим в Proposal PFS:
/ip/ipsec/proposal
print
add copy-from=0 name=proposal-ike2 pfs-group=none
/ip/ipsec/profile
print
add copy-from=0 name=profile-ike2

3) Создадим отдельную Group для Policy:
/ip ipsec policy group add name=ike2

4) Создаем шаблон Policy Template для подключенных пиров, получивших адрес из пула 192.0.2.0/24:
/ip/ipsec/policy add dst-address=192.0.2.0/24 group=ike2 proposal=proposal-ike2 src-address=0.0.0.0/0 template=yes

5) Создаем шаблон пира (клиента):
/ip/ipsec/peer add exchange-mode=ike2 name=peerike2 passive=yes profile=profile-ike2

6) Создаём mode‑config. Это набор параметров, которые будут переданы клиенту, включая адрес DNS‑сервера и маршруты до локальных сетей. В примере клиенту передается маршрут до локальной сети 10.10.4.0/24:
/ip/ipsec/mode-config
add address-pool=vpn-pool name=ike2-modconf split-include=10.10.4.0/24 system-dns=yes

7) Создаем итоговый identity. В нем мы также будем использовать ссылку на полученный сертификат от Let’s Encrypt:
/ip/ipsec/identity
add auth-method=eap-radius certificate=letsencrypt-autogen_2023-xx-xxThh:mm:ssZ generate-policy=port-strict mode-config=ike2-modconf peer=peerike2 policy-template-group=ike2

UPD: по рекомендации товарища @modnyman лучше сразу скачать на микротик и указать также сертификат R3 от Let’s Encrypt. Тогда не придется устанавливать его на клиентские устройства в дальнейшем для избежания ошибки IKE с кодом 13801 (см.последний абзац)

Параметр «auth-method=eap-radius» говорит микротику, что запросы аутентификации надо пересылать на Radius-сервер. Осталось его настроить прямо на MikroTik. Наш встроенный radius (UserManager) будет использовать пароль «MySuperPass1234» и, кроме клиентов IPSec IKEv2, будет дополнительно обрабатывать запросы обычных ppp-клиентов (pptp/l2tp/sstp…)
/radius
add address=127.0.0.1 secret=MySuperPass1234 service=ppp,ipsec
/radius incoming
set accept=yes

Минимальная, самая примитивная настройка user-manager состоит из команд включения, разрешения взаимодействия с локальным сервером доступа используя пароль «1234» и добавления пользователя с логином «user1@gw» и паролем «1234567890»:
/user-manager
set enabled=yes
/user-manager router
add address=127.0.0.1 name=router1 shared-secret=MySuperPass1234
/user-manager user
add name=user1@gw1 password=1234567890

[spoiler title=’Код для RouterOS целиком’ style=’default’ collapse_link=’true’]
[bash title=»код»]
/ip/firewall/filter add chain=input protocol=tcp dst-port=80 action=accept comment="temporary filter rule" place-before=1
/certificate/enable-ssl-certificate dns-name=gw1.mt-courses.ru
/ip/firewall/filter remove [find comment="temporary filter rule"]
/ip/pool add name=vpn-pool ranges=192.0.2.1–192.0.2.254
/ip/ipsec/proposal
print
add copy-from=0 name=proposal-ike2 pfs-group=none
/ip/ipsec/profile
print
add copy-from=0 name=profile-ike2
/ip/ipsec/policy group add name=ike2
/ip/ipsec/policy add dst-address=192.0.2.0/24 group=ike2 proposal=proposal-ike2 src-address=0.0.0.0/0 template=yes
/ip/ipsec/peer add exchange-mode=ike2 name=peerike2 passive=yes profile=profile-ike2
/ip/ipsec/mode-config add address-pool=vpn-pool name=ike2-modconf split-include=10.10.4.0/24 system-dns=yes
/ip/ipsec/identity add auth-method=eap-radius certificate=letsencrypt-autogen_2023-xx-xxThh:mm:ssZ generate-policy=port-strict mode-config=ike2-modconf peer=peerike2 policy-template-group=ike2
/radius add address=127.0.0.1 secret=MySuperPass1234 service=ppp,ipsec
/radius incoming set accept=yes
/user-manager set enabled=yes
/user-manager router add address=127.0.0.1 name=router1 shared-secret=MySuperPass1234
/user-manager user add name=user1@gw1 password=1234567890
[/spoiler]
Подключаем клиента windows.
Создаем новое подключение к VPN.
Имя/адрес сервера: указываем FQDN, своё, на которое выдан сертификат (у меня это gw1.mt-courses.ru)
Логин в примере: user1@gw1 Пароль: 1234567890

Если всё сделано правильно, то должно произойти успешное подключение в VPN.
Если же возникает ошибка IKE с кодом 13801 то, скорее всего, неправильно или не туда в системе установлен сертификат R3.