OpenVPN на MikroTik — настройка site-to-site VPN
OpenVPN — один из самых распространённых VPN-протоколов в мире. MikroTik RouterOS поддерживает OpenVPN начиная с версии 3.x, однако реализация имеет ряд ограничений по сравнению с полноценным OpenVPN Community. В этом руководстве разберём, когда стоит использовать OpenVPN на MikroTik, как создать сертификаты, настроить сервер и клиент, организовать site-to-site VPN и обеспечить корректную маршрутизацию.
Описание
Когда использовать OpenVPN на MikroTik
OpenVPN на MikroTik целесообразен в следующих сценариях:
- Совместимость с третьими сторонами — когда удалённая сторона использует OpenVPN на Linux/Windows/pfSense и не может перейти на WireGuard или L2TP
- Проход через строгие файрволы — OpenVPN работает по TCP 443, что позволяет маскировать VPN-трафик под HTTPS
- Интеграция с существующей PKI-инфраструктурой — если в компании уже развёрнут центр сертификации
Ограничения реализации в RouterOS
Прежде чем начинать настройку, важно знать о существенных ограничениях:
| Ограничение | Описание |
|---|---|
| Только TCP | RouterOS не поддерживает UDP-транспорт для OpenVPN. Это увеличивает latency и снижает производительность из-за эффекта «TCP over TCP» |
| Нет LZO/LZ4 сжатия | Сжатие трафика не поддерживается, что увеличивает объём передаваемых данных |
| Нет TLS-auth | Дополнительный уровень защиты HMAC недоступен |
| Только tun (Layer 3) | Режим tap (Layer 2 bridging) не поддерживается начиная с RouterOS 7 |
| Ограниченные cipher | Поддерживаются AES-128-CBC, AES-192-CBC, AES-256-CBC, AES-128-GCM, AES-256-GCM |
| Один порт на сервер | Нельзя запустить несколько серверов на разных портах без обходных решений |
Если обе стороны — MikroTik, рассмотрите WireGuard или IPsec как более производительные альтернативы. OpenVPN оправдан при необходимости совместимости с третьими устройствами.
Схема сети
В нашем примере мы соединяем два офиса:
- Офис A (сервер): WAN 203.0.113.10, LAN 192.168.10.0/24
- Офис B (клиент): WAN 198.51.100.20, LAN 192.168.20.0/24
- Туннель: 10.10.10.0/24 (сервер — 10.10.10.1, клиент — 10.10.10.2)
Настройка
Шаг 1: Создание сертификатов
OpenVPN требует PKI-инфраструктуру: корневой сертификат CA, сертификат сервера и сертификат клиента. Все сертификаты создаём на сервере (Офис A).
Создание корневого CA:
[admin@MikroTik] >/certificate add name=ca-template common-name=ovpn-ca \ key-size=2048 days-valid=3650 key-usage=key-cert-sign,crl-sign /certificate sign ca-template ca-crl-host=203.0.113.10
Дождитесь завершения подписания — статус должен измениться на signed. Проверить можно командой:
[admin@MikroTik] >/certificate print detail where name=ca-template
В поле status должно быть значение, содержащее флаг trusted. Если нет — назначьте вручную:
[admin@MikroTik] >/certificate set ca-template trusted=yes
Создание сертификата сервера:
[admin@MikroTik] >/certificate add name=server-template common-name=ovpn-server \ key-size=2048 days-valid=1825 key-usage=digital-signature,key-encipherment,tls-server /certificate sign server-template ca=ca-template
Создание сертификата клиента:
[admin@MikroTik] >/certificate add name=client-template common-name=ovpn-client \ key-size=2048 days-valid=1825 key-usage=tls-client /certificate sign client-template ca=ca-template
Экспорт сертификатов для клиента:
Клиенту потребуются: CA-сертификат, клиентский сертификат и клиентский ключ.
[admin@MikroTik] >/certificate export-certificate ca-template file-name=ca-cert /certificate export-certificate client-template file-name=client-cert export-passphrase="SecurePass123"
Файлы появятся в /file. Перенесите их на клиентский MikroTik через FTP, SFTP или drag-and-drop в Winbox.
Шаг 2: Импорт сертификатов на клиенте
На маршрутизаторе Офиса B выполните импорт:
[admin@MikroTik] >/certificate import file-name=ca-cert.crt passphrase="" /certificate import file-name=client-cert.crt passphrase="SecurePass123" /certificate import file-name=client-cert.key passphrase="SecurePass123"
Проверьте, что сертификаты импортированы:
[admin@MikroTik] >/certificate print
Убедитесь, что CA-сертификат помечен как trusted:
[admin@MikroTik] >/certificate set [find common-name=ovpn-ca] trusted=yes
Шаг 3: Создание пользователя для аутентификации
OpenVPN на MikroTik использует двойную аутентификацию: сертификаты + логин/пароль. Создаём PPP-профиль и пользователя на сервере.
Профиль:
[admin@MikroTik] >/ppp profile add name=ovpn-site-to-site \ local-address=10.10.10.1 \ remote-address=10.10.10.2 \ dns-server=10.10.10.1 \ use-encryption=required
Пользователь (secret):
[admin@MikroTik] >/ppp secret add name=office-b password="VPNpassw0rd!" \ service=ovpn profile=ovpn-site-to-site
Шаг 4: Настройка OVPN-сервера
Включаем сервер OpenVPN на Офисе A:
[admin@MikroTik] >/interface ovpn-server server set enabled=yes \ port=1194 \ mode=ip \ protocol=tcp \ certificate=server-template \ require-client-certificate=yes \ auth=sha256 \ cipher=aes256-cbc,aes256-gcm \ default-profile=ovpn-site-to-site \ tls-version=only-1.2
Параметры:
| Параметр | Значение | Описание |
|---|---|---|
| port | 1194 | Стандартный порт OpenVPN |
| mode | ip | Layer 3 туннель (tun) |
| protocol | tcp | Единственный поддерживаемый транспорт |
| cipher | aes256-cbc,aes256-gcm | Шифрование — GCM предпочтительнее |
| auth | sha256 | Алгоритм аутентификации HMAC |
| tls-version | only-1.2 | Минимальная версия TLS |
| require-client-certificate | yes | Обязательная проверка клиентского сертификата |
Шаг 5: Настройка OVPN-клиента
На маршрутизаторе Офиса B создаём клиентский интерфейс:
[admin@MikroTik] >/interface ovpn-client add name=ovpn-to-office-a \ connect-to=203.0.113.10 \ port=1194 \ mode=ip \ protocol=tcp \ certificate=client-cert.crt_0 \ auth=sha256 \ cipher=aes256-cbc,aes256-gcm \ tls-version=only-1.2 \ user=office-b \ password="VPNpassw0rd!" \ add-default-route=no \ disabled=no
Обратите внимание: имя сертификата после импорта может отличаться от имени файла. Проверьте точное имя через /certificate print.
Шаг 6: Маршрутизация
Для прохождения трафика между офисными сетями необходимы статические маршруты.
На сервере (Офис A):
[admin@MikroTik] >/ip route add dst-address=192.168.20.0/24 gateway=10.10.10.2 \ comment="Route to Office B via OpenVPN"
На клиенте (Офис B):
[admin@MikroTik] >/ip route add dst-address=192.168.10.0/24 gateway=ovpn-to-office-a \ comment="Route to Office A via OpenVPN"
Шаг 7: Настройка Firewall
Откройте порт для входящих подключений на сервере и разрешите транзит трафика через туннель.
На сервере (Офис A):
[admin@MikroTik] ># Разрешить входящие подключения OpenVPN /ip firewall filter add chain=input protocol=tcp dst-port=1194 \ action=accept comment="Allow OpenVPN" place-before=0 # Разрешить forward через туннель /ip firewall filter add chain=forward in-interface=<ovpn-server-binding> \ action=accept comment="Allow OpenVPN forward in" place-before=0 /ip firewall filter add chain=forward out-interface=<ovpn-server-binding> \ action=accept comment="Allow OpenVPN forward out" place-before=0
Имя серверного интерфейса привязки (binding) создаётся автоматически при подключении клиента. Его можно увидеть в /interface print после установки соединения. Для упрощения правил используйте interface list:
[admin@MikroTik] >/interface list add name=ovpn-tunnels /interface list member add list=ovpn-tunnels interface=<ovpn-server-binding> /ip firewall filter add chain=forward \ in-interface-list=ovpn-tunnels action=accept \ comment="Allow forward from OpenVPN" place-before=0 /ip firewall filter add chain=forward \ out-interface-list=ovpn-tunnels action=accept \ comment="Allow forward to OpenVPN" place-before=0
На клиенте (Офис B):
[admin@MikroTik] >/ip firewall filter add chain=forward in-interface=ovpn-to-office-a \ action=accept comment="Allow OpenVPN forward in" place-before=0 /ip firewall filter add chain=forward out-interface=ovpn-to-office-a \ action=accept comment="Allow OpenVPN forward out" place-before=0
Также убедитесь, что на обоих маршрутизаторах трафик между LAN и VPN не попадает под masquerade. Если у вас есть правило NAT для всего исходящего трафика, добавьте исключение:
[admin@MikroTik] >/ip firewall nat add chain=srcnat \ src-address=192.168.10.0/24 dst-address=192.168.20.0/24 \ action=accept place-before=0 comment="No NAT for VPN traffic"
Проверка
Проверка статуса соединения
На сервере проверяем активные подключения:
[admin@MikroTik] >/interface ovpn-server print
На клиенте проверяем статус интерфейса:
[admin@MikroTik] >/interface ovpn-client print # Поле "status" должно быть "connected" /interface ovpn-client monitor ovpn-to-office-a
Проверка маршрутов
[admin@MikroTik] >/ip route print where gateway=10.10.10.2 /ip route print where gateway=ovpn-to-office-a
Тестирование связности
С сервера (Офис A):
[admin@MikroTik] ># Ping клиентский адрес туннеля /ping 10.10.10.2 count=5 # Ping хост в удалённой LAN /ping 192.168.20.1 count=5 src-address=192.168.10.1
С клиента (Офис B):
[admin@MikroTik] >/ping 10.10.10.1 count=5 /ping 192.168.10.1 count=5 src-address=192.168.20.1
Мониторинг трафика
[admin@MikroTik] >/interface monitor-traffic ovpn-to-office-a once
Просмотр логов
Для диагностики включите логирование OpenVPN:
[admin@MikroTik] >/system logging add topics=ovpn,debug action=memory /log print where topics~"ovpn"
После завершения диагностики отключите debug-логирование:
[admin@MikroTik] >/system logging remove [find where topics~"ovpn" && action=memory]
Типичные ошибки
1. Ошибка «TLS handshake failed»
Причина: несовпадение сертификатов или CA не помечен как trusted.
Решение:
[admin@MikroTik] ># Убедитесь, что CA-сертификат trusted на обеих сторонах /certificate print detail where common-name=ovpn-ca # Если нет флага trusted: /certificate set [find common-name=ovpn-ca] trusted=yes
Также проверьте, что на клиенте используется именно тот сертификат, который был подписан серверным CA.
2. Соединение устанавливается, но трафик не проходит
Причина: отсутствуют маршруты или файрвол блокирует forward.
Решение:
[admin@MikroTik] ># Проверьте маршруты на обеих сторонах /ip route print where dst-address=192.168.20.0/24 # Проверьте правила firewall — ищите drop для VPN-трафика /ip firewall filter print where chain=forward # Проверьте, нет ли NAT для VPN-трафика /ip firewall nat print
3. Низкая производительность (TCP over TCP)
Причина: OpenVPN на MikroTik работает только по TCP. При передаче TCP-трафика через TCP-туннель возникает двойной контроль потока.
Решение: это архитектурное ограничение RouterOS. Варианты:
- Увеличьте MTU/MSS туннеля для снижения накладных расходов
- Рассмотрите переход на WireGuard или IPsec для site-to-site сценария
- Для существующих настроек уменьшите TCP window size:
[admin@MikroTik] >/ip firewall mangle add chain=forward \ protocol=tcp out-interface=<ovpn-interface> \ action=change-mss new-mss=1360 \ tcp-flags=syn passthrough=yes
4. Ошибка «certificate is not yet valid» или «certificate expired»
Причина: некорректное системное время на одном из маршрутизаторов.
Решение:
[admin@MikroTik] ># Проверьте время /system clock print # Настройте NTP-клиент /system ntp client set enabled=yes /system ntp client servers add address=pool.ntp.org
5. Клиент подключается, но получает неверный IP
Причина: некорректный PPP-профиль или конфликт адресов.
Решение:
[admin@MikroTik] ># Проверьте профиль /ppp profile print where name=ovpn-site-to-site # Проверьте secret /ppp secret print where name=office-b # Убедитесь, что адреса 10.10.10.1 и 10.10.10.2 не используются другими интерфейсами /ip address print where address~"10.10.10"
6. Невозможно подключиться с стороннего OpenVPN-клиента
При подключении клиента на Linux/Windows убедитесь, что конфигурационный файл .ovpn соответствует параметрам сервера:
codeclient dev tun proto tcp remote 203.0.113.10 1194 resolv-retry infinite nobind persist-key persist-tun ca ca-cert.crt cert client-cert.crt key client-cert.key cipher AES-256-CBC auth SHA256 tls-version-min 1.2 auth-user-pass verb 3
Обратите внимание: параметр comp-lzo не должен быть указан, так как MikroTik не поддерживает сжатие. Параметр auth-user-pass необходим, так как MikroTik требует логин/пароль помимо сертификатов.
Рекомендации по безопасности
- Используйте AES-256-GCM вместо CBC — он быстрее и безопаснее
- Регулярно обновляйте сертификаты — не создавайте их с бесконечным сроком действия
- Ограничьте доступ по src-address в правилах файрвола, если IP клиента статический
- Мониторьте активные сессии через
/ppp active print - Используйте отдельный PPP-профиль для каждого типа подключения (site-to-site, remote access)
[admin@MikroTik] ># Мониторинг активных VPN-сессий /ppp active print # Принудительное отключение клиента /ppp active remove [find name=office-b]
OpenVPN на MikroTik — надёжное решение для совместимости с оборудованием третьих производителей. Однако для новых site-to-site инсталляций между устройствами MikroTik рассмотрите WireGuard (проще настройка, выше производительность) или IPsec IKEv2 (стандарт индустрии, аппаратное ускорение на многих моделях).
/certificate add name=ca-template common-name=ovpn-ca \ key-size=2048 days-valid=3650 key-usage=key-cert-sign,crl-sign /certificate sign ca-template ca-crl-host=203.0.113.10 /certificate print detail where name=ca-template /certificate set ca-template trusted=yes /certificate add name=server-template common-name=ovpn-server \ key-size=2048 days-valid=1825 key-usage=digital-signature,key-encipherment,tls-server /certificate sign server-template ca=ca-template /certificate add name=client-template common-name=ovpn-client \ key-size=2048 days-valid=1825 key-usage=tls-client /certificate sign client-template ca=ca-template /certificate export-certificate ca-template file-name=ca-cert /certificate export-certificate client-template file-name=client-cert export-passphrase="SecurePass123" /certificate import file-name=ca-cert.crt passphrase="" /certificate import file-name=client-cert.crt passphrase="SecurePass123" /certificate import file-name=client-cert.key passphrase="SecurePass123" /certificate print /certificate set [find common-name=ovpn-ca] trusted=yes /ppp profile add name=ovpn-site-to-site \ local-address=10.10.10.1 \ remote-address=10.10.10.2 \ dns-server=10.10.10.1 \ use-encryption=required /ppp secret add name=office-b password="VPNpassw0rd!" \ service=ovpn profile=ovpn-site-to-site /interface ovpn-server server set enabled=yes \ port=1194 \ mode=ip \ protocol=tcp \ certificate=server-template \ require-client-certificate=yes \ auth=sha256 \ cipher=aes256-cbc,aes256-gcm \ default-profile=ovpn-site-to-site \ tls-version=only-1.2 /interface ovpn-client add name=ovpn-to-office-a \ connect-to=203.0.113.10 \ port=1194 \ mode=ip \ protocol=tcp \ certificate=client-cert.crt_0 \ auth=sha256 \ cipher=aes256-cbc,aes256-gcm \ tls-version=only-1.2 \ user=office-b \ password="VPNpassw0rd!" \ add-default-route=no \ disabled=no /ip route add dst-address=192.168.20.0/24 gateway=10.10.10.2 \ comment="Route to Office B via OpenVPN" /ip route add dst-address=192.168.10.0/24 gateway=ovpn-to-office-a \ comment="Route to Office A via OpenVPN" # Разрешить входящие подключения OpenVPN /ip firewall filter add chain=input protocol=tcp dst-port=1194 \ action=accept comment="Allow OpenVPN" place-before=0 # Разрешить forward через туннель /ip firewall filter add chain=forward in-interface=<ovpn-server-binding> \ action=accept comment="Allow OpenVPN forward in" place-before=0 /ip firewall filter add chain=forward out-interface=<ovpn-server-binding> \ action=accept comment="Allow OpenVPN forward out" place-before=0 /interface list add name=ovpn-tunnels /interface list member add list=ovpn-tunnels interface=<ovpn-server-binding> /ip firewall filter add chain=forward \ in-interface-list=ovpn-tunnels action=accept \ comment="Allow forward from OpenVPN" place-before=0 /ip firewall filter add chain=forward \ out-interface-list=ovpn-tunnels action=accept \ comment="Allow forward to OpenVPN" place-before=0 /ip firewall filter add chain=forward in-interface=ovpn-to-office-a \ action=accept comment="Allow OpenVPN forward in" place-before=0 /ip firewall filter add chain=forward out-interface=ovpn-to-office-a \ action=accept comment="Allow OpenVPN forward out" place-before=0 /ip firewall nat add chain=srcnat \ src-address=192.168.10.0/24 dst-address=192.168.20.0/24 \ action=accept place-before=0 comment="No NAT for VPN traffic" /interface ovpn-server print /interface ovpn-client print # Поле "status" должно быть "connected" /interface ovpn-client monitor ovpn-to-office-a /ip route print where gateway=10.10.10.2 /ip route print where gateway=ovpn-to-office-a # Ping клиентский адрес туннеля /ping 10.10.10.2 count=5 # Ping хост в удалённой LAN /ping 192.168.20.1 count=5 src-address=192.168.10.1 /ping 10.10.10.1 count=5 /ping 192.168.10.1 count=5 src-address=192.168.20.1 /interface monitor-traffic ovpn-to-office-a once /system logging add topics=ovpn,debug action=memory /log print where topics~"ovpn" /system logging remove [find where topics~"ovpn" && action=memory] # Убедитесь, что CA-сертификат trusted на обеих сторонах /certificate print detail where common-name=ovpn-ca # Если нет флага trusted: /certificate set [find common-name=ovpn-ca] trusted=yes # Проверьте маршруты на обеих сторонах /ip route print where dst-address=192.168.20.0/24 # Проверьте правила firewall — ищите drop для VPN-трафика /ip firewall filter print where chain=forward # Проверьте, нет ли NAT для VPN-трафика /ip firewall nat print /ip firewall mangle add chain=forward \ protocol=tcp out-interface=<ovpn-interface> \ action=change-mss new-mss=1360 \ tcp-flags=syn passthrough=yes # Проверьте время /system clock print # Настройте NTP-клиент /system ntp client set enabled=yes /system ntp client servers add address=pool.ntp.org # Проверьте профиль /ppp profile print where name=ovpn-site-to-site # Проверьте secret /ppp secret print where name=office-b # Убедитесь, что адреса 10.10.10.1 и 10.10.10.2 не используются другими интерфейсами /ip address print where address~"10.10.10" client dev tun proto tcp remote 203.0.113.10 1194 resolv-retry infinite nobind persist-key persist-tun ca ca-cert.crt cert client-cert.crt key client-cert.key cipher AES-256-CBC auth SHA256 tls-version-min 1.2 auth-user-pass verb 3 # Мониторинг активных VPN-сессий /ppp active print # Принудительное отключение клиента /ppp active remove [find name=office-b]