Статические маршруты на MikroTik — routing table и scope
Статические маршруты — основа маршрутизации на MikroTik. Даже если в сети используются динамические протоколы (OSPF, BGP), понимание статических маршрутов, таблиц маршрутизации, scope и target-scope необходимо для корректной работы recursive routing, failover и policy-based routing. В RouterOS 7 синтаксис маршрутов изменился, появилась поддержка VRF и расширенные возможности routing tables. В этом руководстве — от базовых маршрутов до продвинутых сценариев с рекурсией и PBR.
Описание
Типы маршрутов в RouterOS
RouterOS различает несколько типов маршрутов по их происхождению:
| Тип | Описание | Пример |
|---|---|---|
| Connected | Автоматически создаются при назначении IP на интерфейс | 192.168.88.0/24 на bridge-LAN |
| Static | Вручную добавленные администратором | Default route 0.0.0.0/0 |
| Dynamic | Созданные протоколами маршрутизации (OSPF, BGP, RIP) или DHCP | Маршруты, полученные от ISP по DHCP |
| Blackhole | Трафик отбрасывается без ICMP-ответа | Анкер для BGP-анонсов |
| Unreachable | Трафик отбрасывается с ICMP Destination Unreachable | Явный запрет доступа к подсети |
| Prohibit | Трафик отбрасывается с ICMP Administratively Prohibited | Административный запрет |
Distance (метрика предпочтения)
Distance определяет приоритет маршрута при наличии нескольких маршрутов к одной подсети. Чем меньше distance, тем предпочтительнее маршрут:
| Источник маршрута | Distance по умолчанию |
|---|---|
| Connected | 0 |
| Static | 1 |
| eBGP | 20 |
| OSPF | 110 |
| RIP | 120 |
| iBGP | 200 |
Если два static-маршрута ведут к одной подсети с разным distance, активен будет маршрут с меньшим distance. Маршрут с большим distance станет активным только при недоступности первого — это основа для failover.
Gateway types
Статический маршрут может указывать на:
- IP-адрес — следующий hop (next-hop). Самый распространённый вариант.
- Интерфейс — трафик отправляется через указанный интерфейс. Используется для point-to-point линков (PPPoE, VPN).
- IP + интерфейс — явное указание и next-hop, и выходного интерфейса. Полезно при наличии нескольких маршрутов к одному next-hop.
Настройка
Базовые статические маршруты
Default route (маршрут по умолчанию):
[admin@MikroTik] >/ip/route add dst-address=0.0.0.0/0 gateway=192.168.1.1 comment="Default route via ISP"
Это самый важный маршрут — он направляет весь трафик, для которого нет более специфичного маршрута, на gateway ISP.
Маршрут к удалённой подсети:
[admin@MikroTik] >/ip/route add dst-address=10.20.30.0/24 gateway=192.168.88.254 comment="Branch office via VPN router"
Маршрут через интерфейс (point-to-point):
[admin@MikroTik] >/ip/route add dst-address=0.0.0.0/0 gateway=pppoe-out1 comment="Default via PPPoE"
Для PPPoE-соединений gateway указывается как имя интерфейса, потому что IP-адрес gateway может меняться при переподключении.
Distance и failover
Классический сценарий: два ISP, основной и резервный. Основной канал — ISP A (ether1), резервный — ISP B (ether2):
[admin@MikroTik] ># Основной маршрут — distance 1 (приоритетный) /ip/route add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 comment="ISP A - primary" # Резервный маршрут — distance 2 (активируется при недоступности ISP A) /ip/route add dst-address=0.0.0.0/0 gateway=10.0.0.1 distance=2 comment="ISP B - backup"
При такой настройке маршрут через ISP B станет active только если маршрут через ISP A будет удалён из таблицы (например, при падении интерфейса ether1).
Проблема: если интерфейс ether1 остаётся up, но ISP A перестал маршрутизировать трафик (проблема на стороне провайдера), failover не сработает. Для решения используется check-gateway.
Check-Gateway — проверка доступности gateway
[admin@MikroTik] >/ip/route add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 \ check-gateway=ping comment="ISP A - primary with health check" /ip/route add dst-address=0.0.0.0/0 gateway=10.0.0.1 distance=2 \ check-gateway=ping comment="ISP B - backup with health check"
Параметр check-gateway=ping заставляет RouterOS периодически пинговать gateway. Если gateway не отвечает на ping в течение 10 секунд (два неудачных пинга подряд с интервалом 5 секунд), маршрут помечается как unreachable и деактивируется.
Опции check-gateway:
ping— ICMP echo request к gateway IParp— ARP-запрос к gateway (работает только для directly connected)bfd— Bidirectional Forwarding Detection (быстрый, < 1 секунды)
Рекомендация: для failover между двумя ISP используйте check-gateway=ping. Для подробного сценария dual-WAN failover с netwatch и маршрутизацией по источнику смотрите статью о failover с двумя провайдерами.
Recursive Routing — scope и target-scope
Recursive routing — продвинутая техника, при которой маршрут ссылается на next-hop, доступный не напрямую, а через другой маршрут. Это основа для надёжного failover через мониторинг удалённого хоста (а не только gateway ISP).
Проблема: check-gateway=ping проверяет только ближайший gateway. Если gateway отвечает, но интернет за ним недоступен — failover не сработает.
Решение: recursive route через удалённый хост:
[admin@MikroTik] ># Шаг 1: маршруты к «проверочным» хостам через каждого ISP /ip/route add dst-address=8.8.8.8/32 gateway=192.168.1.1 scope=10 target-scope=10 \ comment="Google DNS via ISP A (probe)" /ip/route add dst-address=1.1.1.1/32 gateway=10.0.0.1 scope=10 target-scope=10 \ comment="Cloudflare DNS via ISP B (probe)" # Шаг 2: recursive default routes через эти хосты /ip/route add dst-address=0.0.0.0/0 gateway=8.8.8.8 distance=1 \ check-gateway=ping target-scope=11 \ comment="Default via ISP A (recursive, check 8.8.8.8)" /ip/route add dst-address=0.0.0.0/0 gateway=1.1.1.1 distance=2 \ check-gateway=ping target-scope=11 \ comment="Default via ISP B (recursive, check 1.1.1.1)"
Как это работает:
- Маршрут 0.0.0.0/0 с gateway=8.8.8.8 — рекурсивный. RouterOS ищет маршрут к 8.8.8.8.
- Маршрут к 8.8.8.8 найден через 192.168.1.1 (ISP A). Рекурсия разрешена.
check-gateway=pingпингует 8.8.8.8 (а не 192.168.1.1). Если 8.8.8.8 недоступен через ISP A — маршрут деактивируется.- Активируется резервный маршрут через 1.1.1.1 (ISP B).
Scope и Target-Scope — ключевые параметры:
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
scope | «Видимость» маршрута для рекурсии. Определяет, кто может ссылаться на этот маршрут | 30 (static), 10 (connected) |
target-scope | Максимальное значение scope маршрута, через который разрешена рекурсия | 10 |
Правило: рекурсивный маршрут (gateway = remote IP) разрешается через промежуточный маршрут, только если target-scope рекурсивного маршрута >= scope промежуточного маршрута.
В нашем примере:
- Маршрут к 8.8.8.8 имеет
scope=10— его видят маршруты сtarget-scope >= 10 - Default route имеет
target-scope=11— он «видит» маршрут к 8.8.8.8 (11 >= 10) - Маршрут к 8.8.8.8 имеет
target-scope=10— он разрешается через connected-маршруты (scope=10)
Если scope/target-scope настроены неправильно, рекурсия не разрешится и маршрут будет неактивным.
Routing Tables и Policy-Based Routing (PBR)
По умолчанию все маршруты находятся в таблице main. RouterOS 7 позволяет создавать дополнительные таблицы маршрутизации для PBR — маршрутизации на основе источника, порта или других критериев.
Шаг 1: Создание routing table:
[admin@MikroTik] >/routing/table add name=to-isp-b fib comment="Routing table for traffic via ISP B"
Параметр fib указывает, что таблица будет использоваться для реальной пересылки пакетов (Forwarding Information Base), а не только для хранения маршрутов.
Шаг 2: Добавление маршрута в таблицу:
[admin@MikroTik] >/ip/route add dst-address=0.0.0.0/0 gateway=10.0.0.1 routing-table=to-isp-b \ comment="Default via ISP B in separate table"
Шаг 3: Маркировка трафика через mangle:
[admin@MikroTik] ># Весь трафик из подсети 192.168.88.0/24 — через ISP B /ip/firewall/mangle add \ chain=prerouting \ src-address=192.168.88.0/24 \ action=mark-routing \ new-routing-mark=to-isp-b \ passthrough=yes \ comment="Route 192.168.88.0/24 via ISP B"
Шаг 4: NAT для трафика через ISP B:
[admin@MikroTik] >/ip/firewall/nat add \ chain=srcnat \ routing-mark=to-isp-b \ out-interface=ether2 \ action=masquerade \ comment="NAT for ISP B traffic"
Типичные сценарии PBR:
- Разные подсети через разных ISP
- VoIP-трафик через провайдера с лучшей latency
- Трафик к определённым серверам через VPN
- Разделение бизнес-трафика и гостевого Wi-Fi по разным каналам
Blackhole и Unreachable маршруты
Blackhole — молча отбрасывает пакеты. Используется для:
- Анкерных маршрутов в BGP (см. статью о BGP)
- Защиты от routing loops
- Блокировки трафика без нагрузки на firewall
[admin@MikroTik] >/ip/route add dst-address=203.0.113.0/24 type=blackhole comment="BGP anchor"
Unreachable — отбрасывает с ICMP Destination Unreachable:
[admin@MikroTik] >/ip/route add dst-address=10.99.0.0/16 type=unreachable comment="Non-existent network"
Prohibit — отбрасывает с ICMP Administratively Prohibited:
[admin@MikroTik] >/ip/route add dst-address=192.168.200.0/24 type=prohibit comment="Blocked network"
Разница между blackhole, unreachable и prohibit:
blackhole— пакет тихо отбрасывается. Отправитель ничего не узнает (timeout).unreachable— отправитель получит ICMP «Destination Unreachable» (host unreachable).prohibit— отправитель получит ICMP «Administratively Prohibited» (communication administratively filtered).
VRF (Virtual Routing and Forwarding)
VRF позволяет создать полностью изолированные таблицы маршрутизации с отдельными интерфейсами. В отличие от routing tables (PBR), VRF изолирует интерфейсы на уровне L3 — одинаковые IP-подсети могут существовать в разных VRF без конфликтов.
[admin@MikroTik] ># Создание VRF /ip/vrf add name=vrf-guest interfaces=ether5 comment="Guest network VRF" # Маршруты внутри VRF /ip/route add dst-address=0.0.0.0/0 gateway=10.10.10.1 vrf=vrf-guest # IP-адрес на интерфейсе в VRF /ip/address add address=10.10.10.254/24 interface=ether5
VRF полезен для:
- Полной изоляции гостевой сети от корпоративной
- Multi-tenant сценариев (несколько клиентов на одном маршрутизаторе)
- Пересечение IP-адресации (два клиента с 192.168.1.0/24)
Ограничение: VRF в RouterOS имеет ограниченную функциональность по сравнению с Cisco/Juniper. Не все сервисы (DNS, SNMP) корректно работают в контексте VRF.
Проверка
Просмотр таблицы маршрутизации
[admin@MikroTik] >/ip/route/print
Для детального вывода с атрибутами:
[admin@MikroTik] >/ip/route/print detail where static
Фильтр по типу маршрута:
[admin@MikroTik] ># Только connected маршруты /ip/route/print where connect # Только static маршруты /ip/route/print where static # Только dynamic (OSPF, BGP, DHCP) /ip/route/print where dynamic # Только active маршруты /ip/route/print where active
Проверка рекурсивного маршрута
[admin@MikroTik] >/ip/route/print detail where dst-address=0.0.0.0/0
В выводе обратите внимание на поле gateway-status. Для рекурсивного маршрута оно покажет цепочку разрешения:
codegateway=8.8.8.8 gateway-status=8.8.8.8 recursive via 192.168.1.1
Если рекурсия не разрешилась:
codegateway=8.8.8.8 gateway-status=8.8.8.8 unreachable
Это значит scope/target-scope настроены неправильно.
Проверка маршрута к конкретному адресу
[admin@MikroTik] >/ip/route/check 8.8.8.8
Команда покажет, какой именно маршрут будет использован для доставки пакета к указанному IP:
codedst-address: 0.0.0.0/0 gateway: 192.168.1.1 interface: ether1
Traceroute для проверки пути
[admin@MikroTik] >/tool/traceroute address=8.8.8.8 count=1
Проверка routing tables (PBR)
[admin@MikroTik] >/routing/table/print /ip/route/print where routing-table=to-isp-b
Мониторинг состояния gateway
[admin@MikroTik] >/ip/route/print where gateway-status~"unreachable"
Эта команда покажет все маршруты с недоступным gateway — полезно для быстрой диагностики.
Типичные ошибки
1. Маршрут не активен (inactive)
Симптом: маршрут добавлен, виден в print, но не помечен как active.
Причины:
- Gateway недоступен (нет ARP-записи, интерфейс down)
- Существует более специфичный или более приоритетный маршрут (меньший distance)
- Для рекурсивного маршрута — не разрешена рекурсия (scope/target-scope)
Диагностика:
[admin@MikroTik] >/ip/route/print detail where dst-address=0.0.0.0/0
Проверьте gateway-status — там будет указана причина неактивности.
2. Неправильный scope/target-scope в recursive routing
Симптом: рекурсивный маршрут (gateway = удалённый IP) не активен, gateway-status показывает «unreachable».
Причина: target-scope рекурсивного маршрута меньше, чем scope промежуточного маршрута.
Решение: убедитесь что цепочка scope корректна:
[admin@MikroTik] ># Промежуточный маршрут к probe-хосту /ip/route add dst-address=8.8.8.8/32 gateway=192.168.1.1 scope=10 target-scope=10 # Рекурсивный default route — target-scope должен быть >= scope промежуточного /ip/route add dst-address=0.0.0.0/0 gateway=8.8.8.8 target-scope=11
Если scope промежуточного маршрута = 10, а target-scope рекурсивного = 10 — рекурсия разрешится (10 >= 10). Если target-scope = 9 — не разрешится (9 < 10).
3. Check-gateway не срабатывает
Симптом: gateway ISP не пингуется, но маршрут остаётся active.
Причина: check-gateway не указан (по умолчанию — none).
Решение:
[admin@MikroTik] >/ip/route set [find dst-address=0.0.0.0/0 gateway=192.168.1.1] check-gateway=ping
Также убедитесь, что gateway действительно отвечает на ICMP. Некоторые ISP-роутеры не отвечают на ping — в этом случае check-gateway не поможет, используйте recursive routing с проверкой удалённого хоста.
4. Routing loop при PBR
Симптом: пакеты с routing-mark не доходят до назначения, traceroute показывает петлю.
Причина: в таблице to-isp-b нет маршрута к dst-address, или NAT не настроен для этого routing-mark.
Решение: в каждой дополнительной routing table должен быть как минимум default route:
[admin@MikroTik] >/ip/route/print where routing-table=to-isp-b
Если таблица пуста — добавьте default route:
[admin@MikroTik] >/ip/route add dst-address=0.0.0.0/0 gateway=10.0.0.1 routing-table=to-isp-b
Также проверьте NAT — без masquerade/srcnat для трафика с routing-mark ответные пакеты не вернутся.
5. Connected-маршрут пропал
Симптом: подсеть, назначенная на интерфейс, недоступна. Connected-маршрут отсутствует в таблице.
Причина: интерфейс disabled или link down. Connected-маршруты существуют только при активном интерфейсе с назначенным IP.
Решение:
[admin@MikroTik] >/interface/print where name=bridge-LAN /ip/address/print where interface=bridge-LAN
Убедитесь, что интерфейс running=yes и IP-адрес назначен корректно.
6. ECMP вместо failover
Симптом: трафик распределяется между двумя ISP одновременно, вместо использования одного основного.
Причина: оба маршрута имеют одинаковый distance. RouterOS автоматически включает ECMP (Equal-Cost Multi-Path) для маршрутов с одинаковым distance к одной подсети.
Решение: если нужен failover, а не балансировка — задайте разный distance:
[admin@MikroTik] >/ip/route set [find gateway=192.168.1.1 dst-address=0.0.0.0/0] distance=1 /ip/route set [find gateway=10.0.0.1 dst-address=0.0.0.0/0] distance=2
Если нужен именно ECMP (балансировка между ISP) — оставьте одинаковый distance, но настройте корректный NAT для обоих выходных интерфейсов.
7. Маршруты от DHCP-клиента конфликтуют со статическими
Симптом: после получения IP по DHCP на WAN-интерфейсе появляется dynamic default route, который конкурирует со статическими маршрутами.
Причина: DHCP-клиент добавляет default route с distance=1, как и ваш статический маршрут.
Решение: изменить distance маршрута, добавляемого DHCP-клиентом:
[admin@MikroTik] >/ip/dhcp-client set [find interface=ether1] default-route-distance=5
Или отключить добавление default route от DHCP:
[admin@MikroTik] >/ip/dhcp-client set [find interface=ether1] add-default-route=no
И добавить собственный статический маршрут с нужными параметрами (check-gateway, distance).
Рекомендации
- Всегда указывайте
commentдля статических маршрутов — через полгода вы не вспомните, зачем добавляли маршрут к 10.99.0.0/16 - Используйте
check-gateway=pingдля всех default routes через ISP - Для надёжного failover применяйте recursive routing с проверкой удалённого хоста (8.8.8.8, 1.1.1.1), а не только ближайшего gateway
- Не создавайте routing tables без необходимости — каждая дополнительная таблица усложняет диагностику
- Для просмотра маршрута к конкретному адресу используйте
/ip/route/check— это быстрее, чем разбирать всю таблицу вручную - Перед изменением маршрутов на production-роутере — сделайте backup и имейте доступ через альтернативный канал (например, LTE или console cable)
/ip/route add dst-address=0.0.0.0/0 gateway=192.168.1.1 comment="Default route via ISP"
/ip/route add dst-address=10.20.30.0/24 gateway=192.168.88.254 comment="Branch office via VPN router"
/ip/route add dst-address=0.0.0.0/0 gateway=pppoe-out1 comment="Default via PPPoE"
# Основной маршрут — distance 1 (приоритетный)
/ip/route add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 comment="ISP A - primary"
# Резервный маршрут — distance 2 (активируется при недоступности ISP A)
/ip/route add dst-address=0.0.0.0/0 gateway=10.0.0.1 distance=2 comment="ISP B - backup"
/ip/route add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 \
check-gateway=ping comment="ISP A - primary with health check"
/ip/route add dst-address=0.0.0.0/0 gateway=10.0.0.1 distance=2 \
check-gateway=ping comment="ISP B - backup with health check"
# Шаг 1: маршруты к «проверочным» хостам через каждого ISP
/ip/route add dst-address=8.8.8.8/32 gateway=192.168.1.1 scope=10 target-scope=10 \
comment="Google DNS via ISP A (probe)"
/ip/route add dst-address=1.1.1.1/32 gateway=10.0.0.1 scope=10 target-scope=10 \
comment="Cloudflare DNS via ISP B (probe)"
# Шаг 2: recursive default routes через эти хосты
/ip/route add dst-address=0.0.0.0/0 gateway=8.8.8.8 distance=1 \
check-gateway=ping target-scope=11 \
comment="Default via ISP A (recursive, check 8.8.8.8)"
/ip/route add dst-address=0.0.0.0/0 gateway=1.1.1.1 distance=2 \
check-gateway=ping target-scope=11 \
comment="Default via ISP B (recursive, check 1.1.1.1)"
/routing/table add name=to-isp-b fib comment="Routing table for traffic via ISP B"
/ip/route add dst-address=0.0.0.0/0 gateway=10.0.0.1 routing-table=to-isp-b \
comment="Default via ISP B in separate table"
# Весь трафик из подсети 192.168.88.0/24 — через ISP B
/ip/firewall/mangle add \
chain=prerouting \
src-address=192.168.88.0/24 \
action=mark-routing \
new-routing-mark=to-isp-b \
passthrough=yes \
comment="Route 192.168.88.0/24 via ISP B"
/ip/firewall/nat add \
chain=srcnat \
routing-mark=to-isp-b \
out-interface=ether2 \
action=masquerade \
comment="NAT for ISP B traffic"
/ip/route add dst-address=203.0.113.0/24 type=blackhole comment="BGP anchor"
/ip/route add dst-address=10.99.0.0/16 type=unreachable comment="Non-existent network"
/ip/route add dst-address=192.168.200.0/24 type=prohibit comment="Blocked network"
# Создание VRF
/ip/vrf add name=vrf-guest interfaces=ether5 comment="Guest network VRF"
# Маршруты внутри VRF
/ip/route add dst-address=0.0.0.0/0 gateway=10.10.10.1 vrf=vrf-guest
# IP-адрес на интерфейсе в VRF
/ip/address add address=10.10.10.254/24 interface=ether5
/ip/route/print
/ip/route/print detail where static
# Только connected маршруты
/ip/route/print where connect
# Только static маршруты
/ip/route/print where static
# Только dynamic (OSPF, BGP, DHCP)
/ip/route/print where dynamic
# Только active маршруты
/ip/route/print where active
/ip/route/print detail where dst-address=0.0.0.0/0
gateway=8.8.8.8 gateway-status=8.8.8.8 recursive via 192.168.1.1
gateway=8.8.8.8 gateway-status=8.8.8.8 unreachable
/ip/route/check 8.8.8.8
dst-address: 0.0.0.0/0
gateway: 192.168.1.1
interface: ether1
/tool/traceroute address=8.8.8.8 count=1
/routing/table/print
/ip/route/print where routing-table=to-isp-b
/ip/route/print where gateway-status~"unreachable"
/ip/route/print detail where dst-address=0.0.0.0/0
# Промежуточный маршрут к probe-хосту
/ip/route add dst-address=8.8.8.8/32 gateway=192.168.1.1 scope=10 target-scope=10
# Рекурсивный default route — target-scope должен быть >= scope промежуточного
/ip/route add dst-address=0.0.0.0/0 gateway=8.8.8.8 target-scope=11
/ip/route set [find dst-address=0.0.0.0/0 gateway=192.168.1.1] check-gateway=ping
/ip/route/print where routing-table=to-isp-b
/ip/route add dst-address=0.0.0.0/0 gateway=10.0.0.1 routing-table=to-isp-b
/interface/print where name=bridge-LAN
/ip/address/print where interface=bridge-LAN
/ip/route set [find gateway=192.168.1.1 dst-address=0.0.0.0/0] distance=1
/ip/route set [find gateway=10.0.0.1 dst-address=0.0.0.0/0] distance=2
/ip/dhcp-client set [find interface=ether1] default-route-distance=5
/ip/dhcp-client set [find interface=ether1] add-default-route=no