Введение
Рано или поздно в любой системе начинают появляться какие-то новые компоненты, с которыми раньше не приходилось сталкиваться. Так и в моем случае в парке удаленных маршрутизаторов Mikrotik под моим управлением появилось некоторое количество устройств Ubiquiti, которые тоже требовали удаленного управления. Для устройств Mikrotik давно был развернут VPN сервер L2TP/IPSEc и OpenVPN для особо сложных случаев, когда IPSEc отказывался работать от объекта заказчиков. Документация на Ubiquiti показывала, что клиентом L2TP/IPSEc он быть не может, но вроде поддерживает OpenVPN. Данная статья – шпаргалка для решения подобных задач
Постановка задачи
Есть маршрутизатор Ubiquiti EdgeRouter 6P (прошивка v2.0.9-hotfix.2), находящийся у клиента. Есть OpenVPN сервер на маршрутизторе Mikrotik (прошивка 6.48.5 long-term) в центре управления по адресу ovpn.example.com. На сервер надо:
Установить соединение OpenVPN/tcp (авторизация по паре логин/пароль)
Маршрутизировать сети центра управления в этот туннель
Разрешать удаленное управление через туннель по SSH и HTTPS
Поддерживать туннель в рабочем состоянии
Предполагается что логин и пароль для создаваемого туннеля, а также информация о удаленном объекте (например о адресах в LAN Ubiquiti) уже заведена в /ppp secrets
на стороне сервера
Сертификаты Mikrotik
Те, кто эксплуатирует устройства Mikrotik знают их несколько «расслабленное» отношение к сертификатам. Так для работы служб www-ssl, openvpn и, в некоторых случаях, аутентификации peer-ов IPSEc не требуется наличие в сертификате тех или иных Usage полей. Mikrotik вполне позволит сконфигурировать OpenVPN сервер с сертификатом, в котором не будет отмечено Usage: digitalSignature и keyEncipherment
Однако устройства Ubiquiti относятся к сертификатам значительно более строго, и при попытке соединения с OpenVPN сервером устройства проверяют соответствие сертификата сервера сконфигурированному CA сертификату, а также наличие в сертификате сервера разрешенного применения digitalSignature и keyEncipherment (по документации OpenVPN ещё требуется атрибут keyAgreement, но в моем случае все заработало и без него).
Таким образом первый шаг – проверка и экспорт сертификатов с Mikrotik
Шаг 1: Выяснить, какой сертификат использует OpenVPN сервер
/interface ovpn-server server> print
enabled: yes
port: 1194
mode: ip
netmask: 24
mac-address: FE:FB:79:10:20:30
max-mtu: 1500
keepalive-timeout: 60
default-profile: l2tp-profile
certificate: router-tls
require-client-certificate: no
auth: sha1
cipher: aes128,aes192,aes256
В нашем случае используется сертификат “router-tls”
Шаг 2: проверяем параметры сертификата сервера
/interface ovpn-server server> /certificate print detail where name=router-tls
Flags: K - private-key, L - crl, C - smart-card-key, A - authority, I - issued, R - revoked, E - expired, T - trusted
0 K I name="router-tls" digest-algorithm=sha256 key-type=rsa country="ru" state="foo" locality="bar" common-name="router-tls" key-size=2048 subject-alt-name="" days-valid=900 trusted=no
key-usage=digital-signature,key-encipherment,tls-server,tls-client ca=router-ca serial-number="568688839A18E0EA"
fingerprint="a70aa4ff8ac976376847c600046a30a1156cb4815aa72d2161b1ff6df34e9693" akid=e5c220ab170145b0fc22c7cccca3ce6ed9bc51c6 skid=89851a176de1eac0adca72da7ac473df9c3bf800
invalid-before=nov/14/2021 18:16:21 invalid-after=may/02/2024 18:16:21 expires-after=126w4d3h40m
Здесь проверяем:
Наличие в Key usage digitalSignature и keyEncipherment
Название сертификата CA (ca=router-ca)
ID ключа CA (akid=e5c220ab170145b0fc22c7cccca3ce6ed9bc51c6)
Шаг 3: проверяем параметры сертификата CA
/certificate print detail where name=router-ca
Flags: K - private-key, L - crl, C - smart-card-key, A - authority, I - issued, R - revoked, E - expired, T - trusted
0 KL A T name="router-ca" issuer=C=ru,ST=foo,L=bar,O=home,OU=dit,CN=router digest-algorithm=sha256 key-type=rsa country="ru" state="foo" locality="bar"
organization="home" unit="dit" common-name="router-ca" key-size=2048
days-valid=3650 trusted=yes key-usage=digital-signature,key-cert-sign,crl-sign serial-number="179F9227D44CF776"
fingerprint="b4379771fd506d6bfbdb62c7b42f1f3fc61067926d5e036e875e735c63065499" akid="" skid=e5c220ab170145b0fc22c7cccca3ce6ed9bc51c6 invalid-before=apr/27/2017 12:04:14
invalid-after=apr/25/2027 12:04:14 expires-after=281w6d21h24m29s
Здесь проверяем:
Наличие в Key Usage key-cert-sign и crl-sign
SKID данного сертификата должен быть тем же что и AKID сертификата сервера OpenVPN
Шаг 4: экспортируем сертификат CA
/certificate export-certificate router-ca file-name=router-ca
/file print
# NAME TYPE SIZE CREATION-TIME
0 router-ca.crt .crt file 1493 nov/28/2021 14:54:24
1 flash disk nov/15/2021 12:31:18
2 flash/pub directory nov/15/2021 12:31:18
3 flash/skins directory jan/01/1970 03:00:19
Скачиваем файл router-ca.crt
Настройки Ubiquiti
Устройства Ubiquiti обладают красивым веб-интерфейсом, однако его функционал местами сильно ограничен. Так, например создание OpenVPN клиентов реализовано настолько нетривиально, что проще все настройки делать через SSH используя CLI
Одной из приятных особенностей Ubiquiti является использование вполне честного Linux-а в качестве ОС и возможности переключится из CLI маршрутизатора в обыкновенный bash командой “sudo su” в CLI маршрутизатора
Для создания соединения потребуется выполнить следующее:
Скопировать файл с сертификатом CA на маршрутизатор
Создать файл конфигурации OpenVPN с маршрутами до центра управления
Создать файл с логином паролем
Создать туннель по конфигурации
Добавить туннель в группу портов LAN для обеспечения удаленного управления
Шаг 1: создаем файлы
Большинство руководств найденных в сети предлагают держать файлы конфигураций для туннелей в директории /config/auth
С помощью scp копируем файл сертификата CA на Ubiquiti, заходим на маршрутизатор по ssh и оказываемся в CLI маршрутизатора:
admin@ubnt:~$ sudo su
root@ubnt:/home/admin#
Мы в домашней директории. Файл с сертификатом должен быть здесь. Скопируем его в рекомендованное место:
cp router-ca.crt /config/auth/
В директории /config/auth создадим файл конфигурации OpenVPN
root@ubnt:/config/auth# cd /config/auth
root@ubnt:/config/auth# cat > config.ovpn
client
route 10.10.50.0 255.255.255.0
dev tun
proto tcp
persist-key
persist-tun
remote ovpn.example.com
port 1194
ca /config/auth/router-ca.crt
tls-client
remote-cert-tls server
verb 6
auth-nocache
mute 10
auth SHA1
cipher AES-256-CBC
#redirect-gateway def1
auth-user-pass /config/auth/ovpn_auth.txt
В данном файле мы описываем клиента, подключающегося по протоколу TCP к серверу ovpn.example.com. На сервере должен быть сертификат, подписанный сертификатом CA из файла /config/auth/router-ca.crt.
Авторизация проводится по логину паролю из файла /config/auth/ovpn_auth.txt
При успешном соединении добавляется маршрут на сеть 10.10.50.0/24 (сеть центра управления)
В файле /config/auth/ovpn_auth.txt первая строка – логин, вторая – пароль пользователя. Если все сделано правильно, то в директории /config/auth должно оказаться 3 файла:
root@ubnt:/config/auth# ls -l
total 20
-rw-r--r-- 1 root vyattacf 1834 Nov 28 12:57 router-ca.crt
-rw-r--r-- 1 admin vyattacf 297 Nov 28 12:58 config.ovpn
-rw-r--r-- 1 admin vyattacf 29 Nov 28 12:59 ovpn_auth.txt
Шаг 2: настраиваем туннель через CLI
Возвращаемся в CLI маршрутизатора из bash (CTRL-D) и переходим в режим редактирования конфигурации
admin@ubnt:~$ configure
admin@ubnt#
Далее описываем параметры нашего соединения:
set interfaces openvpn vtun1 description "CNC tunnel"
set interfaces openvpn vtun1 config-file /config/auth/config.ovpn
commit
если все сделано правильно и маршрутизатор не ругнулся, добавляем интерфейс vtun0 к LAN-портам
set port-forward lan-interface vtun0
commit
С этого момента статус соединения можно посмотреть в веб-интерфейсе (в разделе Dashboard) и маршрутизатор должен управляться из центра управления
Комментарии (6)
AcidVenom
28.11.2021 22:33У вас отмечены key-usage=digital-signature,key-encipherment,tls-server,tls-client в сертификате UBNT.
наличие в сертификате сервера разрешенного применения digitalSignature и keyEncipherment (по документации OpenVPN ещё требуется атрибут keyAgreement, но в моем случае все заработало и без него).
keyEncipherment может относить только к tls-server.
aborouhin
Вот это меня так удивило, что аж гуглить полез. Там же честный линукс с возможностью собственные deb-пакеты ставить (собранные под соотв. архитектуру и довольно древнюю версию Debian, но всё же). Я на своём EdgeRouter даже BGP-демона с встроенной quagga на bird менял... Но гугл и правда не находит решений. Странно.
P.S. Если тормоза OpenVPN/TCP достанут-таки и при этом нет аллергии на (a) WireGuard и (b) установку testing-прошивки на Mikrotik - то вот Вам ещё один вариант туннеля между описанными девайсами. WG на EdgeRouter'ах работает замечательно, проверено длительным опытом.
Blck-1 Автор
Да, сам был немало удивлен, с учетом высокой популярности бренда, но увы, не умеет он L2TP клиента
Что до использования wireguard-а, и, тем более, бета-прошивок, то я пока потерплю :)
WG штука, конечно, модная, но поддерживается далеконе все что у меня в хозяйстве есть а микротики были замечены в ломании вполне работающих вещей даже в stable коде, так что они могут накрутить в бетах я себе даже боюсь представить :)
Эксплуатация OpenVPN/tcp на флоте из 50+ устройств показывает, что производительности вполне хватает для задач управления, а в случае девайсов типа 4011 можно и FullHD кино посмотреть через такое соединение
aborouhin
Ну у Микротиков уже не бета, а аж 6-й Release candidate прошивки 7.1, так что скоро ждём WG в stable :)
Для управления, конечно, любого туннеля за глаза, а вот для задачи "завернуть весь трафик в туннель" OpenVPN уж очень лихо снижает пропускную способность канала по пере увеличения latency, и от мощности маршрутизаторов с обеих сторон это не зависит. WG ну прямо качественно шустрее получается.