From 0b669e70530369ac0573b4f5e008a42416241260 Mon Sep 17 00:00:00 2001 From: Denis Shatskiy Date: Fri, 11 Jul 2025 09:49:08 +0700 Subject: [PATCH] Enhance README.md with detailed instructions for configuring OSPF in "receive-only" mode on HOME. Added multiple approaches for achieving this configuration, including disabling route redistribution, using filters, and creating stub areas. Included a comparison table of methods and emphasized the importance of avoiding inter-server routing. Updated sections on OSPF instance isolation and provided comprehensive examples for each method. --- README.md | 475 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 466 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 5ffad73..3088171 100644 --- a/README.md +++ b/README.md @@ -753,16 +753,147 @@ add src-address=192.168.222.0/24 action=lookup table=MSK # Основной т 1. **Прямая связь между серверами**: VPSVILLE ↔ IHOR через GRE туннель 10.200.0.0/30 2. **OSPF анонсирует маршруты**: Каждый сервер анонсирует свои сети через OSPF -3. **HOME получает маршруты**: HOME получает маршруты от обоих серверов через OSPF +3. **HOME получает маршруты**: HOME получает маршруты от обоих серверов через OSPF (только получение) 4. **Автоматический failover**: Если один сервер недоступен, OSPF убирает маршруты через него 5. **Оптимальные маршруты**: OSPF выбирает кратчайший путь между серверами +### Настройка OSPF "только получение" на HOME + +**ВАЖНО**: `passive=yes` отключает OSPF полностью, включая получение маршрутов! Это НЕ подходит для вашей задачи. + +Для того чтобы HOME gateway только получал маршруты от VPSVILLE и IHOR, но не отправлял свои маршруты, используется несколько подходов: + +### ❌ НЕ РАБОТАЕТ: Passive Mode +```shell +# ВНИМАНИЕ: Это НЕ работает! +add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=backbone passive=yes # ❌ Маршруты пропадут +``` + +**Почему не работает**: `passive=yes` отключает OSPF полностью - нет hello пакетов, нет соседства, нет маршрутов. + +#### Способ 1: Отключение redistribute (Рекомендуемый) + +```shell +# На HOME - нормальные OSPF интерфейсы (получение + отправка hello) +/routing ospf interface-template +add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=backbone +add interfaces=gre-MSK-IHOR-RTK cost=10 area=backbone +add interfaces=gre-MSK-VPSVILLE-MTS cost=100 area=backbone +add interfaces=gre-MSK-IHOR-MTS cost=100 area=backbone + +# Отключить redistribute (не анонсировать маршруты) +/routing ospf instance +set [ find default=yes ] redistribute=none +``` + +**Как это работает**: +- ✅ OSPF соседство устанавливается (hello пакеты отправляются) +- ✅ Маршруты от VPSVILLE/IHOR получаются +- ❌ HOME не анонсирует свои маршруты (redistribute=none) + +#### Способ 2: Использование фильтров + +```shell +# На HOME - нормальные OSPF интерфейсы +/routing ospf interface-template +add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=backbone +add interfaces=gre-MSK-IHOR-RTK cost=10 area=backbone + +# Создать фильтр который отклоняет все исходящие маршруты +/routing filter +add name=ospf-out-reject-all chain=output protocol=ospf rule="reject" + +# Применить фильтр к OSPF instance +/routing ospf instance +set [ find default=yes ] out-filter=ospf-out-reject-all +``` + +#### Способ 3: Stub Area (для сложных сетей) + +```shell +# Создать stub area для HOME +/routing ospf area +add name=home-stub instance=default area-id=0.0.0.1 stub=yes + +# Добавить интерфейсы HOME в stub area +/routing ospf interface-template +add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=home-stub +add interfaces=gre-MSK-IHOR-RTK cost=10 area=home-stub +``` + +#### Способ 4: Passive Mode (НЕ РЕКОМЕНДУЕТСЯ) + +```shell +# ВНИМАНИЕ: passive=yes отключает OSPF полностью, включая получение маршрутов! +# Этот способ НЕ работает для вашей задачи + +# На HOME - интерфейсы в passive mode (НЕ РАБОТАЕТ!) +/routing ospf interface-template +add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=backbone passive=yes # ❌ Маршруты пропадут +add interfaces=gre-MSK-IHOR-RTK cost=10 area=backbone passive=yes # ❌ Маршруты пропадут +``` + +### Сравнение способов настройки OSPF "только получение" + +| Способ | Простота | Совместимость | Гибкость | Работает | Рекомендация | +|--------|----------|---------------|----------|----------|--------------| +| **Отключение redistribute** | Высокая | Все версии | Низкая | ✅ Да | **Рекомендуемый** | +| **Фильтры** | Средняя | Все версии | Высокая | ✅ Да | Для точного контроля | +| **Stub Area** | Низкая | Все версии | Низкая | ✅ Да | Для сложных сетей | +| **Passive Mode** | Высокая | RouterOS 7.14+ | Низкая | ❌ Нет | НЕ РЕКОМЕНДУЕТСЯ | + +### Рекомендуемая конфигурация для HOME + +```shell +# 1. OSPF instance без redistribute (НЕ анонсировать маршруты) +/routing ospf instance +set [ find default=yes ] redistribute=none + +# 2. Нормальные OSPF интерфейсы (получение + отправка hello) +/routing ospf interface-template +add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=backbone +add interfaces=gre-MSK-IHOR-RTK cost=10 area=backbone +add interfaces=gre-MSK-VPSVILLE-MTS cost=100 area=backbone +add interfaces=gre-MSK-IHOR-MTS cost=100 area=backbone + +# 3. Проверка что маршруты получаются +/routing ospf route print +/ip route print where protocol=ospf +``` + +### Проверка работы OSPF "только получение" + +```shell +# На HOME проверить что маршруты получаются +/routing ospf route print + +# На VPSVILLE/IHOR проверить что маршруты от HOME не анонсируются +/routing ospf route print + +# Проверить OSPF соседей +/routing ospf neighbor print + +# Проверить что HOME не анонсирует маршруты +/routing ospf route print where originator=10.100.0.1 +``` + ### Роль HOME в архитектуре -- **HOME - конечная точка**: Подключается к серверам по GRE, но не участвует в межсерверной маршрутизации -- **Получение маршрутов**: HOME получает маршруты от серверов через OSPF -- **Policy routing**: HOME использует route tables для выбора нужного сервера/провайдера -- **Отправка трафика**: HOME отправляет трафик по правилам маршрутизации +| Роль | Описание | OSPF настройка | +|------|----------|----------------| +| **Конечная точка** | Подключается к серверам по GRE, но не участвует в межсерверной маршрутизации | passive=yes | +| **Получение маршрутов** | HOME получает маршруты от серверов через OSPF | redistribute=none | +| **Policy routing** | HOME использует route tables для выбора нужного сервера/провайдера | routing rules | +| **Отправка трафика** | HOME отправляет трафик по правилам маршрутизации | route tables | + +### Преимущества OSPF "только получение" на HOME + +| Преимущество | Описание | Практическое применение | +|--------------|----------|-------------------------| +| **Безопасность** | HOME не раскрывает свои внутренние сети | Защита от несанкционированного доступа | +| **Производительность** | Меньше OSPF трафика | Снижение нагрузки на сеть | +| **Простота** | Меньше конфигурации | Легче поддерживать | +| **Контроль** | Точный контроль над маршрутизацией | Предсказуемое поведение сети | ### Пример маршрутизации @@ -1309,9 +1440,9 @@ Area 0.0.0.0 (Backbone) - HOME ```shell # На всех устройствах (HOME, MSK-VPSVILLE, MSK-IHOR, SWE-HIPHOST): -# 1. Создать backbone area +# 1. Создать backbone area (ВАЖНО: используйте area-id=0.0.0.1 вместо 0.0.0.0) /routing ospf area -add name=backbone instance=default area-id=0.0.0.0 +add name=backbone instance=default area-id=0.0.0.1 # 2. Добавить все GRE интерфейсы в backbone area /routing ospf interface-template @@ -1326,6 +1457,328 @@ add interfaces=gre-MSK-IHOR-MTS cost=100 area=backbone add interfaces=gre-SWE-HIPHOST-MTS cost=100 area=backbone ``` +**ВАЖНО**: В некоторых случаях area-id=0.0.0.0 может вызывать проблемы. Если OSPF не работает с area-id=0.0.0.0, используйте area-id=0.0.0.1. + +### Решение: Изоляция серверов через отдельные OSPF Instances + +Проблема: Когда все серверы в одной OSPF area, создаются нежелательные маршруты типа VPSVILLE → HOME → IHOR. + +**Решение: Использовать отдельные OSPF instances для каждого сервера** + +#### Конфигурация с отдельными OSPF Instances: + +```shell +# На HOME (home.rt.shx.su): +# Создаем отдельные OSPF instances для каждого сервера с разным distance +/routing ospf instance +add name=vpsville-instance router-id=10.100.0.1 distance=110 # Основной (Ростелеком) +add name=ihor-instance router-id=10.100.0.1 distance=120 # Резервный (МТС) + +# Создаем areas для каждого instance +/routing ospf area +add name=vpsville-area instance=vpsville-instance area-id=0.0.0.0 +add name=ihor-area instance=ihor-instance area-id=0.0.0.0 + +# VPSVILLE интерфейсы в свой instance +/routing ospf interface-template +add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=vpsville-area instance=vpsville-instance +add interfaces=gre-MSK-VPSVILLE-MTS cost=100 area=vpsville-area instance=vpsville-instance + +# IHOR интерфейсы в свой instance +add interfaces=gre-MSK-IHOR-RTK cost=10 area=ihor-area instance=ihor-instance +add interfaces=gre-MSK-IHOR-MTS cost=100 area=ihor-area instance=ihor-instance + +# На MSK-VPSVILLE (msk.vpsville.rt.shx.su): +# Только один OSPF instance для связи с HOME +/routing ospf instance +set [ find default=yes ] name=vpsville-instance router-id=10.100.0.2 + +/routing ospf area +add name=vpsville-area instance=vpsville-instance area-id=0.0.0.0 + +/routing ospf interface-template +add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=vpsville-area instance=vpsville-instance +add interfaces=gre-MSK-VPSVILLE-MTS cost=100 area=vpsville-area instance=vpsville-instance + +# На MSK-IHOR (msk.ihor.rt.shx.su): +# Только один OSPF instance для связи с HOME +/routing ospf instance +set [ find default=yes ] name=ihor-instance router-id=10.100.0.3 + +/routing ospf area +add name=ihor-area instance=ihor-instance area-id=0.0.0.0 + +/routing ospf interface-template +add interfaces=gre-MSK-IHOR-RTK cost=10 area=ihor-area instance=ihor-instance +add interfaces=gre-MSK-IHOR-MTS cost=100 area=ihor-area instance=ihor-instance +``` + +#### Альтернатива: Route Tables для полного контроля + +```shell +# На HOME создать отдельные таблицы маршрутизации +/routing table +add name=vpsville-table fib +add name=ihor-table fib + +# Настроить routing rules для выбора таблицы +/routing rule +add src-address=192.168.111.0/24 action=lookup table=vpsville-table # HomeLab → VPSVILLE +add src-address=192.168.222.0/24 action=lookup table=ihor-table # Основной трафик → IHOR + +# OSPF автоматически добавит маршруты в соответствующие таблицы +# В vpsville-table будет маршрут от VPSVILLE +# В ihor-table будет маршрут от IHOR +``` + +#### Почему отдельные OSPF Instances работают: + +1. **Полная изоляция**: Каждый сервер работает в своем OSPF instance +2. **Нет межсерверных маршрутов**: VPSVILLE и IHOR не могут создать маршруты друг к другу через HOME +3. **Прямая связь**: Каждый сервер анонсирует маршруты только напрямую HOME +4. **Простота**: Каждый instance работает независимо, без сложных area настроек + +#### Важные особенности отдельных OSPF Instances: + +**Дублирование маршрутов:** +- ✅ **Нормально**: HOME получает маршрут 0.0.0.0/0 от каждого сервера +- ✅ **Автоматический выбор**: RouterOS выбирает маршрут с лучшим distance +- ✅ **Failover**: Если один сервер недоступен, используется маршрут от другого + +**Cost работает только внутри instance:** +- ❌ **Между instances**: Cost не сравнивается +- ✅ **Внутри instance**: Cost работает нормально (Ростелеком vs МТС) +- ✅ **Distance**: Используется для приоритизации между instances + +**Пример маршрутов на HOME:** +```shell +/ip route print where dst-address=0.0.0.0/0 +# Результат: +# dst-address=0.0.0.0/0 gateway=10.100.2.2 distance=110 # От VPSVILLE (основной) +# dst-address=0.0.0.0/0 gateway=10.100.4.2 distance=120 # От IHOR (резервный) +``` + +#### Детальное объяснение проблемы и решения: + +**Проблема с одним OSPF instance:** +- Все серверы в одном OSPF instance обмениваются всеми маршрутами +- VPSVILLE может создать маршрут VPSVILLE → HOME → IHOR +- IHOR может создать маршрут IHOR → HOME → VPSVILLE +- Это создает нежелательные межсерверные маршруты через HOME +- HOME становится транзитным узлом между серверами + +**Решение с отдельными OSPF instances:** +- **VPSVILLE-HOME**: Работает в отдельном instance (vpsville-instance) +- **IHOR-HOME**: Работает в отдельном instance (ihor-instance) +- **Полная изоляция**: Серверы не могут создать маршруты друг к другу +- **Прямая связь**: Каждый сервер анонсирует маршруты только напрямую HOME + +#### Схема работы отдельных OSPF Instances: + +```mermaid +graph TB + subgraph "OSPF Instance: vpsville-instance" + HOME_VPS[HOME
home.rt.shx.su] + VPSVILLE[MSK-VPSVILLE
msk.vpsville.rt.shx.su] + GRE_VPS[GRE туннели
VPSVILLE-HOME] + end + + subgraph "OSPF Instance: ihor-instance" + HOME_IHR[HOME
home.rt.shx.su] + IHOR[MSK-IHOR
msk.ihor.rt.shx.su] + GRE_IHR[GRE туннели
IHOR-HOME] + end + + HOME_VPS -. "OSPF" .- GRE_VPS + GRE_VPS --> VPSVILLE + + HOME_IHR -. "OSPF" .- GRE_IHR + GRE_IHR --> IHOR + + %% НЕТ связи между instances! + VPSVILLE -. "НЕТ OSPF" .- IHOR + + style HOME_VPS fill:#e1f5fe + style HOME_IHR fill:#e1f5fe + style VPSVILLE fill:#ff9800 + style IHOR fill:#ff9800 +``` + +#### Преимущества отдельных OSPF Instances: + +| Преимущество | Описание | Практическое применение | +|--------------|----------|-------------------------| +| **Полная изоляция** | Каждый сервер в своем instance | Нет межсерверных маршрутов | +| **Простота** | Простая настройка без сложных areas | Легко понять и поддерживать | +| **Контроль** | Точный контроль над маршрутизацией | HOME получает маршруты только напрямую | +| **Масштабируемость** | Легко добавлять новые серверы | Каждый новый сервер получает свой instance | +| **Отладка** | Простая диагностика проблем | Проблемы локализованы в конкретном instance | +| **Производительность** | Меньше OSPF трафика | Каждый instance работает независимо | + +#### Сравнение подходов для решения проблемы межсерверных маршрутов: + +| Подход | Дублирование маршрутов | Cost между серверами | Сложность настройки | Рекомендация | +|--------|------------------------|---------------------|-------------------|--------------| +| **Один OSPF instance** | ❌ Нет дублирования | ✅ Cost работает | 🟢 Простая | ❌ Создает межсерверные маршруты | +| **Один instance + фильтры** | ❌ Нет дублирования | ✅ Cost работает | 🟡 Средняя | ✅ **Рекомендуемый** | +| **Отдельные instances** | ✅ Есть дублирование | ❌ Cost не работает | 🟢 Простая | ✅ Альтернатива | +| **Route Tables** | ✅ Нет дублирования | ✅ Полный контроль | 🟡 Средняя | ✅ Для сложных случаев | +| **NSSA Areas** | ✅ Нет дублирования | ✅ Cost работает | 🔴 Сложная | ❌ Избыточно для вашей задачи | + +#### Решение 3: Один OSPF Instance с фильтрами (рекомендуемое) + +**Лучшее решение**: Использовать один OSPF instance с фильтрами для запрета межсерверных маршрутов. + +#### Конфигурация с одним OSPF Instance и фильтрами: + +```shell +# На HOME (home.rt.shx.su): +# Один OSPF instance +/routing ospf instance +set [ find default=yes ] router-id=10.100.0.1 + +# Одна area +/routing ospf area +add name=backbone instance=default area-id=0.0.0.0 + +# Все интерфейсы в один instance с разным cost +/routing ospf interface-template +# Ростелеком (основной провайдер) - низкий cost +add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=backbone +add interfaces=gre-MSK-IHOR-RTK cost=10 area=backbone + +# МТС (резервный провайдер) - высокий cost +add interfaces=gre-MSK-VPSVILLE-MTS cost=100 area=backbone +add interfaces=gre-MSK-IHOR-MTS cost=100 area=backbone + +# Создать фильтр для запрета межсерверных маршрутов (простой вариант) +/routing filter +add name=ospf-no-inter-server chain=input protocol=ospf rule="if (dst-address=10.100.0.0/16) { reject } else { accept }" + +# Применить фильтр к OSPF instance +/routing ospf instance +set [ find default=yes ] in-filter=ospf-no-inter-server +``` + +#### Альтернативный фильтр (более точный): + +```shell +# Создать фильтр который отклоняет маршруты между серверами +/routing filter +add name=ospf-block-inter-server chain=input protocol=ospf rule="if (dst-address=10.100.2.0/30 && src-address=10.100.4.0/30) { reject } else { accept }" +add name=ospf-block-inter-server chain=input protocol=ospf rule="if (dst-address=10.100.4.0/30 && src-address=10.100.2.0/30) { reject } else { accept }" +add name=ospf-block-inter-server chain=input protocol=ospf rule="if (dst-address=10.100.1.0/30 && src-address=10.100.3.0/30) { reject } else { accept }" +add name=ospf-block-inter-server chain=input protocol=ospf rule="if (dst-address=10.100.3.0/30 && src-address=10.100.1.0/30) { reject } else { accept }" + +# Применить фильтр +/routing ospf instance +set [ find default=yes ] in-filter=ospf-block-inter-server +``` + +#### На серверах (VPSVILLE, IHOR): +```shell +# Обычная OSPF конфигурация без изменений +/routing ospf instance +set [ find default=yes ] router-id=10.100.0.2 # или 10.100.0.3 для IHOR + +/routing ospf area +add name=backbone instance=default area-id=0.0.0.0 + +/routing ospf interface-template +add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=backbone # или gre-MSK-IHOR-RTK +add interfaces=gre-MSK-VPSVILLE-MTS cost=100 area=backbone # или gre-MSK-IHOR-MTS +``` + +#### Почему это решение лучше: + +1. ✅ **Cost работает**: Все в одном instance, cost сравнивается +2. ✅ **Нет межсерверных маршрутов**: Фильтры блокируют нежелательные маршруты +3. ✅ **Простота**: Один instance, простая настройка +4. ✅ **Гибкость**: Можно точно настроить что блокировать +5. ✅ **Производительность**: Меньше OSPF трафика чем с отдельными instances + +#### Как работают фильтры: + +**Простой фильтр** (рекомендуемый): +```shell +# Блокирует ВСЕ маршруты к 10.100.0.0/16 +if (dst-address=10.100.0.0/16) { reject } else { accept } +``` + +**Что это означает:** +- ✅ HOME получает маршруты 0.0.0.0/0 от серверов +- ❌ HOME НЕ получает маршруты к GRE туннелям (10.100.x.x) +- ✅ Серверы не могут создать маршруты друг к другу через HOME +- ✅ Cost работает для выбора оптимального пути к интернету + +**Результат:** +- VPSVILLE анонсирует: 0.0.0.0/0 (cost=10 через Ростелеком, cost=100 через МТС) +- IHOR анонсирует: 0.0.0.0/0 (cost=10 через Ростелеком, cost=100 через МТС) +- HOME выбирает лучший маршрут на основе cost +- НЕТ маршрутов типа VPSVILLE → HOME → IHOR + +#### Проверка работы одного OSPF Instance с фильтрами: + +```shell +# Проверить OSPF instance +/routing ospf instance print + +# Проверить OSPF соседей +/routing ospf neighbor print + +# Проверить маршруты +/routing ospf route print + +# Проверить интерфейсы +/routing ospf interface-template print + +# Проверить фильтры +/routing filter print + +# Проверить что нет межсерверных маршрутов +/routing ospf route print where dst-address~"10.100" +``` + +#### Мониторинг отдельных OSPF Instances: + +```shell +# На HOME проверить маршруты от VPSVILLE (vpsville-instance) +/routing ospf route print where instance=vpsville-instance + +# На HOME проверить маршруты от IHOR (ihor-instance) +/routing ospf route print where instance=ihor-instance + +# Проверить OSPF соседей в каждом instance +/routing ospf neighbor print where instance=vpsville-instance +/routing ospf neighbor print where instance=ihor-instance + +# Убедиться что нет межсерверных маршрутов +/routing ospf route print where dst-address~"10.100" +``` + +#### Диагностика проблем с отдельными Instances: + +```shell +# Если маршруты не получаются, проверить: +# 1. OSPF instances +/routing ospf instance print + +# 2. OSPF соседей +/routing ospf neighbor print + +# 3. GRE туннели +/interface gre print + +# 4. Interface template +/routing ospf interface-template print + +# 5. Логи OSPF +/log print where topics~"ospf" + +# 6. Проверить что нет межсерверных маршрутов +/ip route print where protocol=ospf +``` + ### Преимущества простой схемы (Area 0.0.0.0): 1. **Простота настройки**: Все устройства в одной area @@ -1577,11 +2030,11 @@ set [ find default=yes ] router-id=10.100.0.5 redistribute=connected ### Конфигурация на HOME (home.rt.shx.su): ```shell -# 1. OSPF конфигурация +# 1. OSPF конфигурация - только получение маршрутов /routing ospf area add name=backbone instance=default area-id=0.0.0.0 -# 2. Добавить интерфейсы к московским серверам в OSPF +# 2. Добавить интерфейсы к московским серверам в OSPF (нормальные) /routing ospf interface-template # Ростелеком (основной провайдер) - низкий cost add interfaces=gre-MSK-VPSVILLE-RTK cost=10 area=backbone @@ -1595,6 +2048,10 @@ add interfaces=gre-MSK-IHOR-MTS cost=100 area=backbone /routing rule add src-address=192.168.111.0/24 action=lookup table=MTS # HomeLab → МТС add src-address=192.168.222.0/24 action=lookup table=MSK # Основной трафик → Ростелеком + +# 4. Отключить redistribute на HOME (не анонсировать маршруты) +/routing ospf instance +set [ find default=yes ] redistribute=none ``` ### Межсерверные туннели (OSPF кластер)