Введение

Рано или поздно в любой системе начинают появляться какие-то новые компоненты, с которыми раньше не приходилось сталкиваться. Так и в моем случае в парке удаленных маршрутизаторов 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. На сервер надо:

  1. Установить соединение OpenVPN/tcp (авторизация по паре логин/пароль)

  2. Маршрутизировать сети центра управления в этот туннель

  3. Разрешать удаленное управление через туннель по SSH и HTTPS

  4. Поддерживать туннель в рабочем состоянии

Предполагается что логин и пароль для создаваемого туннеля, а также информация о удаленном объекте (например о адресах в 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

Здесь проверяем:

  1. Наличие в Key usage digitalSignature и keyEncipherment

  2. Название сертификата CA (ca=router-ca)

  3. 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

Здесь проверяем:

  1. Наличие в Key Usage  key-cert-sign и crl-sign

  2. 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 маршрутизатора

Для создания соединения потребуется выполнить следующее:

  1. Скопировать файл с сертификатом CA на маршрутизатор

  2. Создать файл конфигурации OpenVPN с маршрутами до центра управления

  3. Создать файл с логином паролем

  4. Создать туннель по конфигурации

  5. Добавить туннель в группу портов 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)


  1. aborouhin
    28.11.2021 18:56

    Документация на Ubiquiti показывала, что клиентом L2TP/IPSEc он быть не может

    Вот это меня так удивило, что аж гуглить полез. Там же честный линукс с возможностью собственные deb-пакеты ставить (собранные под соотв. архитектуру и довольно древнюю версию Debian, но всё же). Я на своём EdgeRouter даже BGP-демона с встроенной quagga на bird менял... Но гугл и правда не находит решений. Странно.

    P.S. Если тормоза OpenVPN/TCP достанут-таки и при этом нет аллергии на (a) WireGuard и (b) установку testing-прошивки на Mikrotik - то вот Вам ещё один вариант туннеля между описанными девайсами. WG на EdgeRouter'ах работает замечательно, проверено длительным опытом.


    1. Blck-1 Автор
      28.11.2021 19:24

      Да, сам был немало удивлен, с учетом высокой популярности бренда, но увы, не умеет он L2TP клиента

      Что до использования wireguard-а, и, тем более, бета-прошивок, то я пока потерплю :)
      WG штука, конечно, модная, но поддерживается далеконе все что у меня в хозяйстве есть а микротики были замечены в ломании вполне работающих вещей даже в stable коде, так что они могут накрутить в бетах я себе даже боюсь представить :)

      Эксплуатация OpenVPN/tcp на флоте из 50+ устройств показывает, что производительности вполне хватает для задач управления, а в случае девайсов типа 4011 можно и FullHD кино посмотреть через такое соединение


      1. aborouhin
        28.11.2021 19:34
        +1

        Ну у Микротиков уже не бета, а аж 6-й Release candidate прошивки 7.1, так что скоро ждём WG в stable :)

        Для управления, конечно, любого туннеля за глаза, а вот для задачи "завернуть весь трафик в туннель" OpenVPN уж очень лихо снижает пропускную способность канала по пере увеличения latency, и от мощности маршрутизаторов с обеих сторон это не зависит. WG ну прямо качественно шустрее получается.


  1. AcidVenom
    28.11.2021 22:33

    У вас отмечены key-usage=digital-signature,key-encipherment,tls-server,tls-client в сертификате UBNT.

    наличие в сертификате сервера разрешенного применения digitalSignature и keyEncipherment (по документации OpenVPN ещё требуется атрибут keyAgreement, но в моем случае все заработало и без него).

    keyEncipherment может относить только к tls-server.


  1. post_ed
    29.11.2021 03:33

    Подскажите, в mikrotik уже завезли openvpn через udp или все по-прежнему через tcp?


    1. Blck-1 Автор
      29.11.2021 03:35

      По прежнему tcp в ветках long-term и stable