Доброго времени суток, коллеги. Сегодня пишу заметку по настройке VPN-сервер IKEv2 на MikroTik. По окончании настройки к нему смогут подключиться клиенты с Windows, Android, Apple а также получим рабочий туннель для объединения 2-х офисов по схеме Site 2 Site в ситуации, когда белый IP-адрес лишь у одного микрота (сервера) либо когда он пингуется по DNS-имени. Авторизовываться будем по сертификатам, которые сгенерируем на Site-1.
В создании данной статьи я руководствовался официальной документацией и выступлениями Никиты Тарикина в Малазии, Москве и Индонезии, за которые огромное ему СПАСИБО!
После написания 3-х предыдущих заметок вся настройка будет происходит в терминале с минимумом комментариев и картинок.
Настраивал схему подключения на версии RouterOS 6.45.1. Имеем удалённый микрот (далее Site-1), который пингуется по DNS-имени vpn.dnsname.ru с белым IP-адресом 66.66.66.66
Локальная сеть за Site-1 - 192.168.0.0/22
Второй микрот (далее Site-2) с серым адресом на WAN-интерфейсе.
Локальная сеть за Site-2 - 10.10.10.0/24
Адресация для IKEv2 туннеля будет 10.0.100.0/24
Перед тем, как вставить скопированную команду в терминал убедитесь, что IP-адрес 66.66.66.66 изменен на ВАШ, и домен vpn.dnsname.ru на нужный. Ну и конечно же не забудьте сменить IP-адреса внутренних сетей (10.10.10.0/24 и 192.168.0.0/22) на ваши.
Настраиваем часовой пояс, NTP-клиента.
/system clock set time-zone-autodetect=no time-zone-name=Europe/Astrakhan
/system ntp client set enabled=yes server-dns-names=1.ru.pool.ntp.org,2.ru.pool.ntp.org,3.ru.pool.ntp.org
Добавляем бридж и вешаем пул адресов на него же
/interface bridge add name=IKE2-loopback
/ip address add address=10.0.100.1/24 interface=IKE2-loopback network=10.0.100.0
/ip pool add name="IKE2" ranges=10.0.100.100-10.0.100.200
Настройку DNS вам нужно провести самостоятельно в зависимости от вашей специфики, но в итоге нам нужно, чтобы по адресу vpn.dnsname.ru пинговался IP-адрес настраиваемого VPN-сервера 66.66.66.66.
Следующий шаг - генерация сертификатов. Я разбил команды на блоки не случайно. Ошибки при генерации сертификатов нам не нужны. Выполняем по порядку, дожидаясь завершения процесса подписания, не прерывать!!!!
Генерируем корневой сертификат:
/certificate
add name=CA.vpn.dnsname.ru country=RU state=RU \
locality="Astrakhan region" organization=Astrakhan \
common-name=CA.vpn.dnsname.ru subject-alt-name=IP:66.66.66.66 \
key-size=2048 days-valid=3650 trusted=yes \
key-usage=digital-signature,key-encipherment,data-encipherment,key-cert-sign,crl-sign
sign CA.vpn.dnsname.ru
Генерируем сертификат VPN-сервера:
add name=vpn@vpn.dnsname.ru country=RU state=RU locality="Astrakhan region" \
organization=Astrakhan common-name=vpn@vpn.dnsname.ru subject-alt-name=DNS:vpn.dnsname.ru \
key-size=2048 days-valid=3560 trusted=yes key-usage=tls-server
sign vpn@vpn.dnsname.ru ca=CA.vpn.dnsname.ru
Создаём шаблон для дальнейшего создания сертификатов через копирование с шаблона:
add name=~clienttemplate@vpn.dnsname.ru country=RU state=RU locality="Astrakhan region" \
organization=Astrakhan common-name=~client-template@vpn.dnsname.ru \
subject-alt-name=email:~clienttemplate@vpn.dnsname.ru key-size=2048 days-valid=3650 \
trusted=yes key-usage=tls-client
Сертификат для схемы Site 2 Site (для микротика Site-2):
add copy-from=~clienttemplate@vpn.dnsname.ru name=s2s@vpn.dnsname.ru \
common-name=s2s@vpn.dnsname.ru subject-alt-name=email:s2s@vpn.dnsname.ru
sign s2s@vpn.dnsname.ru ca=CA.vpn.dnsname.ru
Для первого клиента:
add copy-from=~clienttemplate@vpn.dnsname.ru name=client-1@vpn.dnsname.ru \
common-name=client-1@vpn.dnsname.ru subject-alt-name=email:client-1@vpn.dnsname.ru
sign client-1@vpn.dnsname.ru ca=CA.vpn.dnsname.ru
Для второго клиента, а остальные по той же схеме:
add copy-from=~clienttemplate@vpn.dnsname.ru name=client-2@vpn.dnsname.ru \
common-name=client-2@vpn.dnsname.ru subject-alt-name=email:client-2@vpn.dnsname.ru
sign client-2@vpn.dnsname.ru ca=CA.vpn.dnsname.ru
Далее экспортируем сгенерированные ключи, но обратите внимание, что сертификаты экспортируются в разных форматах (pem и pkcs12). Обязательно установите пароль при экспорте, т.к. при его отсутствии ошибок не будет, но работать VPN тоже не будет. Ни в коем случае не экспортируйте CA-сертификат с паролем, т.к. тогда экспортируется и закрытый ключ.
/certificate export-certificate CA.vpn.dnsname.ru type=pem
/certificate export-certificate vpn@vpn.dnsname.ru type=pem export-passphrase=passwordforexport
/certificate export-certificate s2s@vpn.dnsname.ru type=pem export-passphrase=passwordforexport
/certificate export-certificate client-1@vpn.dnsname.ru type=pkcs12 export-passphrase=passwordforexport
/certificate export-certificate client-2@vpn.dnsname.ru type=pkcs12 export-passphrase=passwordforexport
Скачиваем экспортированные сертификаты и сохраняем в одну папку. Я еще и переименовал скаченные сертификаты для удобства, удалив начало cert_export_.
Чуть настроим FireWall и изменим MSS. Правила размещайте перед запрещающими!!!! Я расположу их в самом начале списка (place-before=0)
/ip firewall filter
add action=accept chain=input comment="IKE2 - Accept UDP 500,4500 IPSec" \
dst-address=66.66.66.66 dst-port=500,4500 protocol=udp place-before=0
add action=accept chain=input comment="IKE2 - Accept IPSec-esp" dst-address=\
66.66.66.66 protocol=ipsec-esp place-before=0
add action=accept chain=input comment="Accept - In Ipsec" ipsec-policy=\
in,ipsec src-address=10.0.100.0/24 place-before=0
add action=accept chain=forward comment=\
"Accept - All Traffic from VPN to ANY" dst-address=192.168.0.0/22 \
ipsec-policy=in,ipsec src-address=10.0.100.0/24 place-before=0
add action=accept chain=forward comment=\
"Accept - All Traffic from VPN to ANY" dst-address=0.0.0.0/0 \
ipsec-policy=in,ipsec src-address=10.0.100.0/24 place-before=0
/ip firewall mangle
add action=change-mss chain=forward dst-address=10.0.100.0/24 ipsec-policy=\
in,ipsec new-mss=1360 passthrough=yes protocol=tcp tcp-flags=syn tcp-mss=\
!0-1360 place-before=0
Добавим правила NAT и поместим их над правилом основного маскарада:
/ip firewall nat
add action=masquerade chain=srcnat comment="ike2 masq non ipsec" \
ipsec-policy=out,none out-interface-list="WAN interfaces" place-before=0
add action=masquerade chain=srcnat comment="ike2 masq non ipsec" \
ipsec-policy=out,none out-interface-list="WAN interfaces" src-address=\
10.0.100.0/24 place-before=0
add action=src-nat chain=srcnat comment="ike2 masq non ipsec" ipsec-policy=\
out,none out-interface=WAN src-address=10.0.100.0/24 to-addresses=\
66.66.66.66 place-before=0
Настраиваем параметры IPSec. Настройка едина как для конфигурации Client 2 Site, так и для Site 2 Site:
/ip ipsec policy group
add name="clients"
add name="s2s"
/ip ipsec profile
add dh-group=modp2048,modp1536,modp1024 enc-algorithm=aes-256,aes-192,aes-128 \
hash-algorithm=sha256 name="vpn.dnsname.ru"
/ip ipsec peer
add exchange-mode=ike2 local-address=66.66.66.66 name=\
"peer VPN" passive=yes profile="vpn.dnsname.ru"
/ip ipsec proposal
add auth-algorithms=sha512,sha256,sha1 enc-algorithms="aes-256-cbc,aes-256-ctr\
,aes-256-gcm,aes-192-ctr,aes-192-gcm,aes-128-cbc,aes-128-ctr,aes-128-gcm" \
lifetime=8h name="vpn.dnsname.ru" pfs-group=none
/ip ipsec mode-config
add address-pool=IKE2 address-prefix-length=32 name=clients.vpn.dnsname.ru split-include=\
0.0.0.0/0 static-dns=10.0.100.1 system-dns=no
add address=10.0.100.2 name=s2s.vpn.dnsname.ru split-include=10.0.100.1 static-dns=10.0.100.1 \
system-dns=no
/ip ipsec identity
add auth-method=digital-signature certificate=vpn@vpn.dnsname.ru \
generate-policy=port-strict match-by=certificate mode-config=clients.vpn.dnsname.ru \
peer="peer VPN" policy-template-group="clients" \
remote-certificate=client-1@vpn.dnsname.ru remote-id=user-fqdn:client-1@vpn.dnsname.ru
add auth-method=digital-signature certificate=vpn@vpn.dnsname.ru \
generate-policy=port-strict match-by=certificate mode-config=clients.vpn.dnsname.ru \
peer="peer VPN" policy-template-group="clients" \
remote-certificate=client-2@vpn.dnsname.ru remote-id=user-fqdn:client-2@vpn.dnsname.ru
add auth-method=digital-signature certificate=vpn@vpn.dnsname.ru \
generate-policy=port-strict match-by=certificate mode-config=s2s.vpn.dnsname.ru \
peer="peer VPN" policy-template-group="s2s" \
remote-certificate=s2s@vpn.dnsname.ru remote-id=user-fqdn:s2s@vpn.dnsname.ru
/ip ipsec policy
add dst-address=10.0.100.2/32 group=s2s proposal=vpn.dnsname.ru src-address=10.0.100.1/32 template=yes
add dst-address=10.0.100.0/24 group=clients proposal=vpn.dnsname.ru src-address=0.0.0.0/0 template=yes
Сразу добавим GRE-туннель, который в дальнейшем позволит нам легко настроить маршрутизацию между офисами:
/interface gre
add local-address=10.0.100.1 name="IKEv2-GRE-Tunnel" remote-address=10.0.100.2
/ip route
add distance=1 dst-address=10.10.10.0/24 gateway="IKEv2-GRE-Tunnel"
На этом настройку VPN-сервера можно считать законченной и пора переходить на сторону клиента.
Первым на очереди комп с установленной Windows 10 Pro x64 версия 1903.
В винде кликаем правой кнопкой мыши на значок сетевого подключения и выбираем пункт ОТКРЫТЬ ПАРАМЕТРЫ СЕТИ И ИНТЕРНЕТ.
Слева выбираем раздел VPN и справа ДОБАВИТЬ VPN ПОДКЛЮЧЕНИЕ:
Поставщик - Windows (встроенные)
Имя подключения - произвольно
Имя или адрес сервера - vpn.dnsname.ru
Тип VPN - IKEv2
Тип данных для входа - Сертификат
и нажимаем сохранить.
Импортируем сертификат:
Расположение хранилища: Локальный компьютер
Пароль на сертификат: который вы выбрали при экспорте сертификата
Далее все по умолчанию
Далее кликаем правой кнопкой мыши на значок сетевого подключения и выбираем пункт ОТКРЫТЬ ПАРАМЕТРЫ СЕТИ И ИНТЕРНЕТ.
В правой части левый клик на пункте НАСТРОЙКА ПАРАМЕТРОВ АДАПТЕРА и в открывшемся окне правый клик на созданном VPN-подключении -> СВОЙСТВА.
В разделе БЕЗОПАСНОСТЬ пункт ШИФРОВАНИЕ ДАННЫХ - самое стойкое (отключиться, если нет шифрования)
ПРОВЕРКА ПОДЛИННОСТИ - выбираем ИСПОЛЬЗОВАТЬ СЕРТИФИКАТЫ КОМПЬЮТЕРА.
В случае если вам не нужно выходить в интернет через шлюз подключенной через VPN сети, то выбираем вкладку СЕТЬ, двойной левый клик на IP версии 4, в открытом окне ДОПОЛНИТЕЛЬНО и далее во вкладке ПАРАМЕТРЫ IP и снимаем галку ИСПОЛЬЗОВАТЬ ОСНОВНОЙ ШЛЮЗ В УДАЛЕННОЙ СЕТИ.
Можно подключаться.
Настраиваем часовой пояс, NTP-клиента.
/system clock set time-zone-autodetect=no time-zone-name=Europe/Astrakhan
/system ntp client set enabled=yes server-dns-names=1.ru.pool.ntp.org,2.ru.pool.ntp.org,3.ru.pool.ntp.org
Заходим на МикроТик Site-2 и перекидываем на него скаченные сертификаты CA, VPN и S2S. В сумме у вас должно быть 6 файлов:
и импортируем их по порядку. Обратите внимание, что импортировать нужно сначала CRT, а затем KEY.
/certificate
import file-name=CA@vpn.dnsname.ru.crt passphrase=passwordforexport
import file-name=CA@vpn.dnsname.ru.key passphrase=passwordforexport
import file-name=vpn@vpn.dnsname.ru.crt passphrase=passwordforexport
import file-name=vpn@vpn.dnsname.ru.key passphrase=passwordforexport
import file-name=s2s@vpn.dnsname.ru.crt passphrase=passwordforexport
import file-name=s2s@vpn.dnsname.ru.key passphrase=passwordforexport
Настроим FireWall, параметры IPsec, добавим GRE-туннель и добавим маршрут в сеть Site-1:
/ip firewall filter
add action=accept chain=input comment="IKE2 - Accept UDP 500,4500 IPSec" \
src-address=66.66.66.66 dst-port=500,4500 protocol=udp place-before=0
add action=accept chain=input comment="IKE2 - Accept IPSec-esp" src-address=\
66.66.66.66 protocol=ipsec-esp place-before=0
add action=accept chain=input comment="Accept - In Ipsec" ipsec-policy=\
in,ipsec dst-address=10.0.100.0/24 place-before=0
add action=accept chain=forward comment=\
"Accept - All Traffic from VPN to ANY" dst-address=10.10.10.0/24 \
ipsec-policy=in,ipsec src-address=10.0.100.0/24 place-before=0
add action=accept chain=forward comment=\
"Accept - All Traffic from VPN to ANY" dst-address=0.0.0.0/0 \
ipsec-policy=in,ipsec src-address=10.0.100.0/24 place-before=0
/ip ipsec policy group
add name="s2s"
/ip ipsec profile
add dh-group=modp2048,modp1536,modp1024 enc-algorithm=aes-256,aes-192,aes-128 \
hash-algorithm=sha256 name="vpn.dnsname.ru"
/ip ipsec peer
add address=66.66.66.66/32 exchange-mode=ike2 name="peer VPN" profile=vpn.dnsname.ru
/ip ipsec proposal
add auth-algorithms=sha512,sha256,sha1 enc-algorithms="aes-256-cbc,aes-256-ctr\
,aes-256-gcm,aes-192-ctr,aes-192-gcm,aes-128-cbc,aes-128-ctr,aes-128-gcm" \
lifetime=8h name="vpn.dnsname.ru" pfs-group=none
/ip ipsec mode-config
add name=s2s.vpn.dnsname.ru responder=no
/ip ipsec policy
add dst-address=10.0.100.1/32 group=s2s proposal=vpn.dnsname.ru src-address=10.0.100.2/32 template=yes
/ip ipsec identity
add auth-method=digital-signature certificate=s2s@vpn.dnsname.ru \
generate-policy=port-strict match-by=certificate mode-config=s2s.vpn.dnsname.ru \
peer="peer VPN" policy-template-group="s2s" \
remote-certificate=vpn@vpn.dnsname.ru remote-id=user-fqdn:s2s@vpn.dnsname.ru
/interface gre
add local-address=10.0.100.2 name="IKEv2-GRE-Tunnel" remote-address=10.0.100.1
/ip route
add distance=1 dst-address=192.168.0.0/22 gateway="IKEv2-GRE-Tunnel"
Если вы всё сделали по инструкции, то на данном этапе туннель должен заработать! Если же это не так, то попробуйте отключить запрещающие правила на FireWall на обоих маршрутизаторах.
Для настройки клиента на устройствах под управлением Android и и продуктов фирмы Apple предлагаю проследовать на сайт официальной документации, дублировать которую просто не вижу смысла.
Небольшое дополнение: При подключении с ПК под управлением Windows (в моем случае Windows10 x64 1903) к разным микротам VPN-подключение непонятным образом выбирает CA-сертификат. Решение подсказали на форуме и состоит оно в принудительном указании соответствия сертификата подключению, используя powerShell.
Set-VpnConnection -Name "My VPN Connection" -MachineCertificateIssuerFilter 'C:\mycerts\cert_export_MikrotikIKEv2-CA.crt'
Также случается, что на винде не получается автоматически маршрут к удаленной сети. Эта проблема также решается через powerShell добавлением маршрута после подключения определенного VPN.
Add-VpnConnectionRoute -ConnectionName "VPN Connection Name" -DestinationPrefix 192.168.50.0/24
Также рекомендую снять галочку "использовать основной шлюз в удаленной сети" в свойствах VPN-подключения -> вкладка СЕТЬ -> TCP/IPv4 -> Дополнительно -> вкладка "Параметры IP", чтобы не маршрутизировать ваш доступ к WWW через шлюз подключаемой сети.
Настройка VPN-подключения в Windows 7 ничем не отличается от Windows 10 кроме процесса импорта сертификатов в хранилище.
Итак: нажимаете Windows + R и в строке пишем mmc и нажимаем Enter.
Меню Файл - > Добавить или удалить оснастку.
В левой части открывшегося окна ищем пункт Сертификаты и нажимаем кнопку Добавить.
В следующем окне нужно выбрать учетной записи компьютера
И жмём Далее -> Готово -> ОК.
Перед нами откроется окно и здесь уже нужно импортировать сертификаты.
Сертификаты -> Правой кнопкой мыши по Личное -> Все задачи -> Импорт -> и выбираем наш сертификат p12.
После импорта настоятельно рекомендую проверить, чтобы клиентский серт был в личном, а СА в доверенных.
Настраиваем часовой пояс, NTP-клиента.
/system clock set time-zone-autodetect=no time-zone-name=Europe/Astrakhan
/system ntp client set enabled=yes server-dns-names=1.ru.pool.ntp.org,2.ru.pool.ntp.org,3.ru.pool.ntp.org
Заходим на МикроТик Site-2 и перекидываем на него скаченные сертификаты CA, VPN и S2S. В сумме у вас должно быть 6 файлов:
и импортируем их по порядку. Обратите внимание, что импортировать нужно сначала CRT, а затем KEY.
/certificate
import file-name=CA@vpn.dnsname.ru.crt passphrase=passwordforexport
import file-name=CA@vpn.dnsname.ru.key passphrase=passwordforexport
import file-name=vpn@vpn.dnsname.ru.crt passphrase=passwordforexport
import file-name=vpn@vpn.dnsname.ru.key passphrase=passwordforexport
import file-name=s2s@vpn.dnsname.ru.crt passphrase=passwordforexport
import file-name=s2s@vpn.dnsname.ru.key passphrase=passwordforexport
Настроим FireWall, параметры IPsec, добавим GRE-туннель и добавим маршрут в сеть Site-1:
/ip firewall filter
add action=accept chain=input comment="IKE2 - Accept UDP 500,4500 IPSec" \
src-address=66.66.66.66 dst-port=500,4500 protocol=udp place-before=0
add action=accept chain=input comment="IKE2 - Accept IPSec-esp" src-address=\
66.66.66.66 protocol=ipsec-esp place-before=0
add action=accept chain=input comment="Accept - In Ipsec" ipsec-policy=\
in,ipsec dst-address=10.0.100.0/24 place-before=0
add action=accept chain=forward comment=\
"Accept - All Traffic from VPN to ANY" dst-address=10.10.10.0/24 \
ipsec-policy=in,ipsec src-address=10.0.100.0/24 place-before=0
add action=accept chain=forward comment=\
"Accept - All Traffic from VPN to ANY" dst-address=0.0.0.0/0 \
ipsec-policy=in,ipsec src-address=10.0.100.0/24 place-before=0
/ip ipsec policy group
add name="s2s"
/ip ipsec profile
add dh-group=modp2048,modp1536,modp1024 enc-algorithm=aes-256,aes-192,aes-128 \
hash-algorithm=sha256 name="vpn.dnsname.ru"
/ip ipsec peer
add address=66.66.66.66/32 exchange-mode=ike2 name="peer VPN" profile=vpn.dnsname.ru
/ip ipsec proposal
add auth-algorithms=sha512,sha256,sha1 enc-algorithms="aes-256-cbc,aes-256-ctr\
,aes-256-gcm,aes-192-ctr,aes-192-gcm,aes-128-cbc,aes-128-ctr,aes-128-gcm" \
lifetime=8h name="vpn.dnsname.ru" pfs-group=none
/ip ipsec mode-config
add name=s2s.vpn.dnsname.ru responder=no
/ip ipsec policy
add dst-address=10.0.100.1/32 group=s2s proposal=vpn.dnsname.ru src-address=10.0.100.2/32 template=yes
/ip ipsec identity
add auth-method=digital-signature certificate=s2s@vpn.dnsname.ru \
generate-policy=port-strict match-by=certificate mode-config=s2s.vpn.dnsname.ru \
peer="peer VPN" policy-template-group="s2s" \
remote-certificate=vpn@vpn.dnsname.ru remote-id=user-fqdn:s2s@vpn.dnsname.ru
/interface gre
add local-address=10.0.100.2 name="IKEv2-GRE-Tunnel" remote-address=10.0.100.1
/ip route
add distance=1 dst-address=192.168.0.0/22 gateway="IKEv2-GRE-Tunnel"
Если вы всё сделали по инструкции, то на данном этапе туннель должен заработать! Если же это не так, то попробуйте отключить запрещающие правила на FireWall на обоих маршрутизаторах.