VRF на MikroTik — виртуальные таблицы маршрутизации
VRF (Virtual Routing and Forwarding) — технология, позволяющая создать несколько изолированных таблиц маршрутизации на одном маршрутизаторе. Каждая VRF-таблица функционирует как отдельный виртуальный роутер: IP-адреса, маршруты и интерфейсы в разных VRF не пересекаются. Это базовая технология для провайдеров, дата-центров и организаций, обслуживающих несколько клиентов с пересекающимися адресными пространствами. В RouterOS 7 VRF полностью переработан: используется /ip/vrf и /routing/table вместо устаревших конструкций из RouterOS 6.
Описание
Зачем нужен VRF
Представьте ситуацию: вы — провайдер или MSP (Managed Service Provider), обслуживающий трёх клиентов. Все три клиента используют подсеть 192.168.1.0/24 для своих локальных сетей. Без VRF это невозможно — маршрутизатор не может иметь три маршрута к 192.168.1.0/24 с разными next-hop в одной таблице маршрутизации.
С VRF каждый клиент получает собственную таблицу маршрутизации. Маршруты в таблице клиента A не видны клиенту B, и наоборот.
Типичные сценарии использования:
| Сценарий | Описание |
|---|---|
| ISP multi-tenant | Несколько клиентов с пересекающимися подсетями |
| Изоляция сегментов | Разделение production и management сетей |
| MPLS L3VPN | VRF как endpoint для MP-BGP VPNv4 |
| Безопасность | Полная изоляция трафика без физического разделения |
| Тестирование | Изолированная среда для тестов без влияния на production |
Ключевые концепции
VRF instance — виртуальная таблица маршрутизации с собственным набором интерфейсов, IP-адресов и маршрутов. Создаётся через /ip/vrf.
Routing table — таблица маршрутизации, привязанная к VRF. В RouterOS 7 routing table создаётся отдельно через /routing/table и ассоциируется с VRF.
Route Distinguisher (RD) — 64-битный идентификатор, делающий маршруты уникальными в контексте MP-BGP. Формат: ASN:число или IP:число. Используется только при интеграции с MPLS/BGP.
Route Target (RT) — определяет правила импорта/экспорта маршрутов между VRF. Import RT — какие маршруты принимать, Export RT — какие маршруты объявлять.
VRF Leaking — контролируемая утечка маршрутов между VRF. Позволяет, например, дать всем VRF доступ к общему DNS-серверу или интернету.
Схема сети
code[MikroTik Router] │ ┌───────────────┼───────────────┐ │ │ │ ether2 ether3 ether4 VRF: client-a VRF: client-b VRF: client-c 192.168.1.1/24 192.168.1.1/24 192.168.1.1/24 │ │ │ [Client A] [Client B] [Client C] 192.168.1.0/24 192.168.1.0/24 192.168.1.0/24
Три клиента с одинаковой адресацией подключены к одному роутеру через разные интерфейсы и изолированы через VRF.
Настройка
Шаг 1: Создание VRF
В RouterOS 7 VRF создаётся через /ip/vrf. Каждый VRF привязывается к интерфейсам и получает собственную таблицу маршрутизации.
[admin@MikroTik] >/ip/vrf add name=client-a interfaces=ether2 /ip/vrf add name=client-b interfaces=ether3 /ip/vrf add name=client-c interfaces=ether4
После этой команды интерфейсы ether2, ether3 и ether4 помещаются в соответствующие VRF. Трафик на этих интерфейсах изолирован от main routing table.
Шаг 2: Routing tables
Для каждого VRF создаём именованную таблицу маршрутизации:
[admin@MikroTik] >/routing/table add name=client-a fib /routing/table add name=client-b fib /routing/table add name=client-c fib
Параметр fib указывает, что таблица активно используется для forwarding (Forwarding Information Base).
Шаг 3: IP-адреса в VRF
Назначаем IP-адреса на интерфейсы, находящиеся в VRF:
[admin@MikroTik] >/ip/address add address=192.168.1.1/24 interface=ether2 /ip/address add address=192.168.1.1/24 interface=ether3 /ip/address add address=192.168.1.1/24 interface=ether4
Обратите внимание: все три адреса одинаковы (192.168.1.1/24). Это возможно, потому что интерфейсы находятся в разных VRF — конфликта нет.
Шаг 4: Маршруты в VRF
Статические маршруты добавляются с указанием routing-table:
[admin@MikroTik] ># Маршрут в сеть за клиентом A (если за ним есть ещё подсети) /ip/route add dst-address=10.10.1.0/24 gateway=192.168.1.2 routing-table=client-a # Маршрут в сеть за клиентом B /ip/route add dst-address=10.10.2.0/24 gateway=192.168.1.2 routing-table=client-b # Default route для каждого клиента (выход в интернет) /ip/route add dst-address=0.0.0.0/0 gateway=203.0.113.1 routing-table=client-a /ip/route add dst-address=0.0.0.0/0 gateway=203.0.113.1 routing-table=client-b /ip/route add dst-address=0.0.0.0/0 gateway=203.0.113.1 routing-table=client-c
Шаг 5: DHCP-сервер в VRF
Каждый VRF может иметь собственный DHCP-сервер:
[admin@MikroTik] ># Pool для клиента A /ip/pool add name=pool-client-a ranges=192.168.1.100-192.168.1.200 # DHCP Server для клиента A /ip/dhcp-server add name=dhcp-client-a interface=ether2 \ address-pool=pool-client-a lease-time=12h /ip/dhcp-server/network add address=192.168.1.0/24 gateway=192.168.1.1 \ dns-server=192.168.1.1 # Аналогично для клиентов B и C /ip/pool add name=pool-client-b ranges=192.168.1.100-192.168.1.200 /ip/dhcp-server add name=dhcp-client-b interface=ether3 \ address-pool=pool-client-b lease-time=12h /ip/pool add name=pool-client-c ranges=192.168.1.100-192.168.1.200 /ip/dhcp-server add name=dhcp-client-c interface=ether4 \ address-pool=pool-client-c lease-time=12h
Шаг 6: NAT для VRF
Для предоставления доступа в интернет каждому VRF нужен NAT. WAN-интерфейс (ether1) находится в main VRF. Нужно «пробросить» трафик из VRF в main.
Вариант 1 — NAT с routing-mark:
[admin@MikroTik] ># Mangle: маркируем трафик из каждого VRF /ip/firewall/mangle add chain=prerouting in-interface=ether2 \ dst-address-type=!local action=mark-routing \ new-routing-mark=main passthrough=yes comment="VRF client-a to main" /ip/firewall/mangle add chain=prerouting in-interface=ether3 \ dst-address-type=!local action=mark-routing \ new-routing-mark=main passthrough=yes comment="VRF client-b to main" /ip/firewall/mangle add chain=prerouting in-interface=ether4 \ dst-address-type=!local action=mark-routing \ new-routing-mark=main passthrough=yes comment="VRF client-c to main" # NAT /ip/firewall/nat add chain=srcnat out-interface=ether1 action=masquerade
Вариант 2 — default route в VRF через WAN gateway (если WAN-интерфейс доступен из VRF):
[admin@MikroTik] ># Добавляем WAN-интерфейс в VRF (не рекомендуется для shared WAN) # Лучше использовать вариант 1 с mangle
VRF Leaking — обмен маршрутами между VRF
Концепция
VRF Leaking позволяет контролируемо «просочить» определённые маршруты из одного VRF в другой. Типичные сценарии:
- Все клиенты должны иметь доступ к общему DNS-серверу в main VRF
- Management-сеть должна видеть все клиентские VRF
- Shared services (NTP, logging) доступны из всех VRF
Настройка VRF Leaking через статические маршруты
В RouterOS 7 простейший способ — статический маршрут с указанием gateway из другого VRF:
[admin@MikroTik] ># DNS-сервер 10.0.0.53 находится в main VRF # Делаем его доступным из client-a VRF # Маршрут в client-a, указывающий на шлюз в main /ip/route add dst-address=10.0.0.53/32 gateway=ether1 routing-table=client-a
Для обратного маршрута (чтобы DNS-сервер мог ответить клиентам):
[admin@MikroTik] >/ip/route add dst-address=192.168.1.0/24 gateway=ether2 routing-table=main
Внимание: при одинаковых подсетях обратный маршрут неоднозначен. В этом случае используйте NAT в VRF, чтобы клиентский трафик к shared services приходил с уникальным адресом.
VRF + OSPF
OSPF может работать внутри VRF, строя отдельную таблицу маршрутизации для каждого VRF.
[admin@MikroTik] ># OSPF instance для client-a /routing/ospf/instance add name=ospf-client-a router-id=1.1.1.1 \ routing-table=client-a vrf=client-a # OSPF area /routing/ospf/area add name=backbone-client-a instance=ospf-client-a area-id=0.0.0.0 # OSPF interface-template /routing/ospf/interface-template add area=backbone-client-a interfaces=ether2 \ type=ptp
Аналогично для каждого VRF, если в клиентской сети используется OSPF для динамической маршрутизации.
VRF + BGP (MP-BGP VPNv4)
Для полноценных L3VPN через MPLS используется MP-BGP с address-family VPNv4. Каждый VRF получает Route Distinguisher (RD) и Route Target (RT).
Настройка BGP с VPNv4
[admin@MikroTik] ># BGP instance /routing/bgp/template add name=ibgp-vpnv4 as=65000 \ address-families=vpnv4 # BGP peer (PE-PE iBGP) /routing/bgp/connection add name=pe2 template=ibgp-vpnv4 \ remote.address=10.0.0.2 remote.as=65000 \ local.role=ibgp
VRF с RD и RT
[admin@MikroTik] >/ip/vrf add name=client-a interfaces=ether2 \ route-distinguisher=65000:100 \ import-route-targets=65000:100 \ export-route-targets=65000:100
Route Distinguisher делает маршруты уникальными в BGP: маршрут 192.168.1.0/24 в VRF client-a становится 65000:100:192.168.1.0/24.
Route Target определяет политику:
export-route-targets=65000:100— маршруты из этого VRF экспортируются с RT 65000:100import-route-targets=65000:100— VRF импортирует маршруты с RT 65000:100
Для связи двух VRF (например, client-a на PE1 и client-a на PE2):
- Оба VRF используют одинаковый RT (65000:100)
- BGP автоматически распространяет маршруты между PE-роутерами
- На каждом PE маршруты с соответствующим RT импортируются в нужный VRF
Пример: два PE-роутера, один клиент
PE1 (RouterOS):
[admin@MikroTik] ># VRF /ip/vrf add name=client-a interfaces=ether2 \ route-distinguisher=65000:100 \ import-route-targets=65000:100 \ export-route-targets=65000:100 # IP в VRF /ip/address add address=192.168.1.1/24 interface=ether2 # BGP к PE2 /routing/bgp/template add name=vpnv4-tmpl as=65000 address-families=vpnv4 /routing/bgp/connection add name=to-pe2 template=vpnv4-tmpl \ remote.address=10.0.0.2 remote.as=65000 local.role=ibgp # OSPF в VRF (опционально, для динамического обмена маршрутами с CE) /routing/ospf/instance add name=ospf-client-a router-id=1.1.1.1 \ routing-table=client-a vrf=client-a redistribute=bgp /routing/ospf/area add name=area0-ca instance=ospf-client-a area-id=0.0.0.0 /routing/ospf/interface-template add area=area0-ca interfaces=ether2
PE2 (RouterOS):
[admin@MikroTik] ># VRF /ip/vrf add name=client-a interfaces=ether2 \ route-distinguisher=65000:100 \ import-route-targets=65000:100 \ export-route-targets=65000:100 # IP в VRF /ip/address add address=192.168.2.1/24 interface=ether2 # BGP к PE1 /routing/bgp/template add name=vpnv4-tmpl as=65000 address-families=vpnv4 /routing/bgp/connection add name=to-pe1 template=vpnv4-tmpl \ remote.address=10.0.0.1 remote.as=65000 local.role=ibgp # OSPF в VRF /routing/ospf/instance add name=ospf-client-a router-id=2.2.2.2 \ routing-table=client-a vrf=client-a redistribute=bgp /routing/ospf/area add name=area0-ca instance=ospf-client-a area-id=0.0.0.0 /routing/ospf/interface-template add area=area0-ca interfaces=ether2
В результате CE-устройства клиента A на обоих площадках видят друг друга через MPLS backbone, а их маршруты полностью изолированы от других клиентов.
VRF + NAT
NAT в VRF имеет особенности. Firewall в RouterOS работает в контексте main routing table. Для NAT трафика из VRF нужно сначала перенаправить его в main.
[admin@MikroTik] ># Маркируем трафик из VRF для перенаправления в main /ip/firewall/mangle add chain=prerouting in-interface=ether2 \ dst-address=!192.168.1.0/24 action=mark-routing \ new-routing-mark=main passthrough=yes # NAT /ip/firewall/nat add chain=srcnat out-interface=ether1 \ src-address=192.168.1.0/24 action=src-nat to-addresses=203.0.113.10 \ comment="NAT for client-a"
Если у каждого клиента должен быть свой внешний IP:
[admin@MikroTik] ># Client A → 203.0.113.10 /ip/firewall/nat add chain=srcnat out-interface=ether1 \ in-interface=ether2 action=src-nat to-addresses=203.0.113.10 # Client B → 203.0.113.11 /ip/firewall/nat add chain=srcnat out-interface=ether1 \ in-interface=ether3 action=src-nat to-addresses=203.0.113.11 # Client C → 203.0.113.12 /ip/firewall/nat add chain=srcnat out-interface=ether1 \ in-interface=ether4 action=src-nat to-addresses=203.0.113.12
ISP multi-tenant сценарий
Рассмотрим полный пример: провайдер предоставляет интернет и изолированные VPN трём клиентам через один MikroTik.
code[Internet] │ ether1 203.0.113.1/24 │ ┌────────┴────────┐ │ MikroTik PE │ │ Main VRF │ └┬───────┬────────┬┘ │ │ │ ether2 ether3 ether4 VRF:A VRF:B VRF:C │ │ │ [CE-A] [CE-B] [CE-C]
[admin@MikroTik] ># === VRF === /ip/vrf add name=vrf-a interfaces=ether2 /ip/vrf add name=vrf-b interfaces=ether3 /ip/vrf add name=vrf-c interfaces=ether4 # === Routing tables === /routing/table add name=vrf-a fib /routing/table add name=vrf-b fib /routing/table add name=vrf-c fib # === IP addresses === /ip/address add address=203.0.113.10/24 interface=ether1 comment="WAN" /ip/address add address=10.100.1.1/30 interface=ether2 comment="Link to CE-A" /ip/address add address=10.100.2.1/30 interface=ether3 comment="Link to CE-B" /ip/address add address=10.100.3.1/30 interface=ether4 comment="Link to CE-C" # === Маршруты клиентов === /ip/route add dst-address=192.168.1.0/24 gateway=10.100.1.2 routing-table=vrf-a /ip/route add dst-address=192.168.1.0/24 gateway=10.100.2.2 routing-table=vrf-b /ip/route add dst-address=192.168.1.0/24 gateway=10.100.3.2 routing-table=vrf-c # === Default routes для клиентов (интернет) === # Через mangle перенаправляем в main для NAT /ip/firewall/mangle add chain=prerouting in-interface=ether2 \ dst-address-type=!local action=mark-routing \ new-routing-mark=main passthrough=yes /ip/firewall/mangle add chain=prerouting in-interface=ether3 \ dst-address-type=!local action=mark-routing \ new-routing-mark=main passthrough=yes /ip/firewall/mangle add chain=prerouting in-interface=ether4 \ dst-address-type=!local action=mark-routing \ new-routing-mark=main passthrough=yes # === NAT === /ip/firewall/nat add chain=srcnat out-interface=ether1 \ in-interface=ether2 action=src-nat to-addresses=203.0.113.11 /ip/firewall/nat add chain=srcnat out-interface=ether1 \ in-interface=ether3 action=src-nat to-addresses=203.0.113.12 /ip/firewall/nat add chain=srcnat out-interface=ether1 \ in-interface=ether4 action=src-nat to-addresses=203.0.113.13 # === Default route (WAN) === /ip/route add dst-address=0.0.0.0/0 gateway=203.0.113.1
Проверка
Просмотр VRF
[admin@MikroTik] >/ip/vrf print
Ожидаемый вывод:
codeFlags: X - disabled # NAME INTERFACES ROUTE-DISTINGUISHER 0 main 1 client-a ether2 2 client-b ether3 3 client-c ether4
Просмотр таблиц маршрутизации
[admin@MikroTik] >/ip/route print where routing-table=client-a
Покажет только маршруты в VRF client-a. Connected-маршруты для ether2 появятся автоматически.
[admin@MikroTik] >/ip/route print where routing-table=main
Маршруты main VRF — не содержат клиентских подсетей.
Проверка изоляции
Из main VRF невозможно пинговать адреса в клиентских VRF (если не настроен leaking):
[admin@MikroTik] >/ping 192.168.1.1 vrf=main # Результат: timeout (адрес недоступен из main) /ping 192.168.1.1 vrf=client-a # Результат: reply (адрес доступен в VRF client-a)
Параметр vrf= указывает, из какого VRF выполнять пинг.
Проверка BGP VPNv4
[admin@MikroTik] >/routing/bgp/session print
Проверяем, что BGP-сессия established и address-family vpnv4 активна.
[admin@MikroTik] >/routing/bgp/advertisements print where address-family=vpnv4
Показывает маршруты, объявляемые через VPNv4.
Проверка подключённых маршрутов
[admin@MikroTik] >/ip/route print where routing-table=client-a type=connected
Должен показать connected-маршрут для подсети на ether2.
Типичные ошибки
1. Интерфейс не добавлен в VRF
Проблема: IP-адрес назначен, но трафик идёт через main routing table.
Симптом: клиенты из разных VRF видят друг друга; нет изоляции.
Диагностика:
[admin@MikroTik] >/ip/vrf print detail # Проверяем, что интерфейс указан в поле interfaces
Решение:
[admin@MikroTik] >/ip/vrf set [find name=client-a] interfaces=ether2
2. Routing table не создана
Проблема: VRF создан, но routing table с соответствующим именем отсутствует. Маршруты не добавляются.
Решение:
[admin@MikroTik] >/routing/table add name=client-a fib
Имя routing table должно точно совпадать с именем VRF.
3. DNS не работает в VRF
Проблема: DNS-сервер роутера работает в main VRF. Клиенты из других VRF не могут его использовать.
Решение 1: настройте DNS-forwarding через mangle:
[admin@MikroTik] >/ip/firewall/mangle add chain=prerouting in-interface=ether2 \ dst-port=53 protocol=udp action=mark-routing \ new-routing-mark=main passthrough=yes /ip/firewall/mangle add chain=prerouting in-interface=ether2 \ dst-port=53 protocol=tcp action=mark-routing \ new-routing-mark=main passthrough=yes
Решение 2: указывайте в DHCP внешний DNS (8.8.8.8), доступный через маршрут в VRF.
4. NAT не работает для VRF-трафика
Проблема: firewall/NAT работает в main VRF. Трафик из клиентских VRF не попадает в NAT.
Решение: используйте mangle для перенаправления трафика из VRF в main (см. раздел «VRF + NAT»).
5. Пересечение IP-адресов в ARP
Проблема: несколько клиентов с одинаковыми IP, но ARP-таблица единая. Возможны ARP-конфликты при определённых конфигурациях bridge.
Решение: не помещайте интерфейсы из разных VRF в один bridge. Каждый VRF должен использовать отдельный интерфейс или отдельный bridge.
[admin@MikroTik] ># Правильно: отдельные bridge для каждого VRF /interface/bridge add name=bridge-client-a /interface/bridge/port add bridge=bridge-client-a interface=ether2 /ip/vrf set [find name=client-a] interfaces=bridge-client-a
6. Забыт обратный маршрут при VRF Leaking
Проблема: маршрут в shared services настроен, трафик уходит, но ответ не возвращается в VRF.
Симптом: пинг уходит, но reply не приходит; tcpdump на сервере показывает входящие пакеты, но ответы теряются.
Решение: всегда настраивайте маршруты в обоих направлениях. Или используйте NAT для упрощения обратной маршрутизации.
7. OSPF/BGP instance не привязан к VRF
Проблема: OSPF работает, но маршруты попадают в main routing table вместо VRF.
Решение: убедитесь, что в OSPF/BGP instance указан правильный routing-table и vrf:
[admin@MikroTik] >/routing/ospf/instance print detail # Проверяем поля routing-table и vrf
Мониторинг
Просмотр всех маршрутов по таблицам
[admin@MikroTik] ># Все маршруты во всех таблицах /ip/route print # Фильтр по конкретной таблице /ip/route print where routing-table=client-a # Только active маршруты /ip/route print where routing-table=client-a active=yes
Счётчики интерфейсов
[admin@MikroTik] >/interface/print stats where name~"ether[2-4]"
Показывает трафик на каждом клиентском интерфейсе.
Трассировка из конкретного VRF
[admin@MikroTik] >/tool/traceroute 8.8.8.8 vrf=client-a
Показывает маршрут пакета из VRF client-a, включая промежуточные хопы.
Проверка ARP в VRF
[admin@MikroTik] >/ip/arp print where interface=ether2
ARP-записи отображаются с привязкой к интерфейсу, что позволяет различать записи из разных VRF.
Заключение
VRF — фундаментальная технология сетевой изоляции, необходимая провайдерам, MSP и крупным организациям. В RouterOS 7 настройка VRF интуитивна: создаём /ip/vrf, привязываем интерфейсы, назначаем маршруты в именованных таблицах. Для полноценных L3VPN связка VRF + MP-BGP VPNv4 + MPLS обеспечивает масштабируемое и стандартизированное решение. Ключевое правило: каждый VRF — это отдельный виртуальный роутер, и всё, что нужно для работы сети (маршруты, NAT, DNS), должно быть настроено для каждого VRF отдельно.
[MikroTik Router]
│
┌───────────────┼───────────────┐
│ │ │
ether2 ether3 ether4
VRF: client-a VRF: client-b VRF: client-c
192.168.1.1/24 192.168.1.1/24 192.168.1.1/24
│ │ │
[Client A] [Client B] [Client C]
192.168.1.0/24 192.168.1.0/24 192.168.1.0/24
/ip/vrf add name=client-a interfaces=ether2
/ip/vrf add name=client-b interfaces=ether3
/ip/vrf add name=client-c interfaces=ether4
/routing/table add name=client-a fib
/routing/table add name=client-b fib
/routing/table add name=client-c fib
/ip/address add address=192.168.1.1/24 interface=ether2
/ip/address add address=192.168.1.1/24 interface=ether3
/ip/address add address=192.168.1.1/24 interface=ether4
# Маршрут в сеть за клиентом A (если за ним есть ещё подсети)
/ip/route add dst-address=10.10.1.0/24 gateway=192.168.1.2 routing-table=client-a
# Маршрут в сеть за клиентом B
/ip/route add dst-address=10.10.2.0/24 gateway=192.168.1.2 routing-table=client-b
# Default route для каждого клиента (выход в интернет)
/ip/route add dst-address=0.0.0.0/0 gateway=203.0.113.1 routing-table=client-a
/ip/route add dst-address=0.0.0.0/0 gateway=203.0.113.1 routing-table=client-b
/ip/route add dst-address=0.0.0.0/0 gateway=203.0.113.1 routing-table=client-c
# Pool для клиента A
/ip/pool add name=pool-client-a ranges=192.168.1.100-192.168.1.200
# DHCP Server для клиента A
/ip/dhcp-server add name=dhcp-client-a interface=ether2 \
address-pool=pool-client-a lease-time=12h
/ip/dhcp-server/network add address=192.168.1.0/24 gateway=192.168.1.1 \
dns-server=192.168.1.1
# Аналогично для клиентов B и C
/ip/pool add name=pool-client-b ranges=192.168.1.100-192.168.1.200
/ip/dhcp-server add name=dhcp-client-b interface=ether3 \
address-pool=pool-client-b lease-time=12h
/ip/pool add name=pool-client-c ranges=192.168.1.100-192.168.1.200
/ip/dhcp-server add name=dhcp-client-c interface=ether4 \
address-pool=pool-client-c lease-time=12h
# Mangle: маркируем трафик из каждого VRF
/ip/firewall/mangle add chain=prerouting in-interface=ether2 \
dst-address-type=!local action=mark-routing \
new-routing-mark=main passthrough=yes comment="VRF client-a to main"
/ip/firewall/mangle add chain=prerouting in-interface=ether3 \
dst-address-type=!local action=mark-routing \
new-routing-mark=main passthrough=yes comment="VRF client-b to main"
/ip/firewall/mangle add chain=prerouting in-interface=ether4 \
dst-address-type=!local action=mark-routing \
new-routing-mark=main passthrough=yes comment="VRF client-c to main"
# NAT
/ip/firewall/nat add chain=srcnat out-interface=ether1 action=masquerade
# Добавляем WAN-интерфейс в VRF (не рекомендуется для shared WAN)
# Лучше использовать вариант 1 с mangle
# DNS-сервер 10.0.0.53 находится в main VRF
# Делаем его доступным из client-a VRF
# Маршрут в client-a, указывающий на шлюз в main
/ip/route add dst-address=10.0.0.53/32 gateway=ether1 routing-table=client-a
/ip/route add dst-address=192.168.1.0/24 gateway=ether2 routing-table=main
# OSPF instance для client-a
/routing/ospf/instance add name=ospf-client-a router-id=1.1.1.1 \
routing-table=client-a vrf=client-a
# OSPF area
/routing/ospf/area add name=backbone-client-a instance=ospf-client-a area-id=0.0.0.0
# OSPF interface-template
/routing/ospf/interface-template add area=backbone-client-a interfaces=ether2 \
type=ptp
# BGP instance
/routing/bgp/template add name=ibgp-vpnv4 as=65000 \
address-families=vpnv4
# BGP peer (PE-PE iBGP)
/routing/bgp/connection add name=pe2 template=ibgp-vpnv4 \
remote.address=10.0.0.2 remote.as=65000 \
local.role=ibgp
/ip/vrf add name=client-a interfaces=ether2 \
route-distinguisher=65000:100 \
import-route-targets=65000:100 \
export-route-targets=65000:100
# VRF
/ip/vrf add name=client-a interfaces=ether2 \
route-distinguisher=65000:100 \
import-route-targets=65000:100 \
export-route-targets=65000:100
# IP в VRF
/ip/address add address=192.168.1.1/24 interface=ether2
# BGP к PE2
/routing/bgp/template add name=vpnv4-tmpl as=65000 address-families=vpnv4
/routing/bgp/connection add name=to-pe2 template=vpnv4-tmpl \
remote.address=10.0.0.2 remote.as=65000 local.role=ibgp
# OSPF в VRF (опционально, для динамического обмена маршрутами с CE)
/routing/ospf/instance add name=ospf-client-a router-id=1.1.1.1 \
routing-table=client-a vrf=client-a redistribute=bgp
/routing/ospf/area add name=area0-ca instance=ospf-client-a area-id=0.0.0.0
/routing/ospf/interface-template add area=area0-ca interfaces=ether2
# VRF
/ip/vrf add name=client-a interfaces=ether2 \
route-distinguisher=65000:100 \
import-route-targets=65000:100 \
export-route-targets=65000:100
# IP в VRF
/ip/address add address=192.168.2.1/24 interface=ether2
# BGP к PE1
/routing/bgp/template add name=vpnv4-tmpl as=65000 address-families=vpnv4
/routing/bgp/connection add name=to-pe1 template=vpnv4-tmpl \
remote.address=10.0.0.1 remote.as=65000 local.role=ibgp
# OSPF в VRF
/routing/ospf/instance add name=ospf-client-a router-id=2.2.2.2 \
routing-table=client-a vrf=client-a redistribute=bgp
/routing/ospf/area add name=area0-ca instance=ospf-client-a area-id=0.0.0.0
/routing/ospf/interface-template add area=area0-ca interfaces=ether2
# Маркируем трафик из VRF для перенаправления в main
/ip/firewall/mangle add chain=prerouting in-interface=ether2 \
dst-address=!192.168.1.0/24 action=mark-routing \
new-routing-mark=main passthrough=yes
# NAT
/ip/firewall/nat add chain=srcnat out-interface=ether1 \
src-address=192.168.1.0/24 action=src-nat to-addresses=203.0.113.10 \
comment="NAT for client-a"
# Client A → 203.0.113.10
/ip/firewall/nat add chain=srcnat out-interface=ether1 \
in-interface=ether2 action=src-nat to-addresses=203.0.113.10
# Client B → 203.0.113.11
/ip/firewall/nat add chain=srcnat out-interface=ether1 \
in-interface=ether3 action=src-nat to-addresses=203.0.113.11
# Client C → 203.0.113.12
/ip/firewall/nat add chain=srcnat out-interface=ether1 \
in-interface=ether4 action=src-nat to-addresses=203.0.113.12
[Internet]
│
ether1
203.0.113.1/24
│
┌────────┴────────┐
│ MikroTik PE │
│ Main VRF │
└┬───────┬────────┬┘
│ │ │
ether2 ether3 ether4
VRF:A VRF:B VRF:C
│ │ │
[CE-A] [CE-B] [CE-C]
# === VRF ===
/ip/vrf add name=vrf-a interfaces=ether2
/ip/vrf add name=vrf-b interfaces=ether3
/ip/vrf add name=vrf-c interfaces=ether4
# === Routing tables ===
/routing/table add name=vrf-a fib
/routing/table add name=vrf-b fib
/routing/table add name=vrf-c fib
# === IP addresses ===
/ip/address add address=203.0.113.10/24 interface=ether1 comment="WAN"
/ip/address add address=10.100.1.1/30 interface=ether2 comment="Link to CE-A"
/ip/address add address=10.100.2.1/30 interface=ether3 comment="Link to CE-B"
/ip/address add address=10.100.3.1/30 interface=ether4 comment="Link to CE-C"
# === Маршруты клиентов ===
/ip/route add dst-address=192.168.1.0/24 gateway=10.100.1.2 routing-table=vrf-a
/ip/route add dst-address=192.168.1.0/24 gateway=10.100.2.2 routing-table=vrf-b
/ip/route add dst-address=192.168.1.0/24 gateway=10.100.3.2 routing-table=vrf-c
# === Default routes для клиентов (интернет) ===
# Через mangle перенаправляем в main для NAT
/ip/firewall/mangle add chain=prerouting in-interface=ether2 \
dst-address-type=!local action=mark-routing \
new-routing-mark=main passthrough=yes
/ip/firewall/mangle add chain=prerouting in-interface=ether3 \
dst-address-type=!local action=mark-routing \
new-routing-mark=main passthrough=yes
/ip/firewall/mangle add chain=prerouting in-interface=ether4 \
dst-address-type=!local action=mark-routing \
new-routing-mark=main passthrough=yes
# === NAT ===
/ip/firewall/nat add chain=srcnat out-interface=ether1 \
in-interface=ether2 action=src-nat to-addresses=203.0.113.11
/ip/firewall/nat add chain=srcnat out-interface=ether1 \
in-interface=ether3 action=src-nat to-addresses=203.0.113.12
/ip/firewall/nat add chain=srcnat out-interface=ether1 \
in-interface=ether4 action=src-nat to-addresses=203.0.113.13
# === Default route (WAN) ===
/ip/route add dst-address=0.0.0.0/0 gateway=203.0.113.1
/ip/vrf print
Flags: X - disabled
# NAME INTERFACES ROUTE-DISTINGUISHER
0 main
1 client-a ether2
2 client-b ether3
3 client-c ether4
/ip/route print where routing-table=client-a
/ip/route print where routing-table=main
/ping 192.168.1.1 vrf=main
# Результат: timeout (адрес недоступен из main)
/ping 192.168.1.1 vrf=client-a
# Результат: reply (адрес доступен в VRF client-a)
/routing/bgp/session print
/routing/bgp/advertisements print where address-family=vpnv4
/ip/route print where routing-table=client-a type=connected
/ip/vrf print detail
# Проверяем, что интерфейс указан в поле interfaces
/ip/vrf set [find name=client-a] interfaces=ether2
/routing/table add name=client-a fib
/ip/firewall/mangle add chain=prerouting in-interface=ether2 \
dst-port=53 protocol=udp action=mark-routing \
new-routing-mark=main passthrough=yes
/ip/firewall/mangle add chain=prerouting in-interface=ether2 \
dst-port=53 protocol=tcp action=mark-routing \
new-routing-mark=main passthrough=yes
# Правильно: отдельные bridge для каждого VRF
/interface/bridge add name=bridge-client-a
/interface/bridge/port add bridge=bridge-client-a interface=ether2
/ip/vrf set [find name=client-a] interfaces=bridge-client-a
/routing/ospf/instance print detail
# Проверяем поля routing-table и vrf
# Все маршруты во всех таблицах
/ip/route print
# Фильтр по конкретной таблице
/ip/route print where routing-table=client-a
# Только active маршруты
/ip/route print where routing-table=client-a active=yes
/interface/print stats where name~"ether[2-4]"
/tool/traceroute 8.8.8.8 vrf=client-a
/ip/arp print where interface=ether2