VPN-клиент на MikroTik — подключение к серверу
VPN-клиент на MikroTik — подключение к удалённому серверу
MikroTik часто используется не только как VPN-сервер, но и как VPN-клиент — для подключения офисной или домашней сети к удалённому VPN-серверу. Типичные сценарии: подключение филиала к корпоративной сети через VPN, маршрутизация всего интернет-трафика через VPS для обхода ограничений, доступ к ресурсам удалённой компании. В этом руководстве настроим MikroTik как VPN-клиент для всех основных протоколов — WireGuard, L2TP/IPsec, OpenVPN, SSTP и IPsec IKEv2, разберём маршрутизацию (full tunnel и split tunnel), настроим policy-based routing для направления трафика отдельных устройств через VPN и сравним протоколы.
Описание
Сценарии использования MikroTik как VPN-клиента
| Сценарий | Описание | Рекомендуемый протокол |
|---|---|---|
| Филиал → головной офис | Подключение сети филиала к корпоративной | IPsec IKEv2, WireGuard |
| Весь трафик через VPS | Маршрутизация 0.0.0.0/0 через VPN-сервер на VPS | WireGuard |
| Отдельные устройства через VPN | Смартфон или ПК через VPN, остальные — напрямую | WireGuard + mangle |
| Доступ к ресурсам клиента | Подключение к VPN-серверу заказчика | L2TP/IPsec, OpenVPN |
| Резервный канал | VPN как backup при падении основного ISP | SSTP, OpenVPN (через TCP) |
Сравнение VPN-протоколов
| Параметр | WireGuard | L2TP/IPsec | OpenVPN | SSTP | IPsec IKEv2 |
|---|---|---|---|---|---|
| Скорость на MikroTik | Высокая | Средняя | Низкая | Средняя | Высокая |
| Простота настройки | Простая | Средняя | Сложная | Средняя | Сложная |
| Проход через NAT | Да (UDP) | Проблемы | Да (TCP 443) | Да (TCP 443) | Да (NAT-T) |
| Транспорт | UDP | UDP | TCP (в ROS) | TCP | UDP |
| Шифрование | ChaCha20/Poly1305 | AES + ESP | AES | AES + TLS | AES + ESP |
| Совместимость | Linux, VPS | Cisco, Windows | Универсальная | Windows, Azure | Cisco, Juniper |
| MTU overhead | ~60 байт | ~100 байт | ~80 байт | ~70 байт | ~60 байт |
| Поддержка в ROS 7 | Да | Да | Да (ограниченно) | Да | Да |
Рекомендация: Если VPN-сервер поддерживает WireGuard — используйте WireGuard. Это самый быстрый и простой вариант. Для совместимости с корпоративным оборудованием — IPsec IKEv2 или L2TP/IPsec.
Настройка
WireGuard-клиент
WireGuard — самый простой протокол для настройки. Предположим, VPN-сервер уже настроен (Linux VPS с WireGuard).
Данные от сервера:
- Endpoint:
198.51.100.1:51820 - Server public key:
SERVER_PUBLIC_KEY_HERE - Allowed IPs:
10.10.10.0/24 - Client IP:
10.10.10.2/32
[admin@MikroTik] ># Создаём интерфейс WireGuard /interface/wireguard/add name=wg-vpn listen-port=13231 # Смотрим публичный ключ MikroTik — передайте его администратору сервера /interface/wireguard/print where name=wg-vpn # Запишите значение public-key # Назначаем IP-адрес /ip/address/add address=10.10.10.2/32 interface=wg-vpn network=10.10.10.1 # Добавляем peer (VPN-сервер) /interface/wireguard/peers/add interface=wg-vpn \ public-key="SERVER_PUBLIC_KEY_HERE" \ endpoint-address=198.51.100.1 \ endpoint-port=51820 \ allowed-address=0.0.0.0/0 \ persistent-keepalive=25s
persistent-keepalive=25s — важен, когда MikroTik за NAT. Без него NAT-таблица провайдера может закрыть сессию при отсутствии трафика.
Full tunnel через WireGuard
Маршрутизация всего трафика через VPN:
[admin@MikroTik] ># Маршрут по умолчанию через WireGuard (с меньшим distance) /ip/route/add dst-address=0.0.0.0/0 gateway=wg-vpn distance=1 \ comment="Default route via WireGuard VPN" # Статический маршрут к endpoint серверу через реальный шлюз # (иначе сам WireGuard-трафик тоже пойдёт в туннель — петля) /ip/route/add dst-address=198.51.100.1/32 gateway=192.168.1.1 \ comment="WireGuard endpoint via ISP"
Важно: Маршрут к endpoint-адресу серверу (198.51.100.1) через шлюз провайдера необходим. Без него весь трафик, включая сам WireGuard, уйдёт в туннель, и соединение оборвётся.
Альтернативный подход — два маршрута вместо одного дефолтного:
[admin@MikroTik] >/ip/route/add dst-address=0.0.0.0/1 gateway=wg-vpn comment="VPN half 1" /ip/route/add dst-address=128.0.0.0/1 gateway=wg-vpn comment="VPN half 2"
Два маршрута /1 покрывают весь диапазон IPv4, но имеют более длинный prefix, чем дефолтный маршрут /0. Это означает, что они будут выбраны без конфликта с существующим дефолтным маршрутом.
Split tunnel через WireGuard
Только определённые сети через VPN:
[admin@MikroTik] ># Только трафик в корпоративную сеть — через VPN /ip/route/add dst-address=192.168.0.0/16 gateway=wg-vpn \ comment="Corporate networks via VPN" /ip/route/add dst-address=10.0.0.0/8 gateway=wg-vpn \ comment="Corporate networks via VPN"
L2TP/IPsec клиент
L2TP/IPsec — до сих пор популярен в корпоративных сетях (Cisco, Windows Server). MikroTik поддерживает его как клиент «из коробки».
[admin@MikroTik] ># Создаём L2TP-клиент /interface/l2tp-client/add name=l2tp-vpn \ connect-to=203.0.113.50 \ user="mikrotik-branch" \ password="L2tpPass123!" \ use-ipsec=yes \ ipsec-secret="SharedIPsecKey!" \ allow-fast-path=yes \ add-default-route=no \ disabled=no
Параметры:
| Параметр | Описание |
|---|---|
connect-to | IP или домен VPN-сервера |
user | Имя пользователя PPP |
password | Пароль PPP |
use-ipsec | Включить шифрование IPsec |
ipsec-secret | Pre-shared key для IPsec |
allow-fast-path | Аппаратное ускорение (если поддерживается) |
add-default-route | Автоматически добавлять маршрут 0.0.0.0/0 через VPN |
Проверяем подключение:
[admin@MikroTik] >/interface/l2tp-client/print # status должен быть connected /interface/l2tp-client/monitor l2tp-vpn once # Покажет: uptime, encoding, local-address, remote-address
Маршрутизация:
[admin@MikroTik] ># Split tunnel — только корпоративная сеть /ip/route/add dst-address=172.16.0.0/12 gateway=l2tp-vpn \ comment="Corporate via L2TP"
OpenVPN клиент
OpenVPN на MikroTik имеет ограничения (только TCP, нет LZO), но необходим для совместимости с существующими OpenVPN-серверами.
Подготовка: импорт сертификатов
Получите от администратора OpenVPN-сервера файлы:
ca.crt— сертификат CAclient.crt— клиентский сертификатclient.key— приватный ключ клиента
Загрузите их на MikroTik и импортируйте:
[admin@MikroTik] >/certificate/import file-name=ca.crt passphrase="" /certificate/import file-name=client.crt passphrase="" /certificate/import file-name=client.key passphrase="" # Переименуем для удобства /certificate/set [find where common-name~"CA"] name=ovpn-ca /certificate/set [find where common-name~"client"] name=ovpn-client
Создание OpenVPN-клиента
[admin@MikroTik] >/interface/ovpn-client/add name=ovpn-vpn \ connect-to=203.0.113.60 \ port=1194 \ mode=ip \ protocol=tcp \ certificate=ovpn-client \ verify-server-certificate=yes \ cipher=aes256-gcm \ auth=sha256 \ user="mikrotik" \ password="OvpnPass123!" \ add-default-route=no \ disabled=no
Параметры:
| Параметр | Описание |
|---|---|
connect-to | IP или домен OpenVPN-сервера |
port | Порт сервера (обычно 1194) |
mode | ip — Layer 3 (tun), единственный вариант в ROS 7 |
protocol | tcp — единственный поддерживаемый транспорт в RouterOS |
certificate | Клиентский сертификат |
cipher | Алгоритм шифрования (должен совпадать с сервером) |
auth | Алгоритм HMAC (должен совпадать с сервером) |
user/password | Если сервер использует дополнительную аутентификацию |
Проверка:
[admin@MikroTik] >/interface/ovpn-client/print /interface/ovpn-client/monitor ovpn-vpn once
Важно: Если OpenVPN-сервер использует UDP — MikroTik не сможет подключиться. Попросите администратора сервера добавить TCP-listener или рассмотрите альтернативный протокол.
SSTP клиент
SSTP (Secure Socket Tunneling Protocol) работает по TCP 443 и проходит через большинство файрволов, включая корпоративные прокси. Удобен для подключения к Windows Server.
[admin@MikroTik] >/interface/sstp-client/add name=sstp-vpn \ connect-to=203.0.113.70:443 \ user="mikrotik-sstp" \ password="SstpPass123!" \ certificate=none \ verify-server-certificate=no \ verify-server-address-from-certificate=no \ pfs=yes \ add-default-route=no \ disabled=no
Если сервер использует доверенный сертификат (Let's Encrypt):
[admin@MikroTik] >/interface/sstp-client/set sstp-vpn \ verify-server-certificate=yes \ verify-server-address-from-certificate=yes
Проверка:
[admin@MikroTik] >/interface/sstp-client/print /interface/sstp-client/monitor sstp-vpn once
IPsec IKEv2 Initiator
MikroTik как IKEv2-клиент — подключение к корпоративному IPsec VPN-серверу (Cisco, Juniper, другой MikroTik).
С Pre-Shared Key (PSK)
[admin@MikroTik] ># Profile (Phase 1) /ip/ipsec/profile/add name=ikev2-client-profile \ hash-algorithm=sha256 \ enc-algorithm=aes-256 \ dh-group=modp2048 \ nat-traversal=yes \ dpd-interval=30s # Proposal (Phase 2) /ip/ipsec/proposal/add name=ikev2-client-proposal \ auth-algorithms=sha256 \ enc-algorithms=aes-256-cbc \ pfs-group=modp2048 # Peer (VPN-сервер) /ip/ipsec/peer/add name=hq-vpn \ address=203.0.113.80 \ exchange-mode=ike2 \ profile=ikev2-client-profile \ send-initial-contact=yes # Identity (аутентификация) /ip/ipsec/identity/add peer=hq-vpn \ auth-method=pre-shared-key \ secret="VeryStr0ngPSK!Key" # Policy (какой трафик шифровать) /ip/ipsec/policy/add peer=hq-vpn \ src-address=192.168.88.0/24 \ dst-address=172.16.0.0/16 \ tunnel=yes \ sa-src-address=203.0.113.1 \ sa-dst-address=203.0.113.80 \ proposal=ikev2-client-proposal \ action=encrypt
С Mode Config (получение IP от сервера)
Если сервер выдаёт IP клиенту через Mode Config:
[admin@MikroTik] >/ip/ipsec/mode-config/add name=request-only \ responder=no /ip/ipsec/identity/set [find where peer=hq-vpn] \ mode-config=request-only \ generate-policy=port-strict
В этом случае policy создаётся автоматически на основе параметров, полученных от сервера.
Маршрутизация: Full tunnel vs Split tunnel
Full tunnel (весь трафик через VPN)
Для любого VPN-протокола:
[admin@MikroTik] ># Вариант 1: add-default-route в настройках клиента /interface/l2tp-client/set l2tp-vpn add-default-route=yes # Вариант 2: ручной маршрут с меньшей дистанцией /ip/route/add dst-address=0.0.0.0/0 gateway=l2tp-vpn distance=1 # Вариант 3: два маршрута /1 (не конфликтуют с дефолтным) /ip/route/add dst-address=0.0.0.0/1 gateway=wg-vpn /ip/route/add dst-address=128.0.0.0/1 gateway=wg-vpn
Не забудьте добавить маршрут к endpoint VPN-сервера через реальный шлюз провайдера:
[admin@MikroTik] >/ip/route/add dst-address=198.51.100.1/32 gateway=192.168.1.1 \ comment="VPN server endpoint via ISP"
Split tunnel (только определённые сети)
[admin@MikroTik] ># Корпоративные сети через VPN /ip/route/add dst-address=172.16.0.0/12 gateway=wg-vpn /ip/route/add dst-address=192.168.0.0/16 gateway=wg-vpn
Policy-based routing: отдельные устройства через VPN
Самый полезный сценарий — направить трафик определённых устройств (например, Smart TV или рабочий ПК) через VPN, а остальных — через обычный интернет.
Шаг 1: Создание routing table
[admin@MikroTik] >/routing/table/add name=via-vpn fib
Шаг 2: Маркировка трафика в mangle
[admin@MikroTik] ># Трафик от конкретного устройства (по IP) /ip/firewall/mangle/add chain=prerouting \ src-address=192.168.88.50 \ action=mark-routing new-routing-mark=via-vpn \ passthrough=yes \ comment="Smart TV via VPN" # Трафик от нескольких устройств (по address list) /ip/firewall/address-list/add list=vpn-devices address=192.168.88.50 \ comment="Smart TV" /ip/firewall/address-list/add list=vpn-devices address=192.168.88.51 \ comment="Work laptop" /ip/firewall/address-list/add list=vpn-devices address=192.168.88.52 \ comment="Gaming console" /ip/firewall/mangle/add chain=prerouting \ src-address-list=vpn-devices \ action=mark-routing new-routing-mark=via-vpn \ passthrough=yes \ comment="Devices via VPN"
Шаг 3: Маршрут в VPN routing table
[admin@MikroTik] >/ip/route/add dst-address=0.0.0.0/0 gateway=wg-vpn \ routing-table=via-vpn \ comment="Default route for VPN devices"
Шаг 4: NAT для VPN-трафика
[admin@MikroTik] >/ip/firewall/nat/add chain=srcnat \ routing-mark=via-vpn \ out-interface=wg-vpn \ action=masquerade \ comment="NAT for VPN devices"
Теперь устройства из address list vpn-devices ходят в интернет через WireGuard VPN, а все остальные — через обычного провайдера.
Шаг 5: Защита от утечек при падении VPN
Если VPN-туннель упадёт, трафик маркированных устройств может пойти через обычный шлюз. Чтобы заблокировать это:
[admin@MikroTik] ># Запрещаем маркированному трафику выходить не через VPN /ip/firewall/filter/add chain=forward \ routing-mark=via-vpn \ out-interface=!wg-vpn \ action=drop \ comment="Kill switch for VPN devices"
Это работает как Kill Switch — если VPN недоступен, трафик маркированных устройств блокируется, а не утекает через провайдера.
DNS через VPN (предотвращение DNS leak)
При полном туннелировании DNS-запросы должны идти через VPN, иначе провайдер увидит все посещаемые домены.
[admin@MikroTik] ># DNS-серверы VPN-провайдера /ip/dns/set servers=10.10.10.1 allow-remote-requests=yes # Или публичные DNS, но через VPN /ip/dns/set servers=1.1.1.1,8.8.8.8 # Перехват DNS-запросов (если клиенты используют свои DNS) /ip/firewall/nat/add chain=dstnat protocol=udp dst-port=53 \ src-address=192.168.88.0/24 dst-address=!10.10.10.1 \ action=redirect to-ports=53 \ comment="Redirect DNS to MikroTik"
Проверка
Проверка статуса VPN-подключения
[admin@MikroTik] ># WireGuard /interface/wireguard/print /interface/wireguard/peers/print detail # Поле last-handshake должно обновляться каждые ~2 минуты # L2TP /interface/l2tp-client/print /interface/l2tp-client/monitor l2tp-vpn once # OpenVPN /interface/ovpn-client/print /interface/ovpn-client/monitor ovpn-vpn once # SSTP /interface/sstp-client/print /interface/sstp-client/monitor sstp-vpn once # IPsec /ip/ipsec/active-peers/print /ip/ipsec/installed-sa/print
Проверка маршрутизации
[admin@MikroTik] ># Таблица маршрутов /ip/route/print where gateway~"wg-vpn\\|l2tp-vpn\\|ovpn-vpn\\|sstp-vpn" # Трассировка через VPN /tool/traceroute address=8.8.8.8 # Проверка, через какой интерфейс идёт трафик /ip/route/print where dst-address=0.0.0.0/0
Проверка policy-based routing
[admin@MikroTik] ># Проверяем, что mangle маркирует трафик /ip/firewall/mangle/print stats where comment~"VPN" # Проверяем маршруты в VPN routing table /ip/route/print where routing-table=via-vpn # Трассировка от имени конкретного устройства # (не работает напрямую, но можно проверить через:) /ip/firewall/mangle/print stats # Счётчик packets должен расти для маркирующих правил
Проверка скорости через VPN
[admin@MikroTik] ># Bandwidth test через VPN (если на другой стороне есть MikroTik) /tool/bandwidth-test address=10.10.10.1 protocol=tcp duration=10s # Или через iperf3 на сервере # На сервере: iperf3 -s # На MikroTik: /tool/fetch url="http://10.10.10.1:5201" (грубая оценка)
Проверка DNS leak
С устройства за MikroTik откройте в браузере https://dnsleaktest.com или https://ipleak.net — они покажут, какие DNS-серверы используются и совпадает ли IP с VPN.
Типичные ошибки
Ошибка: Double NAT (двойной NAT)
Симптомы: VPN-туннель устанавливается, но трафик не проходит. Ping через VPN не работает.
Причина: MikroTik делает NAT (masquerade) для выходящего трафика, и VPN-сервер тоже делает NAT. Двойной NAT ломает маршрутизацию.
Решение:
[admin@MikroTik] ># Исключаем VPN-трафик из masquerade /ip/firewall/nat/add chain=srcnat \ dst-address=172.16.0.0/12 \ out-interface=wg-vpn \ action=accept \ comment="No NAT for VPN split tunnel" \ place-before=0 # Или точнее — accept перед masquerade для VPN-интерфейса /ip/firewall/nat/print # Убедитесь, что accept-правило стоит ПЕРЕД masquerade
Для full tunnel проверьте настройки NAT на VPN-сервере — серверный NAT должен маскарадить трафик VPN-клиентов.
Ошибка: DNS leak (утечка DNS)
Симптомы: VPN работает, IP-адрес через VPN, но DNS-запросы идут через провайдера. На dnsleaktest.com видны DNS-серверы провайдера.
Причина: MikroTik использует DNS-серверы, полученные от провайдера по DHCP, а не через VPN.
Решение:
[admin@MikroTik] ># Устанавливаем DNS через VPN /ip/dns/set servers=10.10.10.1 # Отключаем получение DNS от провайдера /ip/dhcp-client/set [find] use-peer-dns=no # Перенаправляем все DNS-запросы клиентов на MikroTik /ip/firewall/nat/add chain=dstnat protocol=udp dst-port=53 \ src-address=192.168.88.0/24 action=redirect to-ports=53 \ comment="Force DNS through MikroTik" /ip/firewall/nat/add chain=dstnat protocol=tcp dst-port=53 \ src-address=192.168.88.0/24 action=redirect to-ports=53 \ comment="Force DNS through MikroTik"
Ошибка: MTU проблемы (страницы не открываются)
Симптомы: Ping работает, мелкие запросы проходят, но веб-страницы не загружаются или загружаются очень медленно. Большие файлы не скачиваются.
Причина: VPN-инкапсуляция уменьшает эффективный MTU. Крупные пакеты не помещаются и отбрасываются, если PMTUD (Path MTU Discovery) не работает.
Решение:
[admin@MikroTik] ># Уменьшаем MTU на VPN-интерфейсе /interface/wireguard/set wg-vpn mtu=1420 # Или для L2TP /interface/l2tp-client/set l2tp-vpn max-mtu=1400 max-mru=1400 # MSS Clamping (самый надёжный метод) /ip/firewall/mangle/add chain=forward protocol=tcp \ out-interface=wg-vpn tcp-flags=syn \ action=change-mss new-mss=clamp-to-pmtu \ comment="MSS clamp for VPN" /ip/firewall/mangle/add chain=forward protocol=tcp \ in-interface=wg-vpn tcp-flags=syn \ action=change-mss new-mss=clamp-to-pmtu \ comment="MSS clamp for VPN"
clamp-to-pmtu автоматически вычисляет оптимальный MSS на основе MTU интерфейса. Это самый универсальный вариант.
Проверка текущего MTU:
[admin@MikroTik] >/ping address=8.8.8.8 size=1472 do-not-fragment interface=wg-vpn # Если packet too large — уменьшайте size, пока ping не пройдёт # MTU = size + 28 (IP + ICMP headers)
Ошибка: VPN подключается, но трафик не идёт
Симптомы: Интерфейс VPN в состоянии running, но ping через него не работает.
Причина: Отсутствуют маршруты, firewall блокирует forward, или нет NAT.
Решение:
[admin@MikroTik] ># 1. Проверяем маршруты /ip/route/print where gateway~"vpn" # Должен быть хотя бы один маршрут через VPN-интерфейс # 2. Проверяем firewall forward /ip/firewall/filter/print where chain=forward # Должно быть разрешение для трафика через VPN # Добавляем, если нет /ip/firewall/filter/add chain=forward out-interface=wg-vpn action=accept \ comment="Allow forward to VPN" place-before=0 /ip/firewall/filter/add chain=forward in-interface=wg-vpn action=accept \ comment="Allow forward from VPN" place-before=0 # 3. Проверяем NAT /ip/firewall/nat/print where chain=srcnat # Должен быть masquerade для VPN-трафика, если удалённая сеть не знает # обратный маршрут в вашу LAN
Ошибка: WireGuard — нет handshake
Симптомы: WireGuard-интерфейс создан, peer добавлен, но last-handshake пуст или очень старый. Трафик не идёт.
Причина: Публичные ключи не совпадают, endpoint недоступен, или firewall блокирует UDP.
Решение:
[admin@MikroTik] ># Проверяем peer /interface/wireguard/peers/print detail where interface=wg-vpn # public-key должен совпадать с ключом сервера # endpoint-address и endpoint-port должны быть правильными # Проверяем доступность endpoint /ping address=198.51.100.1 count=4 # Проверяем, что UDP-порт не блокируется /tool/traceroute address=198.51.100.1 protocol=udp port=51820
На стороне сервера убедитесь, что:
- Публичный ключ MikroTik добавлен как peer
AllowedIPsвключает IP-адрес MikroTik- Firewall разрешает UDP на порту WireGuard
Ошибка: L2TP/IPsec — не подключается через NAT провайдера
Симптомы: L2TP-клиент показывает connecting... бесконечно или ошибку timeout.
Причина: L2TP использует протокол GRE (IP protocol 47), который не проходит через некоторые NAT. IPsec NAT-T (UDP 4500) тоже может блокироваться.
Решение:
[admin@MikroTik] ># Проверяем, что IPsec NAT-T работает /ip/ipsec/installed-sa/print # Если пуст — IPsec не устанавливается # Увеличиваем таймаут /interface/l2tp-client/set l2tp-vpn max-retries=10
Если провайдер блокирует протоколы IPsec, L2TP/IPsec через NAT может не работать. Рассмотрите альтернативы:
- SSTP — TCP 443, проходит через любой NAT
- WireGuard — UDP, обычно проходит через NAT
- OpenVPN — TCP 443, маскируется под HTTPS
Ошибка: Policy-based routing не работает
Симптомы: Правила mangle созданы, но трафик указанных устройств не идёт через VPN.
Причина: Неправильная цепочка (chain) в mangle, или маршрут в VPN routing table отсутствует.
Решение:
[admin@MikroTik] ># Mangle должен быть в chain=prerouting (НЕ forward, НЕ output) /ip/firewall/mangle/print where action=mark-routing # Проверяем, что routing table существует /routing/table/print # Проверяем маршрут в VPN routing table /ip/route/print where routing-table=via-vpn # Должен быть маршрут 0.0.0.0/0 через VPN-интерфейс # Проверяем счётчики mangle /ip/firewall/mangle/print stats # Если packets=0 — правило не срабатывает, проверьте src-address
Важно: Chain prerouting обрабатывает трафик до принятия решения о маршрутизации. Если использовать forward — маршрутизация уже произошла, и mark-routing не повлияет.
Автоматическое переподключение VPN
Для обеспечения постоянного подключения используйте Netwatch или скрипт:
[admin@MikroTik] ># Netwatch — мониторит IP через VPN и переподключает при падении /tool/netwatch/add host=10.10.10.1 interval=30s \ type=icmp timeout=3s \ down-script="/interface/wireguard/peers/disable [find where interface=wg-vpn]; :delay 5s; /interface/wireguard/peers/enable [find where interface=wg-vpn]" \ comment="WireGuard VPN health check"
Для L2TP/SSTP/OpenVPN переподключение обычно происходит автоматически — эти клиенты встроенно пытаются восстановить соединение.
MikroTik в роли VPN-клиента — мощное решение для подключения целой сети к удалённым ресурсам. Выбирайте протокол в зависимости от совместимости с сервером, используйте policy-based routing для гранулярного управления трафиком и всегда проверяйте DNS leak при полном туннелировании.
# Создаём интерфейс WireGuard /interface/wireguard/add name=wg-vpn listen-port=13231 # Смотрим публичный ключ MikroTik — передайте его администратору сервера /interface/wireguard/print where name=wg-vpn # Запишите значение public-key # Назначаем IP-адрес /ip/address/add address=10.10.10.2/32 interface=wg-vpn network=10.10.10.1 # Добавляем peer (VPN-сервер) /interface/wireguard/peers/add interface=wg-vpn \ public-key="SERVER_PUBLIC_KEY_HERE" \ endpoint-address=198.51.100.1 \ endpoint-port=51820 \ allowed-address=0.0.0.0/0 \ persistent-keepalive=25s # Маршрут по умолчанию через WireGuard (с меньшим distance) /ip/route/add dst-address=0.0.0.0/0 gateway=wg-vpn distance=1 \ comment="Default route via WireGuard VPN" # Статический маршрут к endpoint серверу через реальный шлюз # (иначе сам WireGuard-трафик тоже пойдёт в туннель — петля) /ip/route/add dst-address=198.51.100.1/32 gateway=192.168.1.1 \ comment="WireGuard endpoint via ISP" /ip/route/add dst-address=0.0.0.0/1 gateway=wg-vpn comment="VPN half 1" /ip/route/add dst-address=128.0.0.0/1 gateway=wg-vpn comment="VPN half 2" # Только трафик в корпоративную сеть — через VPN /ip/route/add dst-address=192.168.0.0/16 gateway=wg-vpn \ comment="Corporate networks via VPN" /ip/route/add dst-address=10.0.0.0/8 gateway=wg-vpn \ comment="Corporate networks via VPN" # Создаём L2TP-клиент /interface/l2tp-client/add name=l2tp-vpn \ connect-to=203.0.113.50 \ user="mikrotik-branch" \ password="L2tpPass123!" \ use-ipsec=yes \ ipsec-secret="SharedIPsecKey!" \ allow-fast-path=yes \ add-default-route=no \ disabled=no /interface/l2tp-client/print # status должен быть connected /interface/l2tp-client/monitor l2tp-vpn once # Покажет: uptime, encoding, local-address, remote-address # Split tunnel — только корпоративная сеть /ip/route/add dst-address=172.16.0.0/12 gateway=l2tp-vpn \ comment="Corporate via L2TP" /certificate/import file-name=ca.crt passphrase="" /certificate/import file-name=client.crt passphrase="" /certificate/import file-name=client.key passphrase="" # Переименуем для удобства /certificate/set [find where common-name~"CA"] name=ovpn-ca /certificate/set [find where common-name~"client"] name=ovpn-client /interface/ovpn-client/add name=ovpn-vpn \ connect-to=203.0.113.60 \ port=1194 \ mode=ip \ protocol=tcp \ certificate=ovpn-client \ verify-server-certificate=yes \ cipher=aes256-gcm \ auth=sha256 \ user="mikrotik" \ password="OvpnPass123!" \ add-default-route=no \ disabled=no /interface/ovpn-client/print /interface/ovpn-client/monitor ovpn-vpn once /interface/sstp-client/add name=sstp-vpn \ connect-to=203.0.113.70:443 \ user="mikrotik-sstp" \ password="SstpPass123!" \ certificate=none \ verify-server-certificate=no \ verify-server-address-from-certificate=no \ pfs=yes \ add-default-route=no \ disabled=no /interface/sstp-client/set sstp-vpn \ verify-server-certificate=yes \ verify-server-address-from-certificate=yes /interface/sstp-client/print /interface/sstp-client/monitor sstp-vpn once # Profile (Phase 1) /ip/ipsec/profile/add name=ikev2-client-profile \ hash-algorithm=sha256 \ enc-algorithm=aes-256 \ dh-group=modp2048 \ nat-traversal=yes \ dpd-interval=30s # Proposal (Phase 2) /ip/ipsec/proposal/add name=ikev2-client-proposal \ auth-algorithms=sha256 \ enc-algorithms=aes-256-cbc \ pfs-group=modp2048 # Peer (VPN-сервер) /ip/ipsec/peer/add name=hq-vpn \ address=203.0.113.80 \ exchange-mode=ike2 \ profile=ikev2-client-profile \ send-initial-contact=yes # Identity (аутентификация) /ip/ipsec/identity/add peer=hq-vpn \ auth-method=pre-shared-key \ secret="VeryStr0ngPSK!Key" # Policy (какой трафик шифровать) /ip/ipsec/policy/add peer=hq-vpn \ src-address=192.168.88.0/24 \ dst-address=172.16.0.0/16 \ tunnel=yes \ sa-src-address=203.0.113.1 \ sa-dst-address=203.0.113.80 \ proposal=ikev2-client-proposal \ action=encrypt /ip/ipsec/mode-config/add name=request-only \ responder=no /ip/ipsec/identity/set [find where peer=hq-vpn] \ mode-config=request-only \ generate-policy=port-strict # Вариант 1: add-default-route в настройках клиента /interface/l2tp-client/set l2tp-vpn add-default-route=yes # Вариант 2: ручной маршрут с меньшей дистанцией /ip/route/add dst-address=0.0.0.0/0 gateway=l2tp-vpn distance=1 # Вариант 3: два маршрута /1 (не конфликтуют с дефолтным) /ip/route/add dst-address=0.0.0.0/1 gateway=wg-vpn /ip/route/add dst-address=128.0.0.0/1 gateway=wg-vpn /ip/route/add dst-address=198.51.100.1/32 gateway=192.168.1.1 \ comment="VPN server endpoint via ISP" # Корпоративные сети через VPN /ip/route/add dst-address=172.16.0.0/12 gateway=wg-vpn /ip/route/add dst-address=192.168.0.0/16 gateway=wg-vpn /routing/table/add name=via-vpn fib # Трафик от конкретного устройства (по IP) /ip/firewall/mangle/add chain=prerouting \ src-address=192.168.88.50 \ action=mark-routing new-routing-mark=via-vpn \ passthrough=yes \ comment="Smart TV via VPN" # Трафик от нескольких устройств (по address list) /ip/firewall/address-list/add list=vpn-devices address=192.168.88.50 \ comment="Smart TV" /ip/firewall/address-list/add list=vpn-devices address=192.168.88.51 \ comment="Work laptop" /ip/firewall/address-list/add list=vpn-devices address=192.168.88.52 \ comment="Gaming console" /ip/firewall/mangle/add chain=prerouting \ src-address-list=vpn-devices \ action=mark-routing new-routing-mark=via-vpn \ passthrough=yes \ comment="Devices via VPN" /ip/route/add dst-address=0.0.0.0/0 gateway=wg-vpn \ routing-table=via-vpn \ comment="Default route for VPN devices" /ip/firewall/nat/add chain=srcnat \ routing-mark=via-vpn \ out-interface=wg-vpn \ action=masquerade \ comment="NAT for VPN devices" # Запрещаем маркированному трафику выходить не через VPN /ip/firewall/filter/add chain=forward \ routing-mark=via-vpn \ out-interface=!wg-vpn \ action=drop \ comment="Kill switch for VPN devices" # DNS-серверы VPN-провайдера /ip/dns/set servers=10.10.10.1 allow-remote-requests=yes # Или публичные DNS, но через VPN /ip/dns/set servers=1.1.1.1,8.8.8.8 # Перехват DNS-запросов (если клиенты используют свои DNS) /ip/firewall/nat/add chain=dstnat protocol=udp dst-port=53 \ src-address=192.168.88.0/24 dst-address=!10.10.10.1 \ action=redirect to-ports=53 \ comment="Redirect DNS to MikroTik" # WireGuard /interface/wireguard/print /interface/wireguard/peers/print detail # Поле last-handshake должно обновляться каждые ~2 минуты # L2TP /interface/l2tp-client/print /interface/l2tp-client/monitor l2tp-vpn once # OpenVPN /interface/ovpn-client/print /interface/ovpn-client/monitor ovpn-vpn once # SSTP /interface/sstp-client/print /interface/sstp-client/monitor sstp-vpn once # IPsec /ip/ipsec/active-peers/print /ip/ipsec/installed-sa/print # Таблица маршрутов /ip/route/print where gateway~"wg-vpn\\|l2tp-vpn\\|ovpn-vpn\\|sstp-vpn" # Трассировка через VPN /tool/traceroute address=8.8.8.8 # Проверка, через какой интерфейс идёт трафик /ip/route/print where dst-address=0.0.0.0/0 # Проверяем, что mangle маркирует трафик /ip/firewall/mangle/print stats where comment~"VPN" # Проверяем маршруты в VPN routing table /ip/route/print where routing-table=via-vpn # Трассировка от имени конкретного устройства # (не работает напрямую, но можно проверить через:) /ip/firewall/mangle/print stats # Счётчик packets должен расти для маркирующих правил # Bandwidth test через VPN (если на другой стороне есть MikroTik) /tool/bandwidth-test address=10.10.10.1 protocol=tcp duration=10s # Или через iperf3 на сервере # На сервере: iperf3 -s # На MikroTik: /tool/fetch url="http://10.10.10.1:5201" (грубая оценка) # Исключаем VPN-трафик из masquerade /ip/firewall/nat/add chain=srcnat \ dst-address=172.16.0.0/12 \ out-interface=wg-vpn \ action=accept \ comment="No NAT for VPN split tunnel" \ place-before=0 # Или точнее — accept перед masquerade для VPN-интерфейса /ip/firewall/nat/print # Убедитесь, что accept-правило стоит ПЕРЕД masquerade # Устанавливаем DNS через VPN /ip/dns/set servers=10.10.10.1 # Отключаем получение DNS от провайдера /ip/dhcp-client/set [find] use-peer-dns=no # Перенаправляем все DNS-запросы клиентов на MikroTik /ip/firewall/nat/add chain=dstnat protocol=udp dst-port=53 \ src-address=192.168.88.0/24 action=redirect to-ports=53 \ comment="Force DNS through MikroTik" /ip/firewall/nat/add chain=dstnat protocol=tcp dst-port=53 \ src-address=192.168.88.0/24 action=redirect to-ports=53 \ comment="Force DNS through MikroTik" # Уменьшаем MTU на VPN-интерфейсе /interface/wireguard/set wg-vpn mtu=1420 # Или для L2TP /interface/l2tp-client/set l2tp-vpn max-mtu=1400 max-mru=1400 # MSS Clamping (самый надёжный метод) /ip/firewall/mangle/add chain=forward protocol=tcp \ out-interface=wg-vpn tcp-flags=syn \ action=change-mss new-mss=clamp-to-pmtu \ comment="MSS clamp for VPN" /ip/firewall/mangle/add chain=forward protocol=tcp \ in-interface=wg-vpn tcp-flags=syn \ action=change-mss new-mss=clamp-to-pmtu \ comment="MSS clamp for VPN" /ping address=8.8.8.8 size=1472 do-not-fragment interface=wg-vpn # Если packet too large — уменьшайте size, пока ping не пройдёт # MTU = size + 28 (IP + ICMP headers) # 1. Проверяем маршруты /ip/route/print where gateway~"vpn" # Должен быть хотя бы один маршрут через VPN-интерфейс # 2. Проверяем firewall forward /ip/firewall/filter/print where chain=forward # Должно быть разрешение для трафика через VPN # Добавляем, если нет /ip/firewall/filter/add chain=forward out-interface=wg-vpn action=accept \ comment="Allow forward to VPN" place-before=0 /ip/firewall/filter/add chain=forward in-interface=wg-vpn action=accept \ comment="Allow forward from VPN" place-before=0 # 3. Проверяем NAT /ip/firewall/nat/print where chain=srcnat # Должен быть masquerade для VPN-трафика, если удалённая сеть не знает # обратный маршрут в вашу LAN # Проверяем peer /interface/wireguard/peers/print detail where interface=wg-vpn # public-key должен совпадать с ключом сервера # endpoint-address и endpoint-port должны быть правильными # Проверяем доступность endpoint /ping address=198.51.100.1 count=4 # Проверяем, что UDP-порт не блокируется /tool/traceroute address=198.51.100.1 protocol=udp port=51820 # Проверяем, что IPsec NAT-T работает /ip/ipsec/installed-sa/print # Если пуст — IPsec не устанавливается # Увеличиваем таймаут /interface/l2tp-client/set l2tp-vpn max-retries=10 # Mangle должен быть в chain=prerouting (НЕ forward, НЕ output) /ip/firewall/mangle/print where action=mark-routing # Проверяем, что routing table существует /routing/table/print # Проверяем маршрут в VPN routing table /ip/route/print where routing-table=via-vpn # Должен быть маршрут 0.0.0.0/0 через VPN-интерфейс # Проверяем счётчики mangle /ip/firewall/mangle/print stats # Если packets=0 — правило не срабатывает, проверьте src-address # Netwatch — мониторит IP через VPN и переподключает при падении /tool/netwatch/add host=10.10.10.1 interval=30s \ type=icmp timeout=3s \ down-script="/interface/wireguard/peers/disable [find where interface=wg-vpn]; :delay 5s; /interface/wireguard/peers/enable [find where interface=wg-vpn]" \ comment="WireGuard VPN health check"