Как стать автором
Обновить

Сервер VPN IKEv2 с логином и паролем на MikroTik

Время на прочтение7 мин
Количество просмотров61K
Всего голосов 12: ↑12 и ↓0+12
Комментарии51

Комментарии 51

с появление на 7+ wireguard все подобное стремительно теряет актуальность, как и доверие в целом к бесплатным импортным сертификатам

А Windows получил маршрут 10.10.4.0/24 ?
Где-то в wiki mikrotik читал, что не все клиенты это умеют, в частности Windows...

Windows XP не получает. Windows 7 имеет проблемы с получением маршрутов.
Windows 8 под рукой к сожалению, нет.
Windows 10 успешно устанавливает маршруты в таблицу маршрутизации.

Тут пишут что даже не все Windows 10... https://serverfault.com/questions/1026041/mikrotik-ikev2-ipsec-windows-10-no-split-include-routes

Короче если нужна гарантированная доставка маршрутов, и парк клиентов неизвестен (личные компьютеры сотрудников например) то ничего кроме OpenVPN не остаётся...

По умолчанию в десятке(по крайней мере на момент когда разбирался с настройкой виндового ВПН клиента для SSTP, но вроде и в феврале наблюдал такое же поведение) весь траффик направится в тоннель, чтобы этого не происходило нужно включить для соединения SplitTunneling:

Set-VpnConnection -Name "My Connection" -SplitTunneling $true


Если при этом сеть тоннеля не совпадает с удалённой сетью, то после разделения траффика нужно указать сети достигаемые через данное ВПН подключение(в данном случае тоннельная сеть 192.168.0.0/24):
Add-VpnConnectionRoute -ConnectionName "My Connection" -DestinationPrefix 192.168.2.0/24 -PassThru
Add-VpnConnectionRoute -ConnectionName "My Connection" -DestinationPrefix 192.168.3.0/24 -PassThru 


Посмотреть маршруты для ВПН подключения можно так:
(Get-VpnConnection -ConnectionName "My Connection").routes


Если требуется, то можно так же указать для каждого добавляемого маршрута метрику(-RouteMetric), правда на уровне системной таблицы маршрутизации она всё равно не может быть менее метрики подключения.

В принципе, заскриптовать это не проблема. Можно ли распространять автоматически — не уверен, но такой задачи не стояло для меня. С другой стороны, для настраиваемого соединения это делается один раз, маршруты присутствуют в таблице маршрутизации только при активном ВПН подключении, спокойно переживает перезагрузки и пр.

Хотелось бы избежать скриптов, скачивания ПО и т.д.
Просто ссылка на страницу - простейший мануал с парой скриншотов и любой сотрудник сможет себе настроить VPN.

Но видимо нет, увы...

Без скриптов, все ОС семейства Windows умеют получать классовый маршрут. Но для этого "сетевой архитектор" должен был правильно проектировать адресное пространство компании.
Например, при получении на свою сторону VPN-тунеля адреса "192.168.C.D", windows добавляет маршрут с маской "255.255.255.0" через VPN, адресуя 1 сеть /24.
При получении на свою сторону VPN-тунеля адреса "172.16.C.D" (172.16-31.C.D), windows добавляет маршрут с маской "255.255.0.0" через VPN, адресуя 256 сетей по /24
При получении на свою сторону VPN-тунеля адреса "10.B.C.D", windows добавляет маршрут с маской "255.0.0.0" через VPN, адресуя 65536 сетей по /24
Для этого достаточно убрать в свойствах VPN-подключения галочку "Использовать основной шлюз в удаленной сети"

Использование классового маршрута в ОС  Windows
Использование классового маршрута в ОС Windows

При получении адреса 10.10.4.99 на VPN-адаптер, построится классовый маршрут: 10.0.0.0 mask 255.0.0.0 -> VPN
При получении адреса 172.30.4.99 на VPN-адаптер, построится классовый маршрут: 172.30.0.0 mask 255.255.0.0 -> VPN

Но для этого "сетевой архитектор" должен был правильно проектировать адресное пространство компании.

В 2023 году наивно полагать, что сетевая адресация это что-то такое на века.

- Купили другую компанию, присоединили сеть, добавились маршруты

- Разделили компанию на независимые подразделения, разделили подсети

Это и называется полноценная интеграция. Когда инженер не костылит суммарку+Netmap "чтобы вот ща пинги полетели" и не убегает пить пиво.
За такого рода работу инженерам ЗП платят.

Ага. А теперь расскажите, за сколько шагов человек с Win11 может добраться до этой галочки.

Win+R ncpa.cpl

В данном случае мануал остаётся всё так же прост, может даже проще — надо объяснить как запустить окно Powershell, и как скопировать-вставить-запустить строки из мануала. Не так удобно как в случае OpenVPN, но всё таки не сверх сложно. Плюс инструкция получается более независима от новшеств в GUI.

Собственно для моего случая там всего три команды:
# Добавить SSTP в явном виде не даёт(рекомендует L2TP), но даёт Automatic
Add-VpnConnection -Name "MyConn" -TunnelType Automatic -ServerAddress my.domain.xyz:8888 -AllUserConnection $true -AuthenticationMethod MSChapv2 -DnsSuffix home.local -EncryptionLevel Required -PassThru -SplitTunneling -RememberCredential
# Меняем тип подключения на SSTP, не забыв продублировать все доступные для командлета параметры(использованные ранее), иначе они перезатрутся:
Set-VpnConnection -Name "MyConn" -AllUserConnection -AuthenticationMethod MSChapv2 -DnsSuffix home.local -EncryptionLevel Required -IdleDisconnectSeconds 0 -RememberCredential $true -ServerAddress my.domain.xyz:8888 -SplitTunneling $true -TunnelType Sstp
# Добавляем маршрут
Add-VpnConnectionRoute -AllUserConnection  -ConnectionName "MyConn" -DestinationPrefix 192.168.250.0/24 -PassThru -RouteMetric 1


Дополнительно можно и логин-пароль «автоматизировать»(правда лишь для случая индивидуальной инструкции для конкретного пользователя :)):
# Выполняем подключение с указанием логина и пароля(сохранятся благодаря опции -RememberCredential при создании и редактировании подключения):
C:\Windows\system32\rasdial.exe "MyConn" vpnusername 'strong_password' /PHONEBOOK:"c:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk"

Во первых, всё что люди (далекие от ИТ) делают руками будет обязательно запортачено...

Во вторых, как вы предлагаете решать вопрос с добавлением нового маршрута?

Тысячи заявок в support, вида:
Пользователь: У меня не заходит на сервер, ничего не работает, мне СРОЧНО надо!
Support: Мы делали рассылку, нужно добавить новый маршрут
Пользователь: Я не видела/ничего не получала, сделайте что-нибудь!
Support: Сделайте то-то и то -то
И еще долгий диалог, как открыть PS, потом закрыть, открыть с поднятыми привилегиями и т.д.

Пользователь: Я не видела/ничего не получала, сделайте что-нибудь!

Мой ответ был по поводу усложнения инструкции. Если пользователь в принципе не способен выполнить описанное в инструкции(при условии что её писали так, чтобы повторить мог любой исполнительный человек), то не важно какой протокол использует ВПН. Конечно кроме случая когда всё что требуется от «клиента» это скачать(что вам тоже не очень нравилось в начале ветки) преднастроенный клиент, и установить его в стиле «далее-далее-ок». pfSence кстати умеет(умела?) создавать для OpenVPN индивидуальный пакет под каждого юзера, со всеми сертификатами и настройками. Но вроде для установки всё же требовались права администратора — кажется ставилась какая-то служба которая потом рулила маршрутами при запуске впн клиента от обычного юзера(но точно не скажу, т.к. давно уже не пользовался сборками из pfSence, как и OpenVPN по ряду причин).

Да, OpenVPN раздаст обновлённые маршруты(как вроде и циска для AnyConnect). Но не уверен что подобный пользователь(приходилось сталкиваться с такими — «смотрит в книгу, видит фигу») осилит первоначальную настройку клиента OpenVPN, сколько бы скриншотов не было в инструкции. Если же всё всё равно сведётся к тому что саппорту придётся подключаться на комп юзера(тимвьюер и т.п.), то страшное слово Powershell перестаёт быть страшным. По крайней мере cmd.exe я своих научил вызывать, как и пинг с трейсом запускать — удалённая работа, приходится им иногда самим под диктовку диагностировать почему у них не работает подключение в офис(когда я вижу что на стороне офиса проблемы нет). Хотя есть и те кто предпочитает сразу при упоминании консоли перезапустить свой домашний роутер(и что примечательно — обычно помогает :)).

P.S. 1000 заявок мне даже в страшном сне не снилось(у нас масштаб поменьше, плюс обычные юзеры на циску через AnyConnect пока ходят), иначе бы наверное придумал костыль для распространения и обновления маршрутов(скорее всего что-то самописное было бы).

pfSence кстати умеет(умела?) создавать для OpenVPN индивидуальный пакет под каждого юзера

Есть такой функционал, да, но такие пакеты будут неподписанные, и их будут блочить антивирусы. А если подписывать своим сертификатом, то надо как-то доставлять его на компьютеры... короче снежный ком.

Видимо нет серебряной пули, ну по крайней мере изкоробочной и бесплатной :)

openconnect server практикую. это по сути реверс эниконнекта цисковского, только опенсорсного (они между собой совместимы). на комп ток клиента поставить и урл вбить, а дальше конфиг тянется с сервака, пушить маршрутыи прочий сплит туннеленг умеет, клиент мне цисковский больше нравится.

А если ещё и Set-VpnConnectionUsernamePassword -connectionname "VPN_NAME" -username "USER_NAME" -password "USER_PWD" с помощью Install-Module -Name VPNCredentialsHelper -Confirm, пользователю останется только тыкать на VPN соединение рядом с часами. Но это несекьюрно, да.

Комментарием ниже(по ветке) я тоже самое делал через "C:\Windows\system32\rasdial.exe"(при первом вызове сохраняет логин-пароль), правда у меня был вариант подключения "для всех пользователей", для конкретного надо убрать из создания соединения "-AllUserConnection $true", и в параметре rasdial указать файл адресной книги пользователя.


Ваш вариант требуется ставить дополнительный модуль, причём "из ненадежного репозитория", как выдаёт PS. К тому же, если на гитхабе я нашел именно его(VPNCredentialsHelper, автор вроде тот же что на powershellgallery.com), то он по сути дёргает за теже ниточки(rasapi32.dll, см. Src\VPNCredentialsHelper\VPNHelper.cs). Поэтому для себя не вижу смысла в нём.


P.S. Сохранение пароля конечно несекьюрно, но все изыскания я проводил для собственного использования. Пароль на виндовую учётку у меня сложный, Win+L при отходе от компа у меня работает на уровне рефлексов, левое ПО не запускаю — надеюсь этих мер достаточно чтобы сохранение пароля было бы достаточно безопасно.

А если сторонний ipsec клиент? forticlient к примеру.

Если клиент подлерживает IKEv2 c аутентфикацией по имени и паролю, то должно работать. Но надо проверять. Альтернативные разработчики могли реализовать в своём клиенте собственное видение стандарта.

А микротик к микротику подключиться сможет? Со стороны клиента какие нюансы сделать?

Момент с продлением сертификата остался без описания. Руками продлять или есть механизм автоматического продления сертификата?

https://forum.mikrotik.com/viewtopic.php?t=189205
Здесь описан процесс подробно. Есть даже большой пример скрипта. Если по шагам,то:
1. Убирают старый сертификат;
2. Открывают 80 порт и запрашивают новый сертификат;
3. Закрывают 80 порт;
4. Привязывают новый сертификат к службам.

Э все конечно прекрасно, но есть одно но
"Маршрутизатор под управлением MikroTik RouterOS версии 7.x"

Stabile 6.49.7 (2022-Oct-11 17:37)

Long term 6.48.6 (2021-Dec-03 12:15)
Я видимо чтото не понимаю, но на сколько помню, на всех курсах, на всех митапах по ROS многократно говорилось что в проде использовать только Long term.
Тут вопрос скорее не к автору, а к господам из Микротик, но когда выйдет LTS 7 RoS

В данном случае решение уже вполне рабочее в ветке "Satble".
В целом да, по поводу "Stable" vs "Long-Term" абсолютно с Вами согласен. Данное руководство нацелено на будущее и, надеюсь, за счёт этого побудет актуальным чуть дольше. У латвийского вендора есть существенные проблемы с разработкой ввиду внутренних причин, которые я тут озвучивать не могу.

Сидим на 6 везде. 7 уже прям круто и кошерно, можно обновляться? Ставили 7.2 в прошлом году, багов было огого.

В небольших офисах ставил 7.5, 7.6 из-за поддержки wireguard, всё устраивает. Но там никакой сложной маршрутизации и очередей, просто стандартные настройки через quickset и немного доработок вручную.

Приемлемо работает в простых конфигурациях. Когда конфиг более сложный - возможны сюрпризы. Они и так иногда с обновлениями прилетают. Самый частый когда-то был, это когда /32 маршруты в ospf терялись. И до сих пор латыши не починили BFD, насколько знаю.

Тут вопрос скорее не к автору, а к господам из Микротик, но когда выйдет LTS 7 RoS

Примерный срок выхода можно будет узнать когда последний слолбец в таблице станет зеленый, как только будет поддержка всех функции и режимов тогда в ближайшее время выйдет 7я Long-term версия. https://help.mikrotik.com/docs/display/ROS/Routing+Protocol+Overview

Полезный материал, особенно на фоне отказа Google от L2TP на Android >11

Я правильно понимаю, что данный конфиг будет так же работать и с внешним Radius сервером без установки пакета с User Manager ?

Да. Правильно. С любым внешним.
В данном примере UserManager - локальный radius-сервер в составе RouterOS.

Сегодня специально обновился до 7 версии, чтобы сделать с минимальным количеством дополнительных действий (внешний радиус, генерация сертификата отдельно).

Итог: самсунг s23 не захотел нативным клиентом подключаться. На стороне сервера вижу что клиент не пытается передать логин. Strongswan на нём же подключился после импорта на телефон сертификата lets encrypt R3, до этого ругался на то, что не может ему доверять.

Мак подключился без проблем, без дополнительных телодвижений.

Интересно у кого-нибудь 13 андройд работает с подробным сервером?

Вот потому и отказать ROS7, слишком нестабильно и глючно.

Конкретно в моём случае нашёл обсуждения на реддите, что проблема в андройде, а не в микротике.

По-поводу 7 версии - у меня это уже 2 попытка. До этого на 7.2 обновлялся, потом откатился на 6 (у меня это виртуальная машина).

Сейчас снова обновился, пришлось перенастроить ospf, bgp и фильтры для префиксов. Всё остальное работает и проблем пока не обнаружил.

Но соглашусь, возможно под нагрузкой или со сложными конфигурациями могут быть баги.

Тоже не соглажусь, что пробелма в ros7. С win подключается без проблем, а с андроида пока не докопался до сути, но направление такое:

Поле user-name улетающее в радиус сервер вообще берется из поля "Идентификатор ipsec" в настройках соединения в андроиде. Но дело даже не в нем. Поля же "имя пользователя" и "пароль" с настроек андроида я насколько понимаю должны передаваться уже в eap сообщении. И видимо именно там чтото не так, так как радиус сервер отвечает что имя пользователя пустое. Буду признателен если кто подскажет как и чем дебажить eap сообщения.

По сертификату ниже писал, не надо импортировать его на клиента. Импортируйте всю цепочку в ros, и как подсказал автор поста укажите его в identity

На win проверил, после этих действий он сам подхватывается.

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

У меня на самом деле другая проблема с андройдом - у меня в радиус запрос даже не уходит. У меня всё ломается на этапе identity not found for peer: FQDN: (тут мой fqdn). Пробовал разные варианты - с андройдом никак не получилось.

Поковырялся некоторое время, до разборок детальных с eap msg так и не хватило пока времени. Но, наткнулся на ветку на форуме микротика и вот такое сообщение

There was a problem in the Android 11 client where some parts of the EAP-MSCHAPv2 exchange aren't padded correctly:

https://wiki.strongswan.org/issues/3673#note-4

I'm guessing it still hasn't been fixed for 13.

So basically if it's like the StrongSwan developer describes it, Google has been shipping completely broken IKEv2 EAP-MSCHAPv2 client for >2 years now.

If you search online, you can't exactly find anyone describing the native client working with any server for this method.

Don't know if a workaround could be implemented server side or not.

Подтвердить или опровергнуть не могу, как-нибудь руки если дойдут - отпишусь. Увы, пока strongswan.

Столкнулся с идентичной проблемой. Удалось ли продвинуться в дебаге?

А вы не пробовали вместо установки промежуточного сертификата на клиена, установить всю цепочку на маршрутизатор? Если не ошибаюсь - именно так надо и делать. По крайне мере несколько лет назад когда настраивал хотспот на микротике и редирект в нем на https, не мог понять почему при отсутствии интернета на клиенте он ругается на сертификат, а при наличии интернета с этой же страницей проблем нет. Маршрутизатор собственно и передает всю цепочку.

Да. Промежуточный сертификат R3 можно установить на стороне микротика, указав вместе с сертификатом хоста identity. Такой вариант тоже работает.

ЧТо может быть причиной? В логах микротик ничего не отображется

открыл 500, 4500 порты. Теперь другая ошибка, вы бы не могли подсказать фв ?

Здравствуйте!

Не могу найти причину следующей проблемы:

Соединение с сервером IKE успешно, сервер выдал клиенту локальный адрес.

Клиент андроид стронгсван - захожу в браузер проверять публичный адрес, который должен быть равен адресу сервера, а он как был клиентский так и остался.

Как пустить весь траффик через сервер? Какие правила в firewall нужны?

Единственная инструкция, по которой поднялся коннект со стандартного клиента Samsung S23 Ultra. Единственный момент, на телефоне после подключения VPN нет интернета. Всё что за пределами локалки тика, для телефона не доступно.

не могли бы вы заскринить настройки на нативном клиенте Андроида? я так и не смог победить, даже с дефолтными кредами из статьи.
И порты на роутере открыл, и все команды перепроверил, но в логах чисто, а телефон на 13 андроиде не коннектится.

так на телефоне настроек то и нет особо. https://hd.zp.ua/wp-content/uploads/2023/09/photo_2023-09-19_00-22-36-308x600.jpg

MSCHAPv2 там только адрес сервера, логин и пароль.

Вы обратите внимание на настройку где 2 сертификата

https://habrastorage.org/r/w1560/getpro/habr/upload_files/c24/e4c/558/c24e4c55861a5bcc7c43d92f2f3a4660.png

Всртоенные клиенты в Android весьма странные. Например, у меня невозможно сохранить настройки для IKEv2 EAP-MSCHAP. Видимо, поддерживается работа только по сертификатам - это не проверял. Единственный надёжный работающий вариант - Strongswan Android клиент.

Так на сайте в документации микротика и не рассматривают другой вариант

Все как всегда круто и просто Николай Николаевич, вот только в строке: /ip/ipsec/mode-config add address-pool=vpn-pool name=ike2-modconf split-include=10.10.4.0/24 system-dns=yes а на скрине /32 по сути не очень большая критика, но все же... Я сделал для себя 0.0.0.0/0 для выхода в Интернет. И еще, у кого запрет RAW либо фаером трансялция DNS, не забудьте разрешить, чтобы через ваш Микротик ходил DNS извне на IKEv2 VPN, либо спец правило... Либо сделать около так:

Скачать сертификат LE R3 можно по прямой ссылке

И еще вот такую помогайку можно сделать, на обновление LE сертификата:
/ip firewall filter
add action=accept chain=input comment="LE renew Cert R3" disabled=yes dst-port=80 protocol=tcp

/system scheduler
add interval=11w3d name=LErenewR3Schd on-event=LErenewR3 policy=read,write,policy,test,sniff,sensitive start-date=2024-05-31 start-time=04:00:00

/system script
add dont-require-permissions=no name=LErenewR3 owner=admin policy=ftp,read,write,policy,test,sniff,sensitive source="/ip service enable www;\r
\n/ip firewall filter enable [find comment="LE renew Cert R3"];\r
\n/certificate/enable-ssl-certificate dns-name=УКАЗАТЬ ВАШ LE R3 ДОМЕН\r
\n:delay 60;\r
\n/ip firewall filter disable [find comment="LE renew Cert R3"];\r
\n/ip service disable www;"

УКАЗАТЬ ВАШ LE R3 ДОМЕН - из примера статьи: gw1.mt-courses.ru

Всем мира и добра!

Тк скрипт после срабатывания, подставляет ca, тк файл меняет свое имя, вот поправленный скрипт:

/system script
add dont-require-permissions=no name=LErenewR3 owner=admin policy=ftp,read,write,policy,test,sniff,sensitive source="/ip service enable www;\r
\n/ip firewall filter enable [find comment="LE renew Cert R3"];\r
\n/certificate/enable-ssl-certificate dns-name=УКАЗАТЬ ВАШ LE R3 ДОМЕН;\r
\n:delay 60;\r
\n:local renewcert [ /certificate get [find common-name=УКАЗАТЬ ВАШ LE R3 ДОМЕН] name ]; /ip ipsec identity set [ find peer=ike2_peer ] certificate="$renewcert,lets-encrypt-r3.der";\r
\n/ip firewall filter disable [find comment="LE renew Cert R3"];\r
\n/ip service disable www;"

Настраиваю такую же схему ike2, но с собственными сертификатами, от своего DC CA. На клиенте сертификат центра сертификации лежит в доверенных. Получаю ошибку 13801. Пытался в IPSec Identity так же указывать основной сертификат и сертификат CA, результат такой же. Что то делаю не так, но не могу понять что... Буду благодарен за комментарии к моей ситуации

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории