Refactor multiwan_mikrotik_setup.md to improve clarity and consistency in configuration. Renamed PPPoE client interface to 'RTK-Internet', updated routing table entries for failover and health checks in the main routing table, and adjusted connection marking rules for better readability. Added commands for monitoring routes in the main table.
This commit is contained in:
@@ -0,0 +1,412 @@
|
||||
# BGP Gateway Failover: SWE-HIPHOST → FIN-HIPHOST
|
||||
|
||||
## Проблема
|
||||
|
||||
У вас есть:
|
||||
- BGP приносит список адресов
|
||||
- Трафик фильтруется на шлюз `swe-hiphost`
|
||||
- Нужно автоматически переключаться на `fin-hiphost` при недоступности `swe-hiphost`
|
||||
|
||||
## Архитектура решения
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "HOME"
|
||||
HOME[HOME<br/>home.rt.shx.su]
|
||||
BGP[BGP Routes]
|
||||
FILTER[Route Filter<br/>swe-hiphost]
|
||||
FAILOVER[Failover Logic]
|
||||
end
|
||||
|
||||
subgraph "Швеция"
|
||||
SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
|
||||
BFD_SWE[BFD Session]
|
||||
end
|
||||
|
||||
subgraph "Финляндия"
|
||||
FIN[FIN-HIPHOST<br/>fin.hiphost.rt.shx.su]
|
||||
BFD_FIN[BFD Session]
|
||||
end
|
||||
|
||||
%% BGP и маршрутизация
|
||||
BGP -. "BGP routes" .- HOME
|
||||
FILTER -. "Primary gateway" .- SWE
|
||||
FAILOVER -. "Backup gateway" .- FIN
|
||||
|
||||
%% BFD мониторинг
|
||||
HOME -. "BFD monitoring" .- SWE
|
||||
HOME -. "BFD monitoring" .- FIN
|
||||
|
||||
%% Failover
|
||||
FAILOVER -. "Auto switch" .- FILTER
|
||||
|
||||
style HOME fill:#e1f5fe
|
||||
style SWE fill:#4caf50
|
||||
style FIN fill:#ff9800
|
||||
style BFD_SWE fill:#9c27b0
|
||||
style BFD_FIN fill:#9c27b0
|
||||
```
|
||||
|
||||
## Решение 1: Динамические маршруты с check-gateway
|
||||
|
||||
### Настройка на HOME (home.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# Создать address-list для адресов из BGP (пример)
|
||||
/ip firewall address-list
|
||||
add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route"
|
||||
# ... добавьте все ваши BGP маршруты
|
||||
|
||||
# Создать статические маршруты с failover
|
||||
/ip route
|
||||
# Основной маршрут через SWE-HIPHOST
|
||||
add dst-address=173.194.0.0/16 gateway=swe-hiphost distance=1 check-gateway=ping
|
||||
add dst-address=74.125.0.0/16 gateway=swe-hiphost distance=1 check-gateway=ping
|
||||
add dst-address=142.250.0.0/16 gateway=swe-hiphost distance=1 check-gateway=ping
|
||||
|
||||
# Резервный маршрут через FIN-HIPHOST
|
||||
add dst-address=173.194.0.0/16 gateway=fin-hiphost distance=2 check-gateway=ping
|
||||
add dst-address=74.125.0.0/16 gateway=fin-hiphost distance=2 check-gateway=ping
|
||||
add dst-address=142.250.0.0/16 gateway=fin-hiphost distance=2 check-gateway=ping
|
||||
```
|
||||
|
||||
## Решение 2: BFD с динамическими маршрутами
|
||||
|
||||
### Настройка BFD мониторинга:
|
||||
|
||||
```shell
|
||||
# Настроить BFD для SWE-HIPHOST
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Настроить BFD для FIN-HIPHOST
|
||||
/routing bfd
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Создать маршруты с check-gateway=bfd
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# Резервные маршруты
|
||||
add dst-address=173.194.0.0/16 gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
```
|
||||
|
||||
## Решение 3: Скрипт для автоматического управления маршрутами
|
||||
|
||||
### Создание скрипта на HOME:
|
||||
|
||||
```shell
|
||||
# Скрипт для мониторинга и переключения шлюзов
|
||||
/system script
|
||||
add name=gateway-failover source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
|
||||
# Проверить статус SWE-HIPHOST
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - использовать его как primary
|
||||
:log info "SWE-HIPHOST is UP - using as primary gateway"
|
||||
/ip route set [find where dst-address=173.194.0.0/16 and gateway=swe-hiphost] distance=1
|
||||
/ip route set [find where dst-address=173.194.0.0/16 and gateway=fin-hiphost] distance=2
|
||||
/ip route set [find where dst-address=74.125.0.0/16 and gateway=swe-hiphost] distance=1
|
||||
/ip route set [find where dst-address=74.125.0.0/16 and gateway=fin-hiphost] distance=2
|
||||
/ip route set [find where dst-address=142.250.0.0/16 and gateway=swe-hiphost] distance=1
|
||||
/ip route set [find where dst-address=142.250.0.0/16 and gateway=fin-hiphost] distance=2
|
||||
} else={
|
||||
# SWE недоступен - переключиться на FIN
|
||||
:log info "SWE-HIPHOST is DOWN - switching to FIN-HIPHOST"
|
||||
/ip route set [find where dst-address=173.194.0.0/16 and gateway=swe-hiphost] distance=100
|
||||
/ip route set [find where dst-address=173.194.0.0/16 and gateway=fin-hiphost] distance=1
|
||||
/ip route set [find where dst-address=74.125.0.0/16 and gateway=swe-hiphost] distance=100
|
||||
/ip route set [find where dst-address=74.125.0.0/16 and gateway=fin-hiphost] distance=1
|
||||
/ip route set [find where dst-address=142.250.0.0/16 and gateway=swe-hiphost] distance=100
|
||||
/ip route set [find where dst-address=142.250.0.0/16 and gateway=fin-hiphost] distance=1
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать скрипт каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=gateway-failover interval=5s on-event=gateway-failover
|
||||
```
|
||||
|
||||
## Решение 4: Routing Rules с динамическими таблицами
|
||||
|
||||
### Создание динамических routing tables:
|
||||
|
||||
```shell
|
||||
# Создать routing tables для каждого шлюза
|
||||
/routing table
|
||||
add name=SWE-Gateway fib
|
||||
add name=FIN-Gateway fib
|
||||
|
||||
# Создать address-list для BGP маршрутов
|
||||
/ip firewall address-list
|
||||
add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route"
|
||||
|
||||
# Routing rules для BGP маршрутов
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=SWE-Gateway
|
||||
add dst-address=74.125.0.0/16 action=lookup table=SWE-Gateway
|
||||
add dst-address=142.250.0.0/16 action=lookup table=SWE-Gateway
|
||||
|
||||
# Маршруты в таблице SWE-Gateway
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=swe-hiphost routing-table=SWE-Gateway distance=1
|
||||
|
||||
# Маршруты в таблице FIN-Gateway (резервные)
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=fin-hiphost routing-table=FIN-Gateway distance=1
|
||||
```
|
||||
|
||||
### Скрипт для переключения таблиц:
|
||||
|
||||
```shell
|
||||
# Скрипт для переключения между routing tables
|
||||
/system script
|
||||
add name=switch-routing-table source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - использовать SWE-Gateway
|
||||
:log info "SWE-HIPHOST is UP - using SWE-Gateway"
|
||||
/routing rule set [find where table=SWE-Gateway] action=lookup
|
||||
/routing rule set [find where table=FIN-Gateway] action=lookup-only
|
||||
} else={
|
||||
# SWE недоступен - переключиться на FIN-Gateway
|
||||
:log info "SWE-HIPHOST is DOWN - switching to FIN-Gateway"
|
||||
/routing rule set [find where table=SWE-Gateway] action=lookup-only
|
||||
/routing rule set [find where table=FIN-Gateway] action=lookup
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=switch-routing-table interval=5s on-event=switch-routing-table
|
||||
```
|
||||
|
||||
## Решение 5: OSPF с динамическими cost
|
||||
|
||||
### Настройка OSPF с динамическим cost:
|
||||
|
||||
```shell
|
||||
# Создать скрипт для изменения OSPF cost на основе доступности
|
||||
/system script
|
||||
add name=adjust-ospf-cost source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
|
||||
:local sweInterface [/routing ospf interface-template find where interfaces=gre-SWE-HIPHOST]
|
||||
:local finInterface [/routing ospf interface-template find where interfaces=gre-FIN-HIPHOST]
|
||||
|
||||
# Настроить cost для SWE-HIPHOST
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
/routing ospf interface-template set $sweInterface cost=10
|
||||
:log info "SWE-HIPHOST UP - OSPF cost=10"
|
||||
} else={
|
||||
/routing ospf interface-template set $sweInterface cost=1000
|
||||
:log info "SWE-HIPHOST DOWN - OSPF cost=1000"
|
||||
}
|
||||
|
||||
# Настроить cost для FIN-HIPHOST
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
/routing ospf interface-template set $finInterface cost=20
|
||||
:log info "FIN-HIPHOST UP - OSPF cost=20"
|
||||
} else={
|
||||
/routing ospf interface-template set $finInterface cost=1000
|
||||
:log info "FIN-HIPHOST DOWN - OSPF cost=1000"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=adjust-ospf-cost interval=5s on-event=adjust-ospf-cost
|
||||
```
|
||||
|
||||
## Автоматическое создание маршрутов из BGP
|
||||
|
||||
### Скрипт для автоматического создания маршрутов:
|
||||
|
||||
```shell
|
||||
# Скрипт для создания маршрутов из BGP с failover
|
||||
/system script
|
||||
add name=create-bgp-routes source={
|
||||
:local bgpRoutes [/routing bgp route print where active=yes]
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
|
||||
:foreach route in=$bgpRoutes do={
|
||||
:local dstAddress [:pick $route 0 [:find $route " "]]
|
||||
|
||||
# Проверить существует ли уже маршрут
|
||||
:local existingRoute [/ip route print count-only where dst-address=$dstAddress]
|
||||
|
||||
:if ($existingRoute = 0) do={
|
||||
# Создать маршрут с failover
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - создать с distance=1
|
||||
/ip route add dst-address=$dstAddress gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
/ip route add dst-address=$dstAddress gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
:log info "Created route $dstAddress with SWE primary"
|
||||
} else={
|
||||
# SWE недоступен - создать с FIN primary
|
||||
/ip route add dst-address=$dstAddress gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
/ip route add dst-address=$dstAddress gateway=swe-hiphost distance=2 check-gateway=bfd
|
||||
:log info "Created route $dstAddress with FIN primary"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 30 секунд
|
||||
/system scheduler
|
||||
add name=create-bgp-routes interval=30s on-event=create-bgp-routes
|
||||
```
|
||||
|
||||
## Проверка настройки
|
||||
|
||||
### Проверка BFD статуса:
|
||||
```shell
|
||||
# Проверить BFD сессии
|
||||
/routing bfd print
|
||||
|
||||
# Проверить детали BFD
|
||||
/routing bfd print detail
|
||||
```
|
||||
|
||||
### Проверка маршрутов:
|
||||
```shell
|
||||
# Проверить все маршруты
|
||||
/ip route print
|
||||
|
||||
# Проверить маршруты к конкретному адресу
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# Проверить routing tables
|
||||
/ip route print where routing-table=SWE-Gateway
|
||||
/ip route print where routing-table=FIN-Gateway
|
||||
```
|
||||
|
||||
### Проверка BGP маршрутов:
|
||||
```shell
|
||||
# Проверить активные BGP маршруты
|
||||
/routing bgp route print where active=yes
|
||||
|
||||
# Проверить BGP соседей
|
||||
/routing bgp neighbor print
|
||||
```
|
||||
|
||||
## Тестирование failover
|
||||
|
||||
### Тест 1: Проверка переключения при отключении SWE:
|
||||
```shell
|
||||
# Отключить GRE туннель к SWE
|
||||
/interface gre disable [find where name=gre-SWE-HIPHOST]
|
||||
|
||||
# Подождать 10-30 секунд и проверить маршруты
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# Включить туннель обратно
|
||||
/interface gre enable [find where name=gre-SWE-HIPHOST]
|
||||
```
|
||||
|
||||
### Тест 2: Проверка traceroute:
|
||||
```shell
|
||||
# Проверить маршрут к BGP адресу
|
||||
traceroute 173.194.0.1
|
||||
|
||||
# Должен показать путь через активный шлюз
|
||||
```
|
||||
|
||||
## Мониторинг и логирование
|
||||
|
||||
### Настройка логирования:
|
||||
```shell
|
||||
# Включить логирование для BFD
|
||||
/system logging
|
||||
add topics=bfd
|
||||
|
||||
# Включить логирование для routing
|
||||
/system logging
|
||||
add topics=route
|
||||
|
||||
# Включить логирование для BGP
|
||||
/system logging
|
||||
add topics=bgp
|
||||
```
|
||||
|
||||
### Создание дашборда:
|
||||
```shell
|
||||
# Скрипт для отображения статуса
|
||||
/system script
|
||||
add name=show-gateway-status source={
|
||||
:log info "=== Gateway Status Report ==="
|
||||
:log info "BFD Status:"
|
||||
/routing bfd print
|
||||
:log info "Active Routes:"
|
||||
/ip route print where dst-address~"173.194"
|
||||
:log info "BGP Routes:"
|
||||
/routing bgp route print where active=yes
|
||||
:log info "=== End Report ==="
|
||||
}
|
||||
|
||||
# Запускать каждую минуту
|
||||
/system scheduler
|
||||
add name=gateway-status interval=1m on-event=show-gateway-status
|
||||
```
|
||||
|
||||
## Полная конфигурация для копирования
|
||||
|
||||
### HOME (home.rt.shx.su):
|
||||
```shell
|
||||
# BFD для мониторинга шлюзов
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Создать routing tables
|
||||
/routing table
|
||||
add name=SWE-Gateway fib
|
||||
add name=FIN-Gateway fib
|
||||
|
||||
# Address-list для BGP маршрутов
|
||||
/ip firewall address-list
|
||||
add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route"
|
||||
|
||||
# Routing rules
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=SWE-Gateway
|
||||
add dst-address=74.125.0.0/16 action=lookup table=SWE-Gateway
|
||||
add dst-address=142.250.0.0/16 action=lookup table=SWE-Gateway
|
||||
|
||||
# Маршруты в таблицах
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=swe-hiphost routing-table=SWE-Gateway distance=1
|
||||
add dst-address=0.0.0.0/0 gateway=fin-hiphost routing-table=FIN-Gateway distance=1
|
||||
|
||||
# Логирование
|
||||
/system logging
|
||||
add topics=bfd
|
||||
add topics=route
|
||||
add topics=bgp
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
Данное решение обеспечивает:
|
||||
|
||||
1. **Автоматический failover** между SWE-HIPHOST и FIN-HIPHOST
|
||||
2. **Быстрое обнаружение проблем** через BFD (100ms интервал)
|
||||
3. **Динамическое управление маршрутами** в зависимости от доступности шлюзов
|
||||
4. **Поддержку BGP маршрутов** с автоматическим созданием failover маршрутов
|
||||
5. **Гибкость настройки** через routing tables и rules
|
||||
|
||||
Теперь при недоступности SWE-HIPHOST трафик автоматически переключится на FIN-HIPHOST, а при восстановлении SWE-HIPHOST вернется к нему.
|
||||
@@ -0,0 +1,412 @@
|
||||
# Динамическое управление маршрутами через OSPF и BFD
|
||||
|
||||
## Проблема
|
||||
|
||||
У вас есть статические маршруты с gateway `swe-hiphost`, которые настраиваются через routing rules, и нужно, чтобы они динамически изменялись в зависимости от активности туннеля через OSPF и BFD.
|
||||
|
||||
## Решение: Динамические маршруты через OSPF redistribute
|
||||
|
||||
### Архитектура решения
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "HOME"
|
||||
HOME[HOME<br/>home.rt.shx.su]
|
||||
RT[Routing Table<br/>YouTube]
|
||||
RR[Routing Rules]
|
||||
end
|
||||
|
||||
subgraph "Москва"
|
||||
IHOR[MSK-IHOR<br/>msk.ihor.rt.shx.su]
|
||||
OSPF[OSPF Instance<br/>redistribute=static]
|
||||
end
|
||||
|
||||
subgraph "Швеция"
|
||||
SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
|
||||
BFD[BFD Session]
|
||||
end
|
||||
|
||||
%% Связи
|
||||
HOME -- "GRE туннели" --> IHOR
|
||||
HOME -- "GRE туннели" --> SWE
|
||||
IHOR -- "GRE туннель" --> SWE
|
||||
|
||||
%% OSPF и BFD
|
||||
IHOR -. "OSPF redistribute" .- HOME
|
||||
IHOR -. "BFD monitoring" .- SWE
|
||||
|
||||
%% Routing
|
||||
RT -. "OSPF route" .- HOME
|
||||
RR -. "Policy routing" .- RT
|
||||
|
||||
style HOME fill:#e1f5fe
|
||||
style IHOR fill:#ff9800
|
||||
style SWE fill:#4caf50
|
||||
style OSPF fill:#ff5722
|
||||
style BFD fill:#9c27b0
|
||||
```
|
||||
|
||||
## Пошаговая настройка
|
||||
|
||||
### Шаг 1: Настройка BFD для мониторинга туннеля IHOR→SWE
|
||||
|
||||
#### На MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# Настроить BFD для GRE туннеля к SWE
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Включить BFD для OSPF
|
||||
/routing ospf interface-template
|
||||
set [ find where interfaces=gre-SWE-HIPHOST ] bfd=yes
|
||||
```
|
||||
|
||||
#### На SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
```shell
|
||||
# Настроить BFD для GRE туннеля от IHOR
|
||||
/routing bfd
|
||||
add interface=gre-IHOR-SWE interval=100ms multiplier=3
|
||||
|
||||
# Включить BFD для OSPF
|
||||
/routing ospf interface-template
|
||||
set [ find where interfaces=gre-IHOR-SWE ] bfd=yes
|
||||
```
|
||||
|
||||
### Шаг 2: Настройка условных статических маршрутов на IHOR
|
||||
|
||||
#### На MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# Создать статические маршруты с проверкой доступности туннеля
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=ping
|
||||
|
||||
# Альтернативно - использовать check-gateway=bfd
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
```
|
||||
|
||||
### Шаг 3: Настройка OSPF redistribute на IHOR
|
||||
|
||||
#### На MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# Включить redistribute статических маршрутов в OSPF
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
|
||||
# Настроить фильтрацию для redistribute (опционально)
|
||||
/routing ospf redistribute
|
||||
add instance=default type=static route-filter=173.194.0.0/16
|
||||
add instance=default type=static route-filter=74.125.0.0/16
|
||||
add instance=default type=static route-filter=142.250.0.0/16
|
||||
add instance=default type=static route-filter=172.217.0.0/16
|
||||
add instance=default type=static route-filter=216.58.0.0/16
|
||||
add instance=default type=static route-filter=34.0.0.0/8
|
||||
add instance=default type=static route-filter=35.0.0.0/8
|
||||
add instance=default type=static route-filter=142.0.0.0/8
|
||||
```
|
||||
|
||||
### Шаг 4: Настройка routing rules на HOME
|
||||
|
||||
#### На HOME (home.rt.shx.su):
|
||||
```shell
|
||||
# Создать routing table YouTube
|
||||
/routing table
|
||||
add name=YouTube fib
|
||||
|
||||
# Создать address-list для YouTube
|
||||
/ip firewall address-list
|
||||
add list=YouTube list=173.194.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=74.125.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=142.250.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=172.217.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=216.58.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=34.0.0.0/8 comment="YouTube"
|
||||
add list=YouTube list=35.0.0.0/8 comment="YouTube"
|
||||
add list=YouTube list=142.0.0.0/8 comment="YouTube"
|
||||
|
||||
# Routing rules для YouTube трафика
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=74.125.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=142.250.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=172.217.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=216.58.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=34.0.0.0/8 action=lookup table=YouTube
|
||||
add dst-address=35.0.0.0/8 action=lookup table=YouTube
|
||||
add dst-address=142.0.0.0/8 action=lookup table=YouTube
|
||||
|
||||
# Маршрут в таблице YouTube через IHOR (будет получаться через OSPF)
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=10.100.4.2 routing-table=YouTube distance=1
|
||||
```
|
||||
|
||||
## Альтернативное решение: Скрипт для динамического управления маршрутами
|
||||
|
||||
### Создание скрипта на IHOR
|
||||
|
||||
#### На MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# Создать скрипт для мониторинга BFD и управления маршрутами
|
||||
/system script
|
||||
add name=check-swe-tunnel source={
|
||||
:local bfdStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local routeExists [/ip route print count-only where dst-address=173.194.0.0/16]
|
||||
|
||||
:if ([:len $bfdStatus] > 0) do={
|
||||
:if ($routeExists = 0) do={
|
||||
:log info "SWE tunnel is UP - adding YouTube routes"
|
||||
/ip route add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1
|
||||
/ip route add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1
|
||||
}
|
||||
} else={
|
||||
:if ($routeExists > 0) do={
|
||||
:log info "SWE tunnel is DOWN - removing YouTube routes"
|
||||
/ip route remove [find where dst-address=173.194.0.0/16]
|
||||
/ip route remove [find where dst-address=74.125.0.0/16]
|
||||
/ip route remove [find where dst-address=142.250.0.0/16]
|
||||
/ip route remove [find where dst-address=172.217.0.0/16]
|
||||
/ip route remove [find where dst-address=216.58.0.0/16]
|
||||
/ip route remove [find where dst-address=34.0.0.0/8]
|
||||
/ip route remove [find where dst-address=35.0.0.0/8]
|
||||
/ip route remove [find where dst-address=142.0.0.0/8]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Создать scheduler для запуска скрипта каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=check-swe-tunnel interval=10s on-event=check-swe-tunnel
|
||||
```
|
||||
|
||||
## Решение через OSPF cost manipulation
|
||||
|
||||
### Настройка динамического cost на основе BFD
|
||||
|
||||
#### На MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# Создать скрипт для изменения OSPF cost на основе BFD статуса
|
||||
/system script
|
||||
add name=adjust-ospf-cost source={
|
||||
:local bfdStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local ospfInterface [/routing ospf interface-template find where interfaces=gre-SWE-HIPHOST]
|
||||
|
||||
:if ([:len $bfdStatus] > 0) do={
|
||||
# Туннель активен - низкий cost
|
||||
/routing ospf interface-template set $ospfInterface cost=10
|
||||
:log info "SWE tunnel UP - OSPF cost set to 10"
|
||||
} else={
|
||||
# Туннель неактивен - высокий cost
|
||||
/routing ospf interface-template set $ospfInterface cost=1000
|
||||
:log info "SWE tunnel DOWN - OSPF cost set to 1000"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать скрипт каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=adjust-ospf-cost interval=5s on-event=adjust-ospf-cost
|
||||
```
|
||||
|
||||
## Проверка настройки
|
||||
|
||||
### На MSK-IHOR:
|
||||
```shell
|
||||
# Проверить BFD статус
|
||||
/routing bfd print
|
||||
|
||||
# Проверить статические маршруты
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# Проверить OSPF redistribute
|
||||
/routing ospf redistribute print
|
||||
|
||||
# Проверить OSPF маршруты
|
||||
/routing ospf route print
|
||||
```
|
||||
|
||||
### На HOME:
|
||||
```shell
|
||||
# Проверить OSPF маршруты
|
||||
/routing ospf route print
|
||||
|
||||
# Проверить routing table YouTube
|
||||
/ip route print where routing-table=YouTube
|
||||
|
||||
# Проверить routing rules
|
||||
/routing rule print where table=YouTube
|
||||
```
|
||||
|
||||
## Тестирование
|
||||
|
||||
### Тест 1: Проверка автоматического добавления маршрутов
|
||||
```shell
|
||||
# На IHOR проверить что маршруты добавлены
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# На HOME проверить что маршруты получены через OSPF
|
||||
/routing ospf route print
|
||||
```
|
||||
|
||||
### Тест 2: Проверка failover при отключении туннеля
|
||||
```shell
|
||||
# Отключить GRE туннель на IHOR
|
||||
/interface gre disable [find where name=gre-SWE-HIPHOST]
|
||||
|
||||
# Подождать 10-30 секунд и проверить что маршруты исчезли
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# Включить туннель обратно
|
||||
/interface gre enable [find where name=gre-SWE-HIPHOST]
|
||||
|
||||
# Проверить что маршруты появились снова
|
||||
/ip route print where dst-address~"173.194"
|
||||
```
|
||||
|
||||
### Тест 3: Проверка BFD мониторинга
|
||||
```shell
|
||||
# Проверить BFD сессии
|
||||
/routing bfd print detail
|
||||
|
||||
# Проверить BFD логи
|
||||
/log print where topics~"bfd"
|
||||
```
|
||||
|
||||
## Мониторинг и логирование
|
||||
|
||||
### Настройка логирования на IHOR:
|
||||
```shell
|
||||
# Включить логирование для BFD
|
||||
/system logging
|
||||
add topics=bfd
|
||||
|
||||
# Включить логирование для OSPF
|
||||
/system logging
|
||||
add topics=ospf
|
||||
|
||||
# Включить логирование для routing
|
||||
/system logging
|
||||
add topics=route
|
||||
```
|
||||
|
||||
### Создание дашборда для мониторинга:
|
||||
```shell
|
||||
# Скрипт для отображения статуса
|
||||
/system script
|
||||
add name=show-tunnel-status source={
|
||||
:log info "=== Tunnel Status Report ==="
|
||||
:log info "BFD Status:"
|
||||
/routing bfd print
|
||||
:log info "YouTube Routes:"
|
||||
/ip route print where dst-address~"173.194"
|
||||
:log info "OSPF Routes:"
|
||||
/routing ospf route print
|
||||
:log info "=== End Report ==="
|
||||
}
|
||||
|
||||
# Запускать каждую минуту
|
||||
/system scheduler
|
||||
add name=status-report interval=1m on-event=show-tunnel-status
|
||||
```
|
||||
|
||||
## Полная конфигурация для копирования
|
||||
|
||||
### MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# BFD для GRE туннеля
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# OSPF с BFD
|
||||
/routing ospf interface-template
|
||||
set [ find where interfaces=gre-SWE-HIPHOST ] bfd=yes
|
||||
|
||||
# Статические маршруты с проверкой
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=10.200.2.2 distance=1 check-gateway=bfd
|
||||
|
||||
# OSPF redistribute
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
```
|
||||
|
||||
### SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
```shell
|
||||
# BFD для GRE туннеля
|
||||
/routing bfd
|
||||
add interface=gre-IHOR-SWE interval=100ms multiplier=3
|
||||
|
||||
# OSPF с BFD
|
||||
/routing ospf interface-template
|
||||
set [ find where interfaces=gre-IHOR-SWE ] bfd=yes
|
||||
```
|
||||
|
||||
### HOME (home.rt.shx.su):
|
||||
```shell
|
||||
# Routing table YouTube
|
||||
/routing table
|
||||
add name=YouTube fib
|
||||
|
||||
# Address-list YouTube
|
||||
/ip firewall address-list
|
||||
add list=YouTube list=173.194.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=74.125.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=142.250.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=172.217.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=216.58.0.0/16 comment="YouTube"
|
||||
add list=YouTube list=34.0.0.0/8 comment="YouTube"
|
||||
add list=YouTube list=35.0.0.0/8 comment="YouTube"
|
||||
add list=YouTube list=142.0.0.0/8 comment="YouTube"
|
||||
|
||||
# Routing rules
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=74.125.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=142.250.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=172.217.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=216.58.0.0/16 action=lookup table=YouTube
|
||||
add dst-address=34.0.0.0/8 action=lookup table=YouTube
|
||||
add dst-address=35.0.0.0/8 action=lookup table=YouTube
|
||||
add dst-address=142.0.0.0/8 action=lookup table=YouTube
|
||||
|
||||
# Маршрут в таблице YouTube
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=10.100.4.2 routing-table=YouTube distance=1
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
Данное решение обеспечивает:
|
||||
|
||||
1. **Автоматическое управление маршрутами** через OSPF redistribute
|
||||
2. **Быстрое обнаружение проблем** через BFD (100ms интервал)
|
||||
3. **Динамическое добавление/удаление маршрутов** в зависимости от состояния туннеля
|
||||
4. **Сохранение routing rules** на HOME для Policy Based Routing
|
||||
5. **Автоматический failover** при проблемах с туннелем
|
||||
|
||||
Теперь ваши статические маршруты с gateway `swe-hiphost` будут автоматически появляться и исчезать в зависимости от активности туннеля, контролируемой OSPF и BFD.
|
||||
@@ -0,0 +1,313 @@
|
||||
## Site-to-Site GRE между двумя MikroTik RouterOS 7.14+ (Shats ↔ Malinin)
|
||||
|
||||
Этот гайд пошагово настраивает маршрут между двумя площадками по GRE-туннелю так, чтобы клиенты за роутером Shats из сети `192.168.0.0/16` видели клиентов сети `192.168.1.0/24` за роутером Malinin.
|
||||
|
||||
- Платформа: MikroTik RouterOS 7.14+
|
||||
- Туннель: GRE (с опцией — GRE поверх IPsec для шифрования)
|
||||
- Очень подробно: с командами CLI, проверками и устранением неполадок
|
||||
|
||||
### Схема и адреса
|
||||
- Router Shats:
|
||||
- WAN (публичный): `178.49.24.65`
|
||||
- LAN: `192.168.0.0/16`
|
||||
- GRE IP на туннеле: `10.199.99.1/30`
|
||||
- Router Malinin:
|
||||
- WAN (публичный): `80.64.170.90`
|
||||
- LAN: `192.168.1.0/24`
|
||||
- GRE IP на туннеле: `10.199.99.2/30`
|
||||
|
||||
GRE-интерфейс поднимается между публичными адресами. На GRE назначаем /30 адреса из подсети `10.199.99.0/30`.
|
||||
|
||||
---
|
||||
|
||||
### Предпосылки и рекомендации
|
||||
1) Доступ в терминал RouterOS (WinBox/WebFig/SSH).
|
||||
2) На обоих маршрутизаторах уже есть рабочий доступ в интернет на WAN-интерфейсах.
|
||||
3) Если включён FastTrack — его нужно отключить или исключить межсайтовый трафик из fasttrack.
|
||||
4) Маскарадинг (srcnat/masquerade) — добавим правила обхода NAT для межсайтового трафика, чтобы не NAT’ить его.
|
||||
5) MTU/MSS — включим `clamp-tcp-mss` на GRE, чтобы избежать фрагментации.
|
||||
|
||||
Примечание: Если у вас на WAN есть строгий firewall, заранее разрешите протокол GRE (IP protocol 47) в `input` на адреса пиров.
|
||||
|
||||
---
|
||||
|
||||
### 0) Резервная копия (рекомендуется)
|
||||
```rsc
|
||||
/system backup save name=pre-gre-setup
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 1) Создание GRE-интерфейсов
|
||||
|
||||
Настраиваем GRE на каждом роутере. Важно указать правильные `local-address` (своё публичное) и `remote-address` (публичный адрес удалённого роутера).
|
||||
|
||||
#### На Shats
|
||||
```rsc
|
||||
/interface gre
|
||||
add name=gre-to-malinin local-address=178.49.24.65 remote-address=80.64.170.90 clamp-tcp-mss=yes keepalive=10s,10
|
||||
|
||||
/ip address
|
||||
add address=10.199.99.1/30 interface=gre-to-malinin comment="GRE to Malinin"
|
||||
```
|
||||
|
||||
#### На Malinin
|
||||
```rsc
|
||||
/interface gre
|
||||
add name=gre-to-shats local-address=80.64.170.90 remote-address=178.49.24.65 clamp-tcp-mss=yes keepalive=10s,10
|
||||
|
||||
/ip address
|
||||
add address=10.199.99.2/30 interface=gre-to-shats comment="GRE to Shats"
|
||||
```
|
||||
|
||||
Пояснения:
|
||||
- `clamp-tcp-mss=yes` — автоматически поджимает MSS внутри GRE, снижая риск фрагментации.
|
||||
- `keepalive=10s,10` — отправка keepalive каждые 10 секунд, 10 неудачных попыток → интерфейс считается down.
|
||||
|
||||
---
|
||||
|
||||
### 2) Маршрутизация между LAN-сетями
|
||||
|
||||
Добавляем на обоих роутерах статические маршруты в удалённые LAN через IP удалённого конца GRE.
|
||||
|
||||
#### На Shats (в сторону сети Malinin 192.168.1.0/24)
|
||||
```rsc
|
||||
/ip route
|
||||
add dst-address=192.168.1.0/24 gateway=10.199.99.2 comment="to Malinin via GRE"
|
||||
```
|
||||
|
||||
#### На Malinin (в сторону сети Shats 192.168.0.0/16)
|
||||
```rsc
|
||||
/ip route
|
||||
add dst-address=192.168.0.0/16 gateway=10.199.99.1 comment="to Shats via GRE"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3) Обход NAT (srcnat bypass)
|
||||
|
||||
Если у вас есть общие правила `masquerade` на WAN, необходимо добавить правила «accept» перед masquerade, чтобы НЕ NAT’ить межсайтовый трафик. Это критично для корректной маршрутизации между приватными сетями.
|
||||
|
||||
#### На Shats
|
||||
```rsc
|
||||
/ip firewall nat
|
||||
add chain=srcnat src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="bypass NAT to Malinin LAN"
|
||||
```
|
||||
|
||||
#### На Malinin
|
||||
```rsc
|
||||
/ip firewall nat
|
||||
add chain=srcnat src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="bypass NAT to Shats LAN"
|
||||
```
|
||||
|
||||
Убедитесь, что эти правила стоят ВЫШЕ ваших общих правил `masquerade`.
|
||||
|
||||
---
|
||||
|
||||
### 4) FastTrack: отключить или исключить межсайтовый трафик
|
||||
|
||||
Если включён FastTrack, он может «обходить» firewall/NAT-цепочки и ломать туннельный трафик. Проще всего — отключить FastTrack, или скорректировать условие fasttrack-правила так, чтобы исключить межсайтовые сети.
|
||||
|
||||
Вариант A — полностью отключить FastTrack (на обоих):
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
set [find where chain=forward and action=fasttrack-connection] disabled=yes
|
||||
```
|
||||
|
||||
Вариант B — исключить межсайтовый трафик из FastTrack (пример для типового fasttrack-правила):
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
# Пример: добавляем отрицательные условия к существующему fasttrack-правилу
|
||||
set [find where chain=forward and action=fasttrack-connection and connection-state~"established,related"] \
|
||||
src-address=!192.168.0.0/16 dst-address=!192.168.1.0/24
|
||||
```
|
||||
|
||||
Примечание: точный синтаксис «set ... src-address/dst-address» для вашего текущего fasttrack-правила может отличаться. Универсально — поставить ПЕРЕД fasttrack явное `accept` для межсайтовых сетей в обе стороны (такие пакеты не попадут под fasttrack):
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
add chain=forward src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="allow site-to-site"
|
||||
add chain=forward src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="allow site-to-site"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5) Разрешения в firewall (input) для GRE
|
||||
|
||||
Если у вас жёсткие политики на `input`, нужно явно разрешить GRE-пакеты c удалённого публичного IP в адрес вашего WAN.
|
||||
|
||||
#### На Shats
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
add chain=input protocol=gre src-address=80.64.170.90 dst-address=178.49.24.65 action=accept comment="allow GRE from Malinin"
|
||||
```
|
||||
|
||||
#### На Malinin
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
add chain=input protocol=gre src-address=178.49.24.65 dst-address=80.64.170.90 action=accept comment="allow GRE from Shats"
|
||||
```
|
||||
|
||||
Разрешите также `icmp` (для диагностики) и доступ управления (ssh/winbox) по необходимости. Если политика по умолчанию — `drop`, удостоверьтесь, что выше есть правила `accept` для established/related.
|
||||
|
||||
---
|
||||
|
||||
### 6) Проверка работоспособности
|
||||
|
||||
1) Статус GRE-интерфейса:
|
||||
```rsc
|
||||
/interface gre print detail
|
||||
```
|
||||
|
||||
2) Ping точек GRE:
|
||||
```rsc
|
||||
/ping 10.199.99.2 interface=gre-to-malinin ;# выполнять на Shats
|
||||
/ping 10.199.99.1 interface=gre-to-shats ;# выполнять на Malinin
|
||||
```
|
||||
|
||||
3) Ping межсайтовых адресов (с указанием источника из LAN):
|
||||
```rsc
|
||||
# На Shats — пингуем хост в 192.168.1.0/24, например 192.168.1.10
|
||||
/ping 192.168.1.10 src-address=192.168.0.1
|
||||
|
||||
# На Malinin — пингуем хост в 192.168.0.0/16, например 192.168.0.10
|
||||
/ping 192.168.0.10 src-address=192.168.1.1
|
||||
```
|
||||
|
||||
4) Таблица маршрутов и ARP (диагностика):
|
||||
```rsc
|
||||
/ip route print where dst-address~"192.168.0.0/16|192.168.1.0/24"
|
||||
/ip neighbor print
|
||||
```
|
||||
|
||||
5) Connection tracking (убедиться, что нет NAT на межсайтовых потоках):
|
||||
```rsc
|
||||
/ip firewall connection print where dst-address~"192.168.1." or src-address~"192.168.1."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7) Частые проблемы и решения
|
||||
- Туннель up, но пинги межсайт не идут: проверьте, что на обеих сторонах есть статические маршруты через адрес ДРУГОГО конца GRE (10.199.99.2 на Shats и 10.199.99.1 на Malinin).
|
||||
- Пакеты идут в одну сторону: убедитесь в обходе NAT (правила `srcnat action=accept` стоят выше masquerade) и в исключении FastTrack.
|
||||
- Туннель не поднимается: разрешите `protocol=gre` на `input` между публичными IP, проверьте, что `local-address`/`remote-address` указаны верно.
|
||||
- Большие пакеты/веб «подвисают»: включён `clamp-tcp-mss=yes` на GRE. При необходимости можно уменьшить MTU GRE-интерфейса (например, до 1430) и повторно проверить.
|
||||
|
||||
---
|
||||
|
||||
### 8) Полные блоки конфигурации для быстрого применения
|
||||
|
||||
Скопируйте на соответствующий роутер целиком. Корректируйте адреса управления (src-address в ping) под ваши реальные адреса шлюзов/LAN.
|
||||
|
||||
#### Применить на Shats
|
||||
```rsc
|
||||
/interface gre
|
||||
add name=gre-to-malinin local-address=178.49.24.65 remote-address=80.64.170.90 clamp-tcp-mss=yes keepalive=10s,10
|
||||
|
||||
/ip address
|
||||
add address=10.199.99.1/30 interface=gre-to-malinin comment="GRE to Malinin"
|
||||
|
||||
/ip route
|
||||
add dst-address=192.168.1.0/24 gateway=10.199.99.2 comment="to Malinin via GRE"
|
||||
|
||||
/ip firewall nat
|
||||
add chain=srcnat src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="bypass NAT to Malinin LAN"
|
||||
|
||||
/ip firewall filter
|
||||
add chain=input protocol=gre src-address=80.64.170.90 dst-address=178.49.24.65 action=accept comment="allow GRE from Malinin"
|
||||
# (Опция) Явно разрешить межсайтовый трафик и обойти fasttrack
|
||||
add chain=forward src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="allow site-to-site"
|
||||
add chain=forward src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="allow site-to-site"
|
||||
# (Опция) отключить fasttrack целиком
|
||||
# set [find where chain=forward and action=fasttrack-connection] disabled=yes
|
||||
```
|
||||
|
||||
#### Применить на Malinin
|
||||
```rsc
|
||||
/interface gre
|
||||
add name=gre-to-shats local-address=80.64.170.90 remote-address=178.49.24.65 clamp-tcp-mss=yes keepalive=10s,10
|
||||
|
||||
/ip address
|
||||
add address=10.199.99.2/30 interface=gre-to-shats comment="GRE to Shats"
|
||||
|
||||
/ip route
|
||||
add dst-address=192.168.0.0/16 gateway=10.199.99.1 comment="to Shats via GRE"
|
||||
|
||||
/ip firewall nat
|
||||
add chain=srcnat src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="bypass NAT to Shats LAN"
|
||||
|
||||
/ip firewall filter
|
||||
add chain=input protocol=gre src-address=178.49.24.65 dst-address=80.64.170.90 action=accept comment="allow GRE from Shats"
|
||||
# (Опция) Явно разрешить межсайтовый трафик и обойти fasttrack
|
||||
add chain=forward src-address=192.168.1.0/24 dst-address=192.168.0.0/16 action=accept comment="allow site-to-site"
|
||||
add chain=forward src-address=192.168.0.0/16 dst-address=192.168.1.0/24 action=accept comment="allow site-to-site"
|
||||
# (Опция) отключить fasttrack целиком
|
||||
# set [find where chain=forward and action=fasttrack-connection] disabled=yes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9) (Опционально) Шифрование: GRE поверх IPsec
|
||||
|
||||
Если требуется шифровать GRE-трафик через интернет, включите IPsec в транспортном режиме для протокола GRE между публичными IP. Пример — IKEv2 с PSK и современными шифрами. Команды приводятся симметрично на обеих сторонах (подставьте соответствующие локальные/удалённые адреса и одинаковый секрет).
|
||||
|
||||
#### На Shats
|
||||
```rsc
|
||||
/ip ipsec profile
|
||||
add name=prof-gre ike-dh-group=modp2048 ike-encryption=aes-256 ike-integrity=sha256
|
||||
|
||||
/ip ipsec proposal
|
||||
add name=prop-gre auth-algorithms=sha256 enc-algorithms=aes-256-gcm pfs-group=none
|
||||
|
||||
/ip ipsec peer
|
||||
add name=peer-malinin address=80.64.170.90/32 exchange-mode=ike2 profile=prof-gre send-initial-contact=yes
|
||||
|
||||
/ip ipsec identity
|
||||
add peer=peer-malinin auth-method=pre-shared-key secret="SET_STRONG_SHARED_KEY"
|
||||
|
||||
/ip ipsec policy
|
||||
add src-address=178.49.24.65/32 dst-address=80.64.170.90/32 protocol=gre action=encrypt level=require \
|
||||
proposal=prop-gre tunnel=no sa-src-address=178.49.24.65 sa-dst-address=80.64.170.90
|
||||
```
|
||||
|
||||
#### На Malinin
|
||||
```rsc
|
||||
/ip ipsec profile
|
||||
add name=prof-gre ike-dh-group=modp2048 ike-encryption=aes-256 ike-integrity=sha256
|
||||
|
||||
/ip ipsec proposal
|
||||
add name=prop-gre auth-algorithms=sha256 enc-algorithms=aes-256-gcm pfs-group=none
|
||||
|
||||
/ip ipsec peer
|
||||
add name=peer-shats address=178.49.24.65/32 exchange-mode=ike2 profile=prof-gre send-initial-contact=yes
|
||||
|
||||
/ip ipsec identity
|
||||
add peer=peer-shats auth-method=pre-shared-key secret="SET_STRONG_SHARED_KEY"
|
||||
|
||||
/ip ipsec policy
|
||||
add src-address=80.64.170.90/32 dst-address=178.49.24.65/32 protocol=gre action=encrypt level=require \
|
||||
proposal=prop-gre tunnel=no sa-src-address=80.64.170.90 sa-dst-address=178.49.24.65
|
||||
```
|
||||
|
||||
Дополнительно:
|
||||
- Если политика `input` строгая, разрешите UDP/500 и UDP/4500 (IKE/NAT-T) и `ipsec-esp` между публичными IP.
|
||||
- На публичных адресах без NAT можно оставить `nat-traversal=no` (по умолчанию RouterOS 7 сам определяет необходимость). Для надёжности: `peer set peer-... passive=no`.
|
||||
|
||||
Проверка:
|
||||
```rsc
|
||||
/ip ipsec active-peers print detail
|
||||
/ip ipsec installed-sa print detail
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 10) Финальная проверка связности пользователей
|
||||
1) С ПК за Shats (например, `192.168.0.100`) — ping `192.168.1.10` (ПК за Malinin). Должны быть ответы.
|
||||
2) С ПК за Malinin (например, `192.168.1.50`) — ping `192.168.0.10` (ПК за Shats).
|
||||
3) Traceroute между сетями должен показывать переход через GRE (обычно один «хоп» до адреса удалённой LAN через 10.199.99.1↔10.199.99.2).
|
||||
4) При большой нагрузке на межсайтовый трафик убедитесь, что нет внезапных обрывов (если есть — проверьте MTU/MSS и FastTrack/NAT правила).
|
||||
|
||||
---
|
||||
|
||||
Готово. После выполнения шагов клиенты `192.168.0.0/16` за Shats будут видеть клиентов `192.168.1.0/24` за Malinin через GRE-туннель. Для безопасности можно включить опциональный раздел IPsec.
|
||||
|
||||
|
||||
@@ -58,8 +58,8 @@ add address=192.168.88.254/24 interface=br-lan comment="LAN"
|
||||
|
||||
# PPPoE для Ростелеком
|
||||
/interface pppoe-client
|
||||
add name=pppoe-rtk interface=ether8 user=your_username password=your_password
|
||||
add address=87.103.241.8/32 interface=pppoe-rtk comment="Ростелеком"
|
||||
add name=RTK-Internet interface=ether8 user=your_username password=your_password
|
||||
add address=87.103.241.8/32 interface=RTK-Internet comment="Ростелеком"
|
||||
|
||||
# DHCP для Электронного города
|
||||
/ip dhcp-client
|
||||
@@ -95,7 +95,7 @@ add disabled=no fib name=rtab-mts comment="МТС"
|
||||
### 2. Маршруты по умолчанию
|
||||
|
||||
```bash
|
||||
# Основные маршруты по умолчанию
|
||||
# Основные маршруты по умолчанию в таблице main
|
||||
/ip route
|
||||
add distance=251 gateway=87.103.241.1 comment="Ростелеком основной"
|
||||
add distance=252 gateway=178.49.24.1 comment="Эл.Город основной"
|
||||
@@ -106,6 +106,12 @@ add distance=253 gateway=109.174.26.1 comment="МТС основной"
|
||||
add gateway=87.103.241.1 routing-table=rtab-rtk comment="Ростелеком таблица"
|
||||
add gateway=178.49.24.1 routing-table=rtab-elcity comment="Эл.Город таблица"
|
||||
add gateway=109.174.26.1 routing-table=rtab-mts comment="МТС таблица"
|
||||
|
||||
# Настройка таблицы main для отказоустойчивости
|
||||
/ip route
|
||||
add distance=1 gateway=87.103.241.1 routing-table=main comment="Main Ростелеком"
|
||||
add distance=2 gateway=178.49.24.1 routing-table=main comment="Main Эл.Город"
|
||||
add distance=3 gateway=109.174.26.1 routing-table=main comment="Main МТС"
|
||||
```
|
||||
|
||||
## Настройка маркировки (Mangle)
|
||||
@@ -115,7 +121,7 @@ add gateway=109.174.26.1 routing-table=rtab-mts comment="МТС таблица"
|
||||
```bash
|
||||
# Маркировка соединений по входящим интерфейсам
|
||||
/ip firewall mangle
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=pppoe-rtk new-connection-mark=con-rtk passthrough=yes comment="Маркировка Ростелеком"
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=RTK-Internet new-connection-mark=con-rtk passthrough=yes comment="Маркировка Ростелеком"
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=ether1 new-connection-mark=con-elcity passthrough=yes comment="Маркировка Эл.Город"
|
||||
add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=ether7 new-connection-mark=con-mts passthrough=yes comment="Маркировка МТС"
|
||||
```
|
||||
@@ -149,6 +155,11 @@ add distance=1 gateway=178.49.24.1 routing-table=rtab-rtk comment="Failover Эл
|
||||
add distance=1 gateway=178.49.24.1 routing-table=rtab-mts comment="Failover Эл.Город->МТС"
|
||||
add distance=1 gateway=109.174.26.1 routing-table=rtab-rtk comment="Failover МТС->Ростелеком"
|
||||
add distance=1 gateway=109.174.26.1 routing-table=rtab-elcity comment="Failover МТС->Эл.Город"
|
||||
|
||||
# Рекурсивные маршруты для таблицы main
|
||||
/ip route
|
||||
add distance=1 gateway=178.49.24.1 routing-table=main comment="Main failover Эл.Город"
|
||||
add distance=1 gateway=109.174.26.1 routing-table=main comment="Main failover МТС"
|
||||
```
|
||||
|
||||
### 2. Настройка health check
|
||||
@@ -165,6 +176,12 @@ add address=8.8.8.8 interval=10s name=ping-mts
|
||||
add distance=1 gateway=87.103.241.1 routing-table=rtab-rtk check-gateway=ping
|
||||
add distance=1 gateway=178.49.24.1 routing-table=rtab-elcity check-gateway=ping
|
||||
add distance=1 gateway=109.174.26.1 routing-table=rtab-mts check-gateway=ping
|
||||
|
||||
# Health check для таблицы main
|
||||
/ip route
|
||||
add distance=1 gateway=87.103.241.1 routing-table=main check-gateway=ping comment="Main health check Ростелеком"
|
||||
add distance=2 gateway=178.49.24.1 routing-table=main check-gateway=ping comment="Main health check Эл.Город"
|
||||
add distance=3 gateway=109.174.26.1 routing-table=main check-gateway=ping comment="Main health check МТС"
|
||||
```
|
||||
|
||||
## Настройка VPN соединений
|
||||
@@ -213,6 +230,9 @@ add action=mark-connection chain=prerouting connection-mark=no-mark in-interface
|
||||
/ip route print where routing-table=rtab-rtk
|
||||
/ip route print where routing-table=rtab-elcity
|
||||
/ip route print where routing-table=rtab-mts
|
||||
|
||||
# Просмотр маршрутов в основной таблице
|
||||
/ip route print where routing-table=main
|
||||
```
|
||||
|
||||
### 2. Проверка маркировки
|
||||
@@ -249,7 +269,7 @@ add action=memory topics=firewall
|
||||
|
||||
```bash
|
||||
# Мониторинг состояния интерфейсов
|
||||
/interface monitor-traffic interface=pppoe-rtk
|
||||
/interface monitor-traffic interface=RTK-Internet
|
||||
/interface monitor-traffic interface=ether1
|
||||
/interface monitor-traffic interface=ether7
|
||||
```
|
||||
|
||||
@@ -0,0 +1,459 @@
|
||||
# OSPF + BGP Автоматический Failover для 12,000 маршрутов
|
||||
|
||||
## Проблема
|
||||
|
||||
У вас есть:
|
||||
- **12,000 маршрутов** приходят через BGP
|
||||
- Трафик фильтруется на шлюз `swe-hiphost`
|
||||
- Нужно автоматически переключаться на `fin-hiphost` при недоступности `swe-hiphost`
|
||||
- **БЕЗ ручного прописывания IP адресов**
|
||||
|
||||
## Архитектура автоматического решения
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "HOME"
|
||||
HOME[HOME<br/>home.rt.shx.su]
|
||||
BGP[BGP Routes<br/>12,000 маршрутов]
|
||||
OSPF[OSPF Instance]
|
||||
RT[Routing Table<br/>BGP-Routes]
|
||||
SCRIPT[Auto Script<br/>BGP→OSPF]
|
||||
end
|
||||
|
||||
subgraph "Швеция"
|
||||
SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
|
||||
OSPF_SWE[OSPF<br/>redistribute=bgp]
|
||||
BFD_SWE[BFD Session]
|
||||
end
|
||||
|
||||
subgraph "Финляндия"
|
||||
FIN[FIN-HIPHOST<br/>fin.hiphost.rt.shx.su]
|
||||
OSPF_FIN[OSPF<br/>redistribute=bgp]
|
||||
BFD_FIN[BFD Session]
|
||||
end
|
||||
|
||||
%% Автоматические связи
|
||||
BGP -. "12,000 routes" .- SCRIPT
|
||||
SCRIPT -. "Auto redistribute" .- OSPF
|
||||
OSPF -. "OSPF routes" .- RT
|
||||
|
||||
%% BFD мониторинг
|
||||
SWE -. "BFD monitoring" .- FIN
|
||||
HOME -. "BFD monitoring" .- SWE
|
||||
HOME -. "BFD monitoring" .- FIN
|
||||
|
||||
style HOME fill:#e1f5fe
|
||||
style SWE fill:#4caf50
|
||||
style FIN fill:#ff9800
|
||||
style BGP fill:#ff5722
|
||||
style SCRIPT fill:#9c27b0
|
||||
```
|
||||
|
||||
## Решение 1: Автоматический BGP → OSPF redistribute
|
||||
|
||||
### Настройка на HOME (home.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# Создать routing table для BGP маршрутов
|
||||
/routing table
|
||||
add name=BGP-Routes fib
|
||||
|
||||
# Включить redistribute BGP в OSPF
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static,bgp
|
||||
|
||||
# Настроить BFD для мониторинга шлюзов
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# OSPF интерфейсы с разным cost
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-SWE-HIPHOST cost=10 area=backbone
|
||||
add interfaces=gre-FIN-HIPHOST cost=100 area=backbone
|
||||
|
||||
# Routing rule для ВСЕХ BGP маршрутов (автоматически)
|
||||
/routing rule
|
||||
add dst-address=0.0.0.0/0 action=lookup table=BGP-Routes
|
||||
```
|
||||
|
||||
### Настройка на SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# BFD для мониторинга FIN
|
||||
/routing bfd
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Включить redistribute BGP в OSPF
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static,bgp
|
||||
|
||||
# OSPF интерфейс
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=10 area=backbone
|
||||
```
|
||||
|
||||
### Настройка на FIN-HIPHOST (fin.hiphost.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# BFD для мониторинга SWE
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Включить redistribute BGP в OSPF
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static,bgp
|
||||
|
||||
# OSPF интерфейс (резервный)
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=100 area=backbone
|
||||
```
|
||||
|
||||
## Решение 2: Динамический OSPF cost на основе BFD
|
||||
|
||||
### Скрипт на SWE-HIPHOST:
|
||||
|
||||
```shell
|
||||
# Скрипт для динамического изменения OSPF cost
|
||||
/system script
|
||||
add name=adjust-ospf-cost-swe source={
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
:local homeInterface [/routing ospf interface-template find where interfaces=gre-HOME]
|
||||
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
# FIN доступен - низкий cost (основной маршрут)
|
||||
/routing ospf interface-template set $homeInterface cost=10
|
||||
:log info "FIN-HIPHOST is UP - SWE cost=10 (primary)"
|
||||
} else={
|
||||
# FIN недоступен - высокий cost (резервный маршрут)
|
||||
/routing ospf interface-template set $homeInterface cost=1000
|
||||
:log info "FIN-HIPHOST is DOWN - SWE cost=1000 (backup)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=adjust-ospf-cost-swe interval=5s on-event=adjust-ospf-cost-swe
|
||||
```
|
||||
|
||||
### Скрипт на FIN-HIPHOST:
|
||||
|
||||
```shell
|
||||
# Скрипт для динамического изменения OSPF cost
|
||||
/system script
|
||||
add name=adjust-ospf-cost-fin source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local homeInterface [/routing ospf interface-template find where interfaces=gre-HOME]
|
||||
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - высокий cost (резервный маршрут)
|
||||
/routing ospf interface-template set $homeInterface cost=100
|
||||
:log info "SWE-HIPHOST is UP - FIN cost=100 (backup)"
|
||||
} else={
|
||||
# SWE недоступен - низкий cost (основной маршрут)
|
||||
/routing ospf interface-template set $homeInterface cost=10
|
||||
:log info "SWE-HIPHOST is DOWN - FIN cost=10 (primary)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=adjust-ospf-cost-fin interval=5s on-event=adjust-ospf-cost-fin
|
||||
```
|
||||
|
||||
## Решение 3: Условный redistribute на основе BFD
|
||||
|
||||
### Скрипт на SWE-HIPHOST:
|
||||
|
||||
```shell
|
||||
# Скрипт для условного включения/отключения redistribute
|
||||
/system script
|
||||
add name=conditional-redistribute-swe source={
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
# FIN доступен - включить redistribute BGP
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static,bgp
|
||||
:log info "SWE: FIN is UP - BGP redistribute enabled"
|
||||
} else={
|
||||
# FIN недоступен - отключить redistribute BGP
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static
|
||||
:log info "SWE: FIN is DOWN - BGP redistribute disabled"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=conditional-redistribute-swe interval=10s on-event=conditional-redistribute-swe
|
||||
```
|
||||
|
||||
### Скрипт на FIN-HIPHOST:
|
||||
|
||||
```shell
|
||||
# Скрипт для условного включения/отключения redistribute
|
||||
/system script
|
||||
add name=conditional-redistribute-fin source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - отключить redistribute BGP (резервный)
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static
|
||||
:log info "FIN: SWE is UP - BGP redistribute disabled (backup)"
|
||||
} else={
|
||||
# SWE недоступен - включить redistribute BGP (основной)
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static,bgp
|
||||
:log info "FIN: SWE is DOWN - BGP redistribute enabled (primary)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=conditional-redistribute-fin interval=10s on-event=conditional-redistribute-fin
|
||||
```
|
||||
|
||||
## Решение 4: Автоматическое создание routing rules для BGP маршрутов
|
||||
|
||||
### Скрипт на HOME для автоматического создания routing rules:
|
||||
|
||||
```shell
|
||||
# Скрипт для автоматического создания routing rules из BGP
|
||||
/system script
|
||||
add name=create-bgp-routing-rules source={
|
||||
:local bgpRoutes [/routing bgp route print where active=yes]
|
||||
:local existingRules [/routing rule print count-only where table=BGP-Routes]
|
||||
|
||||
# Если routing rules еще не созданы
|
||||
:if ($existingRules = 0) do={
|
||||
:log info "Creating routing rules for BGP routes..."
|
||||
|
||||
:foreach route in=$bgpRoutes do={
|
||||
:local dstAddress [:pick $route 0 [:find $route " "]]
|
||||
|
||||
# Создать routing rule для каждого BGP маршрута
|
||||
/routing rule add dst-address=$dstAddress action=lookup table=BGP-Routes
|
||||
}
|
||||
|
||||
:log info "Created routing rules for all BGP routes"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 60 секунд (только для создания rules)
|
||||
/system scheduler
|
||||
add name=create-bgp-routing-rules interval=60s on-event=create-bgp-routing-rules
|
||||
```
|
||||
|
||||
## Решение 5: Полностью автоматическое решение через route filtering
|
||||
|
||||
### Настройка route filtering для всех BGP маршрутов:
|
||||
|
||||
```shell
|
||||
# На SWE-HIPHOST создать route filter для всех BGP маршрутов
|
||||
/routing ospf redistribute
|
||||
add instance=default type=bgp route-filter=0.0.0.0/0
|
||||
|
||||
# На FIN-HIPHOST создать route filter для всех BGP маршрутов
|
||||
/routing ospf redistribute
|
||||
add instance=default type=bgp route-filter=0.0.0.0/0
|
||||
```
|
||||
|
||||
### Скрипт для условного включения/отключения route filters:
|
||||
|
||||
```shell
|
||||
# Скрипт для переключения route filters
|
||||
/system script
|
||||
add name=toggle-bgp-route-filters source={
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
|
||||
# На SWE-HIPHOST
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
# FIN доступен - включить BGP фильтры (SWE будет анонсировать)
|
||||
/routing ospf redistribute enable [find where type=bgp]
|
||||
:log info "SWE: BGP route filters enabled (FIN is UP)"
|
||||
} else={
|
||||
# FIN недоступен - отключить BGP фильтры (SWE не будет анонсировать)
|
||||
/routing ospf redistribute disable [find where type=bgp]
|
||||
:log info "SWE: BGP route filters disabled (FIN is DOWN)"
|
||||
}
|
||||
|
||||
# На FIN-HIPHOST
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - отключить BGP фильтры (FIN не будет анонсировать)
|
||||
/routing ospf redistribute disable [find where type=bgp]
|
||||
:log info "FIN: BGP route filters disabled (SWE is UP)"
|
||||
} else={
|
||||
# SWE недоступен - включить BGP фильтры (FIN будет анонсировать)
|
||||
/routing ospf redistribute enable [find where type=bgp]
|
||||
:log info "FIN: BGP route filters enabled (SWE is DOWN)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=toggle-bgp-route-filters interval=10s on-event=toggle-bgp-route-filters
|
||||
```
|
||||
|
||||
## Проверка автоматической настройки
|
||||
|
||||
### Проверка BGP маршрутов:
|
||||
```shell
|
||||
# Проверить количество активных BGP маршрутов
|
||||
/routing bgp route print count-only where active=yes
|
||||
|
||||
# Проверить первые 10 BGP маршрутов
|
||||
/routing bgp route print where active=yes limit=10
|
||||
```
|
||||
|
||||
### Проверка OSPF redistribute:
|
||||
```shell
|
||||
# Проверить настройки redistribute
|
||||
/routing ospf instance print
|
||||
|
||||
# Проверить route filters
|
||||
/routing ospf redistribute print
|
||||
```
|
||||
|
||||
### Проверка routing rules:
|
||||
```shell
|
||||
# Проверить количество routing rules
|
||||
/routing rule print count-only where table=BGP-Routes
|
||||
|
||||
# Проверить первые 10 routing rules
|
||||
/routing rule print where table=BGP-Routes limit=10
|
||||
```
|
||||
|
||||
### Проверка маршрутов в таблице:
|
||||
```shell
|
||||
# Проверить количество маршрутов в таблице BGP-Routes
|
||||
/ip route print count-only where routing-table=BGP-Routes
|
||||
|
||||
# Проверить первые 10 маршрутов
|
||||
/ip route print where routing-table=BGP-Routes limit=10
|
||||
```
|
||||
|
||||
## Тестирование автоматического failover
|
||||
|
||||
### Тест 1: Отключение SWE-HIPHOST:
|
||||
```shell
|
||||
# Отключить GRE туннель на SWE
|
||||
/interface gre disable [find where name=gre-HOME]
|
||||
|
||||
# Подождать 10-30 секунд и проверить OSPF маршруты
|
||||
/routing ospf route print
|
||||
|
||||
# Проверить что маршруты идут через FIN
|
||||
/ip route print where routing-table=BGP-Routes limit=5
|
||||
```
|
||||
|
||||
### Тест 2: Проверка количества маршрутов:
|
||||
```shell
|
||||
# Проверить что все BGP маршруты попали в OSPF
|
||||
/routing ospf route print count-only
|
||||
|
||||
# Сравнить с количеством BGP маршрутов
|
||||
/routing bgp route print count-only where active=yes
|
||||
```
|
||||
|
||||
## Мониторинг автоматической системы
|
||||
|
||||
### Создание дашборда для мониторинга:
|
||||
```shell
|
||||
# Скрипт для отображения статуса автоматической системы
|
||||
/system script
|
||||
add name=show-auto-bgp-status source={
|
||||
:log info "=== Automatic BGP Failover Status ==="
|
||||
:log info "BGP Routes Count:"
|
||||
:log info [/routing bgp route print count-only where active=yes]
|
||||
:log info "OSPF Routes Count:"
|
||||
:log info [/routing ospf route print count-only]
|
||||
:log info "Routing Rules Count:"
|
||||
:log info [/routing rule print count-only where table=BGP-Routes]
|
||||
:log info "BGP-Routes Table Count:"
|
||||
:log info [/ip route print count-only where routing-table=BGP-Routes]
|
||||
:log info "BFD Status:"
|
||||
/routing bfd print
|
||||
:log info "=== End Report ==="
|
||||
}
|
||||
|
||||
# Запускать каждую минуту
|
||||
/system scheduler
|
||||
add name=auto-bgp-status interval=1m on-event=show-auto-bgp-status
|
||||
```
|
||||
|
||||
## Полная автоматическая конфигурация
|
||||
|
||||
### HOME (home.rt.shx.su):
|
||||
```shell
|
||||
# Routing table для BGP маршрутов
|
||||
/routing table
|
||||
add name=BGP-Routes fib
|
||||
|
||||
# BFD для мониторинга шлюзов
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# OSPF интерфейсы
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-SWE-HIPHOST cost=10 area=backbone
|
||||
add interfaces=gre-FIN-HIPHOST cost=100 area=backbone
|
||||
|
||||
# Routing rule для ВСЕХ BGP маршрутов
|
||||
/routing rule
|
||||
add dst-address=0.0.0.0/0 action=lookup table=BGP-Routes
|
||||
|
||||
# Логирование
|
||||
/system logging
|
||||
add topics=ospf
|
||||
add topics=bfd
|
||||
add topics=bgp
|
||||
```
|
||||
|
||||
### SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
```shell
|
||||
# BFD для мониторинга FIN
|
||||
/routing bfd
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# OSPF redistribute
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static,bgp
|
||||
|
||||
# OSPF интерфейс
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=10 area=backbone
|
||||
```
|
||||
|
||||
### FIN-HIPHOST (fin.hiphost.rt.shx.su):
|
||||
```shell
|
||||
# BFD для мониторинга SWE
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# OSPF redistribute
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static,bgp
|
||||
|
||||
# OSPF интерфейс (резервный)
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=100 area=backbone
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
Автоматическое решение обеспечивает:
|
||||
|
||||
1. **Полностью автоматическую обработку 12,000 BGP маршрутов** без ручного прописывания
|
||||
2. **Автоматический failover** через OSPF cost manipulation
|
||||
3. **Быстрое обнаружение проблем** через BFD (100ms интервал)
|
||||
4. **Динамическое управление маршрутами** через redistribute
|
||||
5. **Масштабируемость** - работает с любым количеством BGP маршрутов
|
||||
|
||||
**Ключевые преимущества:**
|
||||
- ✅ **Никаких ручных IP** - все автоматически из BGP
|
||||
- ✅ **Масштабируемость** - работает с 12,000+ маршрутов
|
||||
- ✅ **Автоматическое создание routing rules** для всех BGP маршрутов
|
||||
- ✅ **Динамический failover** через OSPF
|
||||
- ✅ **Минимальная настройка** - только включить redistribute=bgp
|
||||
|
||||
Теперь все 12,000 ваших BGP маршрутов будут автоматически обрабатываться и переключаться между SWE-HIPHOST и FIN-HIPHOST в зависимости от доступности!
|
||||
@@ -0,0 +1,562 @@
|
||||
# OSPF Gateway Failover: SWE-HIPHOST → FIN-HIPHOST
|
||||
|
||||
## Проблема
|
||||
|
||||
У вас есть:
|
||||
- BGP приносит список адресов
|
||||
- Трафик фильтруется на шлюз `swe-hiphost`
|
||||
- Нужно автоматически переключаться на `fin-hiphost` при недоступности `swe-hiphost`
|
||||
- **Решение через OSPF**
|
||||
|
||||
## Архитектура решения через OSPF
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "HOME"
|
||||
HOME[HOME<br/>home.rt.shx.su]
|
||||
BGP[BGP Routes]
|
||||
OSPF[OSPF Instance]
|
||||
RT[Routing Table]
|
||||
end
|
||||
|
||||
subgraph "Швеция"
|
||||
SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
|
||||
OSPF_SWE[OSPF<br/>redistribute=static]
|
||||
BFD_SWE[BFD Session]
|
||||
end
|
||||
|
||||
subgraph "Финляндия"
|
||||
FIN[FIN-HIPHOST<br/>fin.hiphost.rt.shx.su]
|
||||
OSPF_FIN[OSPF<br/>redistribute=static]
|
||||
BFD_FIN[BFD Session]
|
||||
end
|
||||
|
||||
%% OSPF связи
|
||||
HOME -. "OSPF area" .- SWE
|
||||
HOME -. "OSPF area" .- FIN
|
||||
|
||||
%% BFD мониторинг
|
||||
SWE -. "BFD monitoring" .- FIN
|
||||
HOME -. "BFD monitoring" .- SWE
|
||||
HOME -. "BFD monitoring" .- FIN
|
||||
|
||||
%% Маршрутизация
|
||||
BGP -. "BGP routes" .- HOME
|
||||
OSPF -. "OSPF routes" .- HOME
|
||||
RT -. "Active routes" .- HOME
|
||||
|
||||
style HOME fill:#e1f5fe
|
||||
style SWE fill:#4caf50
|
||||
style FIN fill:#ff9800
|
||||
style OSPF fill:#ff5722
|
||||
style BFD_SWE fill:#9c27b0
|
||||
style BFD_FIN fill:#9c27b0
|
||||
```
|
||||
|
||||
## Решение 1: OSPF с динамическими cost
|
||||
|
||||
### Настройка на SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# Настроить BFD для мониторинга доступности
|
||||
/routing bfd
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Создать статические маршруты для BGP адресов
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# Включить redistribute в OSPF
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
|
||||
# Настроить OSPF интерфейс с динамическим cost
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=10 area=backbone
|
||||
```
|
||||
|
||||
### Настройка на FIN-HIPHOST (fin.hiphost.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# Настроить BFD для мониторинга доступности
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Создать статические маршруты для BGP адресов
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# Включить redistribute в OSPF
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
|
||||
# Настроить OSPF интерфейс с высоким cost (резервный)
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=100 area=backbone
|
||||
```
|
||||
|
||||
### Настройка на HOME (home.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# Настроить BFD для мониторинга обоих шлюзов
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# OSPF интерфейсы
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-SWE-HIPHOST cost=10 area=backbone
|
||||
add interfaces=gre-FIN-HIPHOST cost=100 area=backbone
|
||||
|
||||
# Создать routing table для BGP маршрутов
|
||||
/routing table
|
||||
add name=BGP-Routes fib
|
||||
|
||||
# Address-list для BGP маршрутов
|
||||
/ip firewall address-list
|
||||
add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=172.217.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=216.58.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=34.0.0.0/8 comment="BGP route"
|
||||
add list=BGP-ROUTES list=35.0.0.0/8 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.0.0.0/8 comment="BGP route"
|
||||
|
||||
# Routing rules для BGP маршрутов
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=74.125.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=142.250.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=172.217.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=216.58.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=34.0.0.0/8 action=lookup table=BGP-Routes
|
||||
add dst-address=35.0.0.0/8 action=lookup table=BGP-Routes
|
||||
add dst-address=142.0.0.0/8 action=lookup table=BGP-Routes
|
||||
```
|
||||
|
||||
## Решение 2: OSPF с динамическим cost на основе BFD
|
||||
|
||||
### Скрипт для динамического изменения OSPF cost:
|
||||
|
||||
```shell
|
||||
# Скрипт на SWE-HIPHOST для изменения cost на основе доступности FIN
|
||||
/system script
|
||||
add name=adjust-ospf-cost-swe source={
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
:local homeInterface [/routing ospf interface-template find where interfaces=gre-HOME]
|
||||
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
# FIN доступен - низкий cost (основной маршрут)
|
||||
/routing ospf interface-template set $homeInterface cost=10
|
||||
:log info "FIN-HIPHOST is UP - SWE cost=10 (primary)"
|
||||
} else={
|
||||
# FIN недоступен - высокий cost (резервный маршрут)
|
||||
/routing ospf interface-template set $homeInterface cost=1000
|
||||
:log info "FIN-HIPHOST is DOWN - SWE cost=1000 (backup)"
|
||||
}
|
||||
}
|
||||
|
||||
# Скрипт на FIN-HIPHOST для изменения cost на основе доступности SWE
|
||||
/system script
|
||||
add name=adjust-ospf-cost-fin source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local homeInterface [/routing ospf interface-template find where interfaces=gre-HOME]
|
||||
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - высокий cost (резервный маршрут)
|
||||
/routing ospf interface-template set $homeInterface cost=100
|
||||
:log info "SWE-HIPHOST is UP - FIN cost=100 (backup)"
|
||||
} else={
|
||||
# SWE недоступен - низкий cost (основной маршрут)
|
||||
/routing ospf interface-template set $homeInterface cost=10
|
||||
:log info "SWE-HIPHOST is DOWN - FIN cost=10 (primary)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать скрипты каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=adjust-ospf-cost-swe interval=5s on-event=adjust-ospf-cost-swe
|
||||
/system scheduler
|
||||
add name=adjust-ospf-cost-fin interval=5s on-event=adjust-ospf-cost-fin
|
||||
```
|
||||
|
||||
## Решение 3: OSPF с условными маршрутами
|
||||
|
||||
### Скрипт для условного создания маршрутов на основе BFD:
|
||||
|
||||
```shell
|
||||
# Скрипт на SWE-HIPHOST
|
||||
/system script
|
||||
add name=conditional-routes-swe source={
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
:local bgpRoutes [/routing bgp route print where active=yes]
|
||||
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
# FIN доступен - создать маршруты через FIN
|
||||
:foreach route in=$bgpRoutes do={
|
||||
:local dstAddress [:pick $route 0 [:find $route " "]]
|
||||
:local existingRoute [/ip route print count-only where dst-address=$dstAddress and gateway=fin-hiphost]
|
||||
|
||||
:if ($existingRoute = 0) do={
|
||||
/ip route add dst-address=$dstAddress gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
:log info "Added route $dstAddress via FIN-HIPHOST"
|
||||
}
|
||||
}
|
||||
} else={
|
||||
# FIN недоступен - удалить маршруты через FIN
|
||||
/ip route remove [find where gateway=fin-hiphost]
|
||||
:log info "Removed routes via FIN-HIPHOST (unavailable)"
|
||||
}
|
||||
}
|
||||
|
||||
# Скрипт на FIN-HIPHOST
|
||||
/system script
|
||||
add name=conditional-routes-fin source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local bgpRoutes [/routing bgp route print where active=yes]
|
||||
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - создать маршруты через SWE
|
||||
:foreach route in=$bgpRoutes do={
|
||||
:local dstAddress [:pick $route 0 [:find $route " "]]
|
||||
:local existingRoute [/ip route print count-only where dst-address=$dstAddress and gateway=swe-hiphost]
|
||||
|
||||
:if ($existingRoute = 0) do={
|
||||
/ip route add dst-address=$dstAddress gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
:log info "Added route $dstAddress via SWE-HIPHOST"
|
||||
}
|
||||
}
|
||||
} else={
|
||||
# SWE недоступен - удалить маршруты через SWE
|
||||
/ip route remove [find where gateway=swe-hiphost]
|
||||
:log info "Removed routes via SWE-HIPHOST (unavailable)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 30 секунд
|
||||
/system scheduler
|
||||
add name=conditional-routes-swe interval=30s on-event=conditional-routes-swe
|
||||
/system scheduler
|
||||
add name=conditional-routes-fin interval=30s on-event=conditional-routes-fin
|
||||
```
|
||||
|
||||
## Решение 4: OSPF с route redistribution фильтрацией
|
||||
|
||||
### Настройка условного redistribute на основе BFD:
|
||||
|
||||
```shell
|
||||
# Скрипт на SWE-HIPHOST для условного redistribute
|
||||
/system script
|
||||
add name=conditional-redistribute-swe source={
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
# FIN доступен - включить redistribute
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static
|
||||
:log info "SWE: FIN is UP - redistribute enabled"
|
||||
} else={
|
||||
# FIN недоступен - отключить redistribute
|
||||
/routing ospf instance set [find default=yes] redistribute=connected
|
||||
:log info "SWE: FIN is DOWN - redistribute disabled"
|
||||
}
|
||||
}
|
||||
|
||||
# Скрипт на FIN-HIPHOST для условного redistribute
|
||||
/system script
|
||||
add name=conditional-redistribute-fin source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - отключить redistribute (резервный)
|
||||
/routing ospf instance set [find default=yes] redistribute=connected
|
||||
:log info "FIN: SWE is UP - redistribute disabled (backup)"
|
||||
} else={
|
||||
# SWE недоступен - включить redistribute (основной)
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static
|
||||
:log info "FIN: SWE is DOWN - redistribute enabled (primary)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=conditional-redistribute-swe interval=10s on-event=conditional-redistribute-swe
|
||||
/system scheduler
|
||||
add name=conditional-redistribute-fin interval=10s on-event=conditional-redistribute-fin
|
||||
```
|
||||
|
||||
## Решение 5: OSPF с route filtering
|
||||
|
||||
### Настройка route filtering на основе BFD статуса:
|
||||
|
||||
```shell
|
||||
# Создать route filters на SWE-HIPHOST
|
||||
/routing ospf redistribute
|
||||
add instance=default type=static route-filter=173.194.0.0/16
|
||||
add instance=default type=static route-filter=74.125.0.0/16
|
||||
add instance=default type=static route-filter=142.250.0.0/16
|
||||
add instance=default type=static route-filter=172.217.0.0/16
|
||||
add instance=default type=static route-filter=216.58.0.0/16
|
||||
add instance=default type=static route-filter=34.0.0.0/8
|
||||
add instance=default type=static route-filter=35.0.0.0/8
|
||||
add instance=default type=static route-filter=142.0.0.0/8
|
||||
|
||||
# Скрипт для условного включения/отключения route filters
|
||||
/system script
|
||||
add name=toggle-route-filters source={
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
|
||||
# На SWE-HIPHOST
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
# FIN доступен - включить фильтры (SWE будет анонсировать)
|
||||
/routing ospf redistribute enable [find where type=static]
|
||||
:log info "SWE: Route filters enabled (FIN is UP)"
|
||||
} else={
|
||||
# FIN недоступен - отключить фильтры (SWE не будет анонсировать)
|
||||
/routing ospf redistribute disable [find where type=static]
|
||||
:log info "SWE: Route filters disabled (FIN is DOWN)"
|
||||
}
|
||||
|
||||
# На FIN-HIPHOST
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - отключить фильтры (FIN не будет анонсировать)
|
||||
/routing ospf redistribute disable [find where type=static]
|
||||
:log info "FIN: Route filters disabled (SWE is UP)"
|
||||
} else={
|
||||
# SWE недоступен - включить фильтры (FIN будет анонсировать)
|
||||
/routing ospf redistribute enable [find where type=static]
|
||||
:log info "FIN: Route filters enabled (SWE is DOWN)"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=toggle-route-filters interval=10s on-event=toggle-route-filters
|
||||
```
|
||||
|
||||
## Проверка настройки
|
||||
|
||||
### Проверка OSPF маршрутов:
|
||||
```shell
|
||||
# На HOME проверить OSPF маршруты
|
||||
/routing ospf route print
|
||||
|
||||
# Проверить OSPF соседей
|
||||
/routing ospf neighbor print
|
||||
|
||||
# Проверить routing table BGP-Routes
|
||||
/ip route print where routing-table=BGP-Routes
|
||||
```
|
||||
|
||||
### Проверка BFD статуса:
|
||||
```shell
|
||||
# Проверить BFD сессии
|
||||
/routing bfd print
|
||||
|
||||
# Проверить BFD детали
|
||||
/routing bfd print detail
|
||||
```
|
||||
|
||||
### Проверка маршрутов на шлюзах:
|
||||
```shell
|
||||
# На SWE-HIPHOST
|
||||
/ip route print where dst-address~"173.194"
|
||||
|
||||
# На FIN-HIPHOST
|
||||
/ip route print where dst-address~"173.194"
|
||||
```
|
||||
|
||||
## Тестирование failover
|
||||
|
||||
### Тест 1: Отключение SWE-HIPHOST:
|
||||
```shell
|
||||
# Отключить GRE туннель на SWE
|
||||
/interface gre disable [find where name=gre-HOME]
|
||||
|
||||
# Подождать 10-30 секунд и проверить OSPF маршруты на HOME
|
||||
/routing ospf route print
|
||||
|
||||
# Проверить что маршруты идут через FIN
|
||||
/ip route print where routing-table=BGP-Routes
|
||||
```
|
||||
|
||||
### Тест 2: Отключение FIN-HIPHOST:
|
||||
```shell
|
||||
# Отключить GRE туннель на FIN
|
||||
/interface gre disable [find where name=gre-HOME]
|
||||
|
||||
# Подождать и проверить что маршруты переключились на SWE
|
||||
/routing ospf route print
|
||||
```
|
||||
|
||||
## Мониторинг и логирование
|
||||
|
||||
### Настройка логирования:
|
||||
```shell
|
||||
# Включить логирование для OSPF
|
||||
/system logging
|
||||
add topics=ospf
|
||||
|
||||
# Включить логирование для BFD
|
||||
/system logging
|
||||
add topics=bfd
|
||||
|
||||
# Включить логирование для routing
|
||||
/system logging
|
||||
add topics=route
|
||||
```
|
||||
|
||||
### Создание дашборда:
|
||||
```shell
|
||||
# Скрипт для отображения статуса
|
||||
/system script
|
||||
add name=show-ospf-status source={
|
||||
:log info "=== OSPF Gateway Status ==="
|
||||
:log info "BFD Status:"
|
||||
/routing bfd print
|
||||
:log info "OSPF Routes:"
|
||||
/routing ospf route print
|
||||
:log info "OSPF Neighbors:"
|
||||
/routing ospf neighbor print
|
||||
:log info "BGP Routes Table:"
|
||||
/ip route print where routing-table=BGP-Routes
|
||||
:log info "=== End Report ==="
|
||||
}
|
||||
|
||||
# Запускать каждую минуту
|
||||
/system scheduler
|
||||
add name=ospf-status interval=1m on-event=show-ospf-status
|
||||
```
|
||||
|
||||
## Полная конфигурация для копирования
|
||||
|
||||
### SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
```shell
|
||||
# BFD для мониторинга FIN
|
||||
/routing bfd
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Статические маршруты через FIN
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=fin-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# OSPF redistribute
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
|
||||
# OSPF интерфейс
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=10 area=backbone
|
||||
```
|
||||
|
||||
### FIN-HIPHOST (fin.hiphost.rt.shx.su):
|
||||
```shell
|
||||
# BFD для мониторинга SWE
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Статические маршруты через SWE
|
||||
/ip route
|
||||
add dst-address=173.194.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=74.125.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.250.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=172.217.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=216.58.0.0/16 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=34.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=35.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=142.0.0.0/8 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# OSPF redistribute
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static
|
||||
|
||||
# OSPF интерфейс (резервный)
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-HOME cost=100 area=backbone
|
||||
```
|
||||
|
||||
### HOME (home.rt.shx.su):
|
||||
```shell
|
||||
# BFD для мониторинга шлюзов
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# OSPF интерфейсы
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-SWE-HIPHOST cost=10 area=backbone
|
||||
add interfaces=gre-FIN-HIPHOST cost=100 area=backbone
|
||||
|
||||
# Routing table для BGP маршрутов
|
||||
/routing table
|
||||
add name=BGP-Routes fib
|
||||
|
||||
# Address-list для BGP маршрутов
|
||||
/ip firewall address-list
|
||||
add list=BGP-ROUTES list=173.194.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=74.125.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.250.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=172.217.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=216.58.0.0/16 comment="BGP route"
|
||||
add list=BGP-ROUTES list=34.0.0.0/8 comment="BGP route"
|
||||
add list=BGP-ROUTES list=35.0.0.0/8 comment="BGP route"
|
||||
add list=BGP-ROUTES list=142.0.0.0/8 comment="BGP route"
|
||||
|
||||
# Routing rules
|
||||
/routing rule
|
||||
add dst-address=173.194.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=74.125.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=142.250.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=172.217.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=216.58.0.0/16 action=lookup table=BGP-Routes
|
||||
add dst-address=34.0.0.0/8 action=lookup table=BGP-Routes
|
||||
add dst-address=35.0.0.0/8 action=lookup table=BGP-Routes
|
||||
add dst-address=142.0.0.0/8 action=lookup table=BGP-Routes
|
||||
|
||||
# Логирование
|
||||
/system logging
|
||||
add topics=ospf
|
||||
add topics=bfd
|
||||
add topics=route
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
OSPF решение обеспечивает:
|
||||
|
||||
1. **Автоматический failover** через OSPF cost manipulation
|
||||
2. **Быстрое обнаружение проблем** через BFD (100ms интервал)
|
||||
3. **Динамическое управление маршрутами** через redistribute
|
||||
4. **Элегантную интеграцию** с существующей OSPF инфраструктурой
|
||||
5. **Автоматическое восстановление** при восстановлении доступности
|
||||
|
||||
**Преимущества OSPF подхода:**
|
||||
- ✅ Использует существующую OSPF инфраструктуру
|
||||
- ✅ Автоматическое распространение изменений
|
||||
- ✅ Встроенная поддержка failover
|
||||
- ✅ Меньше скриптов и ручного управления
|
||||
- ✅ Более надежное решение
|
||||
|
||||
Теперь при недоступности SWE-HIPHOST OSPF автоматически выберет маршрут через FIN-HIPHOST, а при восстановлении вернется к SWE-HIPHOST.
|
||||
@@ -0,0 +1,380 @@
|
||||
# OSPF на IHOR/VPSVILLE с BGP маршрутами и автоматическим failover
|
||||
|
||||
## Правильная архитектура
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "HOME"
|
||||
HOME[HOME<br/>home.rt.shx.su]
|
||||
RT[Routing Table<br/>BGP-Routes]
|
||||
end
|
||||
|
||||
subgraph "Москва"
|
||||
IHOR[MSK-IHOR<br/>msk.ihor.rt.shx.su]
|
||||
VPSVILLE[MSK-VPSVILLE<br/>msk.vpsville.rt.shx.su]
|
||||
BGP[BGP Routes<br/>12,000 маршрутов]
|
||||
OSPF[OSPF Instance<br/>redistribute=bgp]
|
||||
BFD_SWE[BFD → SWE]
|
||||
BFD_FIN[BFD → FIN]
|
||||
end
|
||||
|
||||
subgraph "Швеция"
|
||||
SWE[SWE-HIPHOST<br/>swe.hiphost.rt.shx.su]
|
||||
end
|
||||
|
||||
subgraph "Финляндия"
|
||||
FIN[FIN-HIPHOST<br/>fin.hiphost.rt.shx.su]
|
||||
end
|
||||
|
||||
%% BGP и OSPF
|
||||
BGP -. "12,000 routes" .- OSPF
|
||||
OSPF -. "OSPF routes" .- HOME
|
||||
|
||||
%% BFD мониторинг
|
||||
IHOR -. "BFD monitoring" .- SWE
|
||||
IHOR -. "BFD monitoring" .- FIN
|
||||
|
||||
%% Маршрутизация
|
||||
HOME -. "Routing rules" .- RT
|
||||
RT -. "OSPF routes" .- HOME
|
||||
|
||||
style HOME fill:#e1f5fe
|
||||
style IHOR fill:#ff9800
|
||||
style VPSVILLE fill:#ff9800
|
||||
style SWE fill:#4caf50
|
||||
style FIN fill:#ff5722
|
||||
style BGP fill:#9c27b0
|
||||
style OSPF fill:#9c27b0
|
||||
```
|
||||
|
||||
## Проблема
|
||||
|
||||
У вас есть:
|
||||
- **OSPF работает на IHOR/VPSVILLE** где собираются BGP маршруты
|
||||
- **12,000 маршрутов** приходят через BGP на IHOR/VPSVILLE
|
||||
- **SWE-HIPHOST** - основной шлюз для BGP маршрутов
|
||||
- **FIN-HIPHOST** - резервный шлюз
|
||||
- При отвале SWE-HIPHOST нужно автоматически переключиться на FIN-HIPHOST
|
||||
|
||||
## Решение 1: Динамические маршруты с check-gateway на IHOR
|
||||
|
||||
### Настройка на MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# Настроить BFD для мониторинга шлюзов
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# Включить redistribute BGP в OSPF
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static,bgp
|
||||
|
||||
# Создать статические маршруты с failover для BGP маршрутов
|
||||
# Основной маршрут через SWE-HIPHOST
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
|
||||
# Резервный маршрут через FIN-HIPHOST
|
||||
add dst-address=0.0.0.0/0 gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
```
|
||||
|
||||
## Решение 2: Динамический OSPF cost на основе BFD
|
||||
|
||||
### Скрипт на IHOR для изменения OSPF cost:
|
||||
|
||||
```shell
|
||||
# Скрипт для динамического изменения OSPF cost на основе доступности шлюзов
|
||||
/system script
|
||||
add name=adjust-gateway-cost source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
|
||||
:local sweInterface [/routing ospf interface-template find where interfaces=gre-SWE-HIPHOST]
|
||||
:local finInterface [/routing ospf interface-template find where interfaces=gre-FIN-HIPHOST]
|
||||
|
||||
# Настроить cost для SWE-HIPHOST
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - низкий cost (основной маршрут)
|
||||
/routing ospf interface-template set $sweInterface cost=10
|
||||
:log info "SWE-HIPHOST is UP - cost=10 (primary)"
|
||||
} else={
|
||||
# SWE недоступен - высокий cost (резервный маршрут)
|
||||
/routing ospf interface-template set $sweInterface cost=1000
|
||||
:log info "SWE-HIPHOST is DOWN - cost=1000 (backup)"
|
||||
}
|
||||
|
||||
# Настроить cost для FIN-HIPHOST
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - FIN как резервный
|
||||
/routing ospf interface-template set $finInterface cost=100
|
||||
:log info "FIN-HIPHOST is UP - cost=100 (backup)"
|
||||
} else={
|
||||
# SWE недоступен - FIN как основной
|
||||
/routing ospf interface-template set $finInterface cost=10
|
||||
:log info "FIN-HIPHOST is UP - cost=10 (primary)"
|
||||
}
|
||||
} else={
|
||||
# FIN недоступен - высокий cost
|
||||
/routing ospf interface-template set $finInterface cost=1000
|
||||
:log info "FIN-HIPHOST is DOWN - cost=1000"
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 5 секунд
|
||||
/system scheduler
|
||||
add name=adjust-gateway-cost interval=5s on-event=adjust-gateway-cost
|
||||
```
|
||||
|
||||
## Решение 3: Условный redistribute на основе BFD
|
||||
|
||||
### Скрипт на IHOR для условного включения/отключения redistribute BGP
|
||||
/system script
|
||||
add name=conditional-bgp-redistribute source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
# SWE доступен - включить redistribute BGP (основной)
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static,bgp
|
||||
:log info "SWE-HIPHOST is UP - BGP redistribute enabled (primary)"
|
||||
} else={
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
# SWE недоступен, но FIN доступен - включить redistribute BGP (резервный)
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static,bgp
|
||||
:log info "SWE-HIPHOST is DOWN, FIN-HIPHOST is UP - BGP redistribute enabled (backup)"
|
||||
} else={
|
||||
# Оба недоступны - отключить redistribute BGP
|
||||
/routing ospf instance set [find default=yes] redistribute=connected,static
|
||||
:log info "Both gateways are DOWN - BGP redistribute disabled"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=conditional-bgp-redistribute interval=10s on-event=conditional-bgp-redistribute
|
||||
```
|
||||
|
||||
## Решение 4: Динамические статические маршруты
|
||||
|
||||
### Скрипт на IHOR для управления статическими маршрутами:
|
||||
|
||||
```shell
|
||||
# Скрипт для динамического управления статическими маршрутами
|
||||
/system script
|
||||
add name=manage-gateway-routes source={
|
||||
:local sweStatus [/routing bfd print where interface=gre-SWE-HIPHOST]
|
||||
:local finStatus [/routing bfd print where interface=gre-FIN-HIPHOST]
|
||||
|
||||
:local sweRoute [/ip route print count-only where gateway=swe-hiphost and dst-address=0.0.0.0/0]
|
||||
:local finRoute [/ip route print count-only where gateway=fin-hiphost and dst-address=0.0.0.0/0]
|
||||
|
||||
# Управление маршрутом через SWE
|
||||
:if ([:len $sweStatus] > 0) do={
|
||||
:if ($sweRoute = 0) do={
|
||||
# SWE доступен, но маршрута нет - создать
|
||||
/ip route add dst-address=0.0.0.0/0 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
:log info "Added route via SWE-HIPHOST"
|
||||
}
|
||||
} else={
|
||||
:if ($sweRoute > 0) do={
|
||||
# SWE недоступен, но маршрут есть - удалить
|
||||
/ip route remove [find where gateway=swe-hiphost and dst-address=0.0.0.0/0]
|
||||
:log info "Removed route via SWE-HIPHOST"
|
||||
}
|
||||
}
|
||||
|
||||
# Управление маршрутом через FIN
|
||||
:if ([:len $finStatus] > 0) do={
|
||||
:if ($finRoute = 0) do={
|
||||
# FIN доступен, но маршрута нет - создать
|
||||
/ip route add dst-address=0.0.0.0/0 gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
:log info "Added route via FIN-HIPHOST"
|
||||
}
|
||||
} else={
|
||||
:if ($finRoute > 0) do={
|
||||
# FIN недоступен, но маршрут есть - удалить
|
||||
/ip route remove [find where gateway=fin-hiphost and dst-address=0.0.0.0/0]
|
||||
:log info "Removed route via FIN-HIPHOST"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Запускать каждые 10 секунд
|
||||
/system scheduler
|
||||
add name=manage-gateway-routes interval=10s on-event=manage-gateway-routes
|
||||
```
|
||||
|
||||
## Настройка на HOME (home.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# Создать routing table для BGP маршрутов
|
||||
/routing table
|
||||
add name=BGP-Routes fib
|
||||
|
||||
# Routing rule для всех BGP маршрутов
|
||||
/routing rule
|
||||
add dst-address=0.0.0.0/0 action=lookup table=BGP-Routes
|
||||
|
||||
# OSPF интерфейсы к IHOR
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-MSK-IHOR-RTK cost=10 area=backbone
|
||||
add interfaces=gre-MSK-IHOR-MTS cost=100 area=backbone
|
||||
```
|
||||
|
||||
## Настройка на SWE-HIPHOST (swe.hiphost.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# BFD для мониторинга от IHOR
|
||||
/routing bfd
|
||||
add interface=gre-IHOR-SWE interval=100ms multiplier=3
|
||||
|
||||
# OSPF интерфейс
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-IHOR-SWE cost=10 area=backbone
|
||||
```
|
||||
|
||||
## Настройка на FIN-HIPHOST (fin.hiphost.rt.shx.su):
|
||||
|
||||
```shell
|
||||
# BFD для мониторинга от IHOR
|
||||
/routing bfd
|
||||
add interface=gre-IHOR-FIN interval=100ms multiplier=3
|
||||
|
||||
# OSPF интерфейс (резервный)
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-IHOR-FIN cost=100 area=backbone
|
||||
```
|
||||
|
||||
## Проверка настройки
|
||||
|
||||
### На IHOR:
|
||||
```shell
|
||||
# Проверить BFD статус
|
||||
/routing bfd print
|
||||
|
||||
# Проверить статические маршруты
|
||||
/ip route print where dst-address=0.0.0.0/0
|
||||
|
||||
# Проверить OSPF redistribute
|
||||
/routing ospf instance print
|
||||
|
||||
# Проверить BGP маршруты
|
||||
/routing bgp route print count-only where active=yes
|
||||
```
|
||||
|
||||
### На HOME:
|
||||
```shell
|
||||
# Проверить OSPF маршруты
|
||||
/routing ospf route print
|
||||
|
||||
# Проверить routing table BGP-Routes
|
||||
/ip route print where routing-table=BGP-Routes
|
||||
```
|
||||
|
||||
## Тестирование failover
|
||||
|
||||
### Тест 1: Отключение SWE-HIPHOST:
|
||||
```shell
|
||||
# На IHOR отключить GRE туннель к SWE
|
||||
/interface gre disable [find where name=gre-SWE-HIPHOST]
|
||||
|
||||
# Подождать 10-30 секунд и проверить маршруты
|
||||
/ip route print where dst-address=0.0.0.0/0
|
||||
|
||||
# Проверить OSPF маршруты на HOME
|
||||
/routing ospf route print
|
||||
```
|
||||
|
||||
### Тест 2: Проверка BGP маршрутов:
|
||||
```shell
|
||||
# Проверить что BGP маршруты продолжают работать через FIN
|
||||
/routing bgp route print count-only where active=yes
|
||||
|
||||
# Проверить что OSPF анонсирует маршруты
|
||||
/routing ospf route print count-only
|
||||
```
|
||||
|
||||
## Мониторинг
|
||||
|
||||
### Создание дашборда на IHOR:
|
||||
```shell
|
||||
# Скрипт для отображения статуса
|
||||
/system script
|
||||
add name=show-ihor-status source={
|
||||
:log info "=== IHOR Gateway Status ==="
|
||||
:log info "BFD Status:"
|
||||
/routing bfd print
|
||||
:log info "Gateway Routes:"
|
||||
/ip route print where dst-address=0.0.0.0/0
|
||||
:log info "BGP Routes Count:"
|
||||
:log info [/routing bgp route print count-only where active=yes]
|
||||
:log info "OSPF Routes Count:"
|
||||
:log info [/routing ospf route print count-only]
|
||||
:log info "=== End Report ==="
|
||||
}
|
||||
|
||||
# Запускать каждую минуту
|
||||
/system scheduler
|
||||
add name=ihor-status interval=1m on-event=show-ihor-status
|
||||
```
|
||||
|
||||
## Полная конфигурация для копирования
|
||||
|
||||
### MSK-IHOR (msk.ihor.rt.shx.su):
|
||||
```shell
|
||||
# BFD для мониторинга шлюзов
|
||||
/routing bfd
|
||||
add interface=gre-SWE-HIPHOST interval=100ms multiplier=3
|
||||
add interface=gre-FIN-HIPHOST interval=100ms multiplier=3
|
||||
|
||||
# OSPF redistribute
|
||||
/routing ospf instance
|
||||
set [ find default=yes ] redistribute=connected,static,bgp
|
||||
|
||||
# Статические маршруты с failover
|
||||
/ip route
|
||||
add dst-address=0.0.0.0/0 gateway=swe-hiphost distance=1 check-gateway=bfd
|
||||
add dst-address=0.0.0.0/0 gateway=fin-hiphost distance=2 check-gateway=bfd
|
||||
|
||||
# OSPF интерфейсы
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-SWE-HIPHOST cost=10 area=backbone
|
||||
add interfaces=gre-FIN-HIPHOST cost=100 area=backbone
|
||||
|
||||
# Логирование
|
||||
/system logging
|
||||
add topics=ospf
|
||||
add topics=bfd
|
||||
add topics=bgp
|
||||
```
|
||||
|
||||
### HOME (home.rt.shx.su):
|
||||
```shell
|
||||
# Routing table для BGP маршрутов
|
||||
/routing table
|
||||
add name=BGP-Routes fib
|
||||
|
||||
# Routing rule для всех BGP маршрутов
|
||||
/routing rule
|
||||
add dst-address=0.0.0.0/0 action=lookup table=BGP-Routes
|
||||
|
||||
# OSPF интерфейсы к IHOR
|
||||
/routing ospf interface-template
|
||||
add interfaces=gre-MSK-IHOR-RTK cost=10 area=backbone
|
||||
add interfaces=gre-MSK-IHOR-MTS cost=100 area=backbone
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
Теперь правильно! Решение обеспечивает:
|
||||
|
||||
1. **OSPF работает на IHOR** где собираются BGP маршруты
|
||||
2. **Автоматический failover** между SWE-HIPHOST и FIN-HIPHOST
|
||||
3. **Быстрое обнаружение проблем** через BFD (100ms интервал)
|
||||
4. **Динамическое управление маршрутами** на основе доступности шлюзов
|
||||
5. **Автоматическое распространение** всех 12,000 BGP маршрутов через OSPF
|
||||
|
||||
При отвале SWE-HIPHOST IHOR автоматически переключится на FIN-HIPHOST, и все BGP маршруты продолжат работать через резервный шлюз!
|
||||
@@ -0,0 +1,416 @@
|
||||
## QoS на MikroTik RouterOS 7.14+ для Multi-WAN (3 провайдера) + CRS (DHCP)
|
||||
|
||||
Этот гайд описывает настройку QoS на маршрутизаторе MikroTik RouterOS 7.14+ при наличии трёх WAN-провайдеров (Multi-WAN). За роутером установлен CRS на RouterOS 7.14, который выступает DHCP-сервером для LAN. Конфигурация учитывает приоритизацию (VoIP/интерактив/обычный/bulk), справедливость между клиентами, и совместимость с PCC/ECMP балансировкой.
|
||||
|
||||
Важно: команды ниже предназначены для RouterOS CLI.
|
||||
|
||||
### Предпосылки и схема
|
||||
- Маршрутизатор MikroTik, RouterOS 7.14+
|
||||
- Три провайдера: `wan1`, `wan2`, `wan3` (например, `ether1`, `ether2`, `ether3`)
|
||||
- LAN за роутером: `bridge` (к CRS подключён аплинк, CRS — DHCP-сервер)
|
||||
- На CRS: DHCP для VLAN/LAN, желательно «trust DSCP» для сохранения приоритетов, если применимо
|
||||
|
||||
### Параметры для заполнения перед применением
|
||||
- Скорости провайдеров (чистые, после NAT/оверхеда):
|
||||
- `ISP1_UP`/`ISP1_DOWN`
|
||||
- `ISP2_UP`/`ISP2_DOWN`
|
||||
- `ISP3_UP`/`ISP3_DOWN`
|
||||
- Карта интерфейсов:
|
||||
- `wan1_if` = `ether1` (пример)
|
||||
- `wan2_if` = `ether2`
|
||||
- `wan3_if` = `ether3`
|
||||
- `lan_if` = `bridge`
|
||||
- Тип балансировки (PCC/ECMP/Policy routing) и есть ли уже `mangle`/марки маршрутизации
|
||||
- Список приоритетного трафика (VoIP/видеоконфы/игры/работа) и используемые порты/приложения
|
||||
|
||||
### Важные замечания
|
||||
- Для корректной работы QoS отключите FastTrack (или исключите из FastTrack трафик, который должен управляться QoS)
|
||||
- Очереди следует вешать на каждый WAN-интерфейс отдельно для upload и корректно обрабатывать download
|
||||
- В RouterOS 7.14 доступен `fq-codel` и PCQ. Если у вас есть `CAKE`, используйте его — он обеспечивает лучшую управляемость буферов. В примере есть ветка и для CAKE, и для fq_codel/PCQ
|
||||
|
||||
---
|
||||
|
||||
### 1) Отключение FastTrack для трафика под QoS
|
||||
Если FastTrack включён — отключите его целиком, либо исключите трафик, который должен QoS’иться. Проще и надёжнее — временно отключить целиком:
|
||||
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
set [find where chain=forward and action=fasttrack-connection] disabled=yes
|
||||
```
|
||||
|
||||
Альтернатива: добавить правило перед FastTrack, чтобы не fasttrack’ить приоритетные DSCP/маркеры (не рекомендуется как «первая настройка», сложнее отлаживать).
|
||||
|
||||
---
|
||||
|
||||
### 2) Проверка наличия CAKE и создание типов очередей
|
||||
|
||||
Проверка наличия CAKE:
|
||||
```rsc
|
||||
/queue type print where kind=cake
|
||||
```
|
||||
Если вывод пуст — используем `fq-codel`/PCQ (см. следующий подраздел). Если CAKE доступен, создаём типы:
|
||||
|
||||
```rsc
|
||||
# Пример: CAKE с diffserv4, учёт NAT и типичные задержки для WAN
|
||||
/queue type
|
||||
add name=cake-diffserv4 kind=cake cake-diffserv=diffserv4 cake-nat=yes cake-rtt=20ms
|
||||
```
|
||||
|
||||
Если CAKE недоступен — создаём `fq-codel` и PCQ типы:
|
||||
|
||||
```rsc
|
||||
/queue type
|
||||
add name=fqcodel kind=fq-codel target=5ms interval=100ms limit=1000 quantum=1514
|
||||
add name=pcq-upload kind=pcq pcq-classifier=src-address pcq-rate=0
|
||||
add name=pcq-download kind=pcq pcq-classifier=dst-address pcq-rate=0
|
||||
```
|
||||
|
||||
Примечание: `pcq-rate=0` означает «поделиться всей доступной полосой» между активными потоками.
|
||||
|
||||
---
|
||||
|
||||
### 3) Mangle: марки направлений и классов трафика
|
||||
|
||||
Цель: получить марки пакетов per-WAN и per-class. Для упрощения определим 4 класса: `voip`, `interactive`, `default`, `bulk`.
|
||||
|
||||
Марки направлений по интерфейсу (upload/download на каждом WAN):
|
||||
|
||||
```rsc
|
||||
/ip firewall mangle
|
||||
# Upload per-WAN (postrouting / out-interface)
|
||||
add chain=postrouting out-interface=<wan1_if> action=mark-packet new-packet-mark=pm_w1_up passthrough=no
|
||||
add chain=postrouting out-interface=<wan2_if> action=mark-packet new-packet-mark=pm_w2_up passthrough=no
|
||||
add chain=postrouting out-interface=<wan3_if> action=mark-packet new-packet-mark=pm_w3_up passthrough=no
|
||||
|
||||
# Download per-WAN (prerouting / in-interface)
|
||||
add chain=prerouting in-interface=<wan1_if> action=mark-packet new-packet-mark=pm_w1_down passthrough=no
|
||||
add chain=prerouting in-interface=<wan2_if> action=mark-packet new-packet-mark=pm_w2_down passthrough=no
|
||||
add chain=prerouting in-interface=<wan3_if> action=mark-packet new-packet-mark=pm_w3_down passthrough=no
|
||||
```
|
||||
|
||||
Классификация по приоритетам (используем DSCP и/или порты). Примерные правила:
|
||||
|
||||
```rsc
|
||||
# VoIP: DSCP EF/AF41 + SIP/RTP порты (примерные диапазоны, уточните под вашу телефонию)
|
||||
add chain=prerouting dscp=46 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting dscp=34 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting protocol=udp port=5060,5061 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting protocol=udp port=10000-20000 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
|
||||
# Interactive: SSH/RDP/видеоконференции (пример, при необходимости расширить)
|
||||
add chain=prerouting protocol=tcp port=22,3389 action=mark-packet new-packet-mark=pm_class_interactive passthrough=yes
|
||||
add chain=prerouting protocol=udp port=3478-3481 action=mark-packet new-packet-mark=pm_class_interactive passthrough=yes
|
||||
|
||||
# Bulk: торренты/бэкапы (примерные порты/DSCP)
|
||||
add chain=prerouting dscp=8 action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
add chain=prerouting protocol=tcp port=6881-6999 action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
|
||||
# Всё остальное — default (назначим позже через «fall-through» в очередях)
|
||||
```
|
||||
|
||||
Примечание: Мы установили отдельные метки для «направления» и «класса». В Queue Tree будем использовать перехват по комбинации через отдельные дочерние правила.
|
||||
|
||||
---
|
||||
|
||||
### 4) Queue Tree: корневые очереди на каждый WAN + дочерние классы
|
||||
|
||||
Создадим по корневой очереди для upload и download на каждом WAN. Затем — дочерние для классов. Параметры скоростей подставьте из ваших `ISP*_UP/DOWN`.
|
||||
|
||||
Вариант A: если доступен CAKE (рекомендуется):
|
||||
|
||||
```rsc
|
||||
# WAN1 Upload
|
||||
/queue tree
|
||||
add name=qt_w1_up parent=<wan1_if> packet-mark=pm_w1_up queue=cake-diffserv4 max-limit=<ISP1_UP>
|
||||
add name=qt_w1_up_voip parent=qt_w1_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w1_up_interactive parent=qt_w1_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w1_up_bulk parent=qt_w1_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
# WAN1 Download (вешаем на LAN или на WAN в режиме ingress; если ingress недоступен — см. примечание ниже)
|
||||
add name=qt_w1_down parent=<lan_if> packet-mark=pm_w1_down queue=cake-diffserv4 max-limit=<ISP1_DOWN>
|
||||
add name=qt_w1_down_voip parent=qt_w1_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w1_down_interactive parent=qt_w1_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w1_down_bulk parent=qt_w1_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
# Аналогично для WAN2/WAN3 (подставьте свои скорости)
|
||||
add name=qt_w2_up parent=<wan2_if> packet-mark=pm_w2_up queue=cake-diffserv4 max-limit=<ISP2_UP>
|
||||
add name=qt_w2_up_voip parent=qt_w2_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w2_up_interactive parent=qt_w2_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w2_up_bulk parent=qt_w2_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w2_down parent=<lan_if> packet-mark=pm_w2_down queue=cake-diffserv4 max-limit=<ISP2_DOWN>
|
||||
add name=qt_w2_down_voip parent=qt_w2_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w2_down_interactive parent=qt_w2_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w2_down_bulk parent=qt_w2_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w3_up parent=<wan3_if> packet-mark=pm_w3_up queue=cake-diffserv4 max-limit=<ISP3_UP>
|
||||
add name=qt_w3_up_voip parent=qt_w3_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w3_up_interactive parent=qt_w3_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w3_up_bulk parent=qt_w3_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w3_down parent=<lan_if> packet-mark=pm_w3_down queue=cake-diffserv4 max-limit=<ISP3_DOWN>
|
||||
add name=qt_w3_down_voip parent=qt_w3_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w3_down_interactive parent=qt_w3_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w3_down_bulk parent=qt_w3_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
```
|
||||
|
||||
Вариант B: если CAKE нет — используем `fq-codel` (корень) + PCQ (дети) или `fq-codel` везде:
|
||||
|
||||
```rsc
|
||||
# WAN1 Upload (fq-codel как корневой), дочерние классы
|
||||
/queue tree
|
||||
add name=qt_w1_up parent=<wan1_if> packet-mark=pm_w1_up queue=fqcodel max-limit=<ISP1_UP>
|
||||
add name=qt_w1_up_voip parent=qt_w1_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w1_up_interactive parent=qt_w1_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w1_up_bulk parent=qt_w1_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
# WAN1 Download — вешаем на LAN (см. примечание)
|
||||
add name=qt_w1_down parent=<lan_if> packet-mark=pm_w1_down queue=fqcodel max-limit=<ISP1_DOWN>
|
||||
add name=qt_w1_down_voip parent=qt_w1_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w1_down_interactive parent=qt_w1_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w1_down_bulk parent=qt_w1_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
# Аналогично WAN2/WAN3 (подставьте свои скорости)
|
||||
add name=qt_w2_up parent=<wan2_if> packet-mark=pm_w2_up queue=fqcodel max-limit=<ISP2_UP>
|
||||
add name=qt_w2_up_voip parent=qt_w2_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w2_up_interactive parent=qt_w2_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w2_up_bulk parent=qt_w2_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w2_down parent=<lan_if> packet-mark=pm_w2_down queue=fqcodel max-limit=<ISP2_DOWN>
|
||||
add name=qt_w2_down_voip parent=qt_w2_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w2_down_interactive parent=qt_w2_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w2_down_bulk parent=qt_w2_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w3_up parent=<wan3_if> packet-mark=pm_w3_up queue=fqcodel max-limit=<ISP3_UP>
|
||||
add name=qt_w3_up_voip parent=qt_w3_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w3_up_interactive parent=qt_w3_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w3_up_bulk parent=qt_w3_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w3_down parent=<lan_if> packet-mark=pm_w3_down queue=fqcodel max-limit=<ISP3_DOWN>
|
||||
add name=qt_w3_down_voip parent=qt_w3_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w3_down_interactive parent=qt_w3_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w3_down_bulk parent=qt_w3_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
```
|
||||
|
||||
Примечание по download: при отсутствии родителя «ingress на WAN» типичная практика — вешать «download-очереди» на `bridge` (LAN). Это позволяет ограничивать входящий трафик перед выдачей в LAN. Если вы используете VLAN на CRS, укажите `parent` соответствующего интерфейса/bridge, где трафик покидает маршрутизатор в сторону CRS.
|
||||
|
||||
---
|
||||
|
||||
### 5) Справедливость между клиентами (per-host fairness)
|
||||
Если нужна справедливость между клиентами, добавьте дочерние PCQ-очереди под каждую категорию вместо `fqcodel`/`cake` на детях. Пример для WAN1 upload:
|
||||
|
||||
```rsc
|
||||
/queue tree
|
||||
set [find where name=qt_w1_up_default] queue=pcq-upload
|
||||
```
|
||||
|
||||
Или создайте явные дочерние очереди с `queue=pcq-upload/pcq-download` и без `packet-mark`, чтобы PCQ делил полосу между IP-адресами внутри класса.
|
||||
|
||||
---
|
||||
|
||||
### 6) Сохранение DSCP/CoS на CRS
|
||||
На CRS, если используется `bridge` с VLAN, включите доверие DSCP/PCP и при необходимости настройте маппинг DSCP→PCP:
|
||||
|
||||
```rsc
|
||||
/interface bridge settings set use-ip-firewall=yes ;# при необходимости классифицировать на L3
|
||||
/interface bridge vlan set [find] ingress-filtering=yes ;# если используется VLAN filtering
|
||||
# Проверьте и настройте trust-dscp/pcp на нужных интерфейсах (CRS модели отличаются по возможностям)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7) Проверка
|
||||
- Откройте WinBox → Queues → Queue Tree и наблюдайте загрузку классов
|
||||
- Проверьте, что FastTrack не перехватывает ваш трафик
|
||||
- Тестируйте VoIP/видео и фоновые загрузки одновременно; `voip` и `interactive` должны иметь минимальную задержку/джиттер
|
||||
|
||||
---
|
||||
|
||||
### Что нужно уточнить, чтобы я выдал финальную, готовую подставить конфигурацию
|
||||
1) Как называются реальные интерфейсы: `wan1_if`, `wan2_if`, `wan3_if`, `lan_if`?
|
||||
2) Точные скорости (up/down) по каждому провайдеру и есть ли асимметрия?
|
||||
3) Какая балансировка используется сейчас (PCC/ECMP/Policy routing) и включён ли FastTrack?
|
||||
4) Какие именно сервисы/приложения нужно приоритизировать (VoIP-провайдер, видеоконфы: Zoom/Teams/Meet, игры — список)?
|
||||
5) Есть ли VLAN в LAN и на каком интерфейсе/bridge у маршрутизатора трафик уходит на CRS?
|
||||
6) Нужна ли per-user fairness (деление полосы поровну между клиентами внутри класса)?
|
||||
|
||||
После ответа на вопросы я подставлю значения и дам точный блок CLI-команд без плейсхолдеров.
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Готовая конфигурация под ваши параметры (RB5009 + CRS, 3×WAN)
|
||||
|
||||
- Интерфейсы:
|
||||
- `wan1_if = ether7` (1G/1G)
|
||||
- `wan2_if = ether1` (600M/600M)
|
||||
- `wan3_if = RTK-Internet` (PPPoE, 520M/520M, самые низкие пинги)
|
||||
- `lan_if = sfp-sfpplus1` (аплинк к CRS)
|
||||
|
||||
- Рекомендация по лимитам: выставить 90–95% от «чистой» скорости для борьбы с буферблоутом. Ниже приведены «бережные» значения, их можно подкорректировать после тестов:
|
||||
- WAN1: 950M up / 950M down
|
||||
- WAN2: 580M up / 580M down
|
||||
- WAN3: 500M up / 500M down
|
||||
|
||||
### 0) Отключение FastTrack
|
||||
```rsc
|
||||
/ip firewall filter
|
||||
set [find where chain=forward and action=fasttrack-connection] disabled=yes
|
||||
```
|
||||
|
||||
### 1) Типы очередей: сначала пробуем CAKE, иначе fq_codel/PCQ
|
||||
```rsc
|
||||
/queue type
|
||||
add name=cake-diffserv4 kind=cake cake-diffserv=diffserv4 cake-nat=yes cake-rtt=20ms
|
||||
|
||||
# Fallback, если CAKE недоступен
|
||||
add name=fqcodel kind=fq-codel target=5ms interval=100ms limit=1000 quantum=1514
|
||||
add name=pcq-upload kind=pcq pcq-classifier=src-address pcq-rate=0
|
||||
add name=pcq-download kind=pcq pcq-classifier=dst-address pcq-rate=0
|
||||
```
|
||||
|
||||
### 2) Mangle: марки направлений (per-WAN) и классов
|
||||
Только `packet-mark` — не трогаем ваши `connection-mark`/policy routing.
|
||||
|
||||
```rsc
|
||||
/ip firewall mangle
|
||||
# Направления per-WAN
|
||||
add chain=postrouting out-interface=ether7 action=mark-packet new-packet-mark=pm_w1_up passthrough=no
|
||||
add chain=postrouting out-interface=ether1 action=mark-packet new-packet-mark=pm_w2_up passthrough=no
|
||||
add chain=postrouting out-interface=RTK-Internet action=mark-packet new-packet-mark=pm_w3_up passthrough=no
|
||||
|
||||
add chain=prerouting in-interface=ether7 action=mark-packet new-packet-mark=pm_w1_down passthrough=no
|
||||
add chain=prerouting in-interface=ether1 action=mark-packet new-packet-mark=pm_w2_down passthrough=no
|
||||
add chain=prerouting in-interface=RTK-Internet action=mark-packet new-packet-mark=pm_w3_down passthrough=no
|
||||
|
||||
# Классы
|
||||
# VoIP/TrueConf: приоритизируем; матчим DSCP EF/AF41, STUN/TURN и домены TrueConf (если используется облако)
|
||||
add chain=prerouting dscp=46 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting dscp=34 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting protocol=udp port=3478-3481 action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting protocol=tcp tls-host=*.trueconf.net action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
add chain=prerouting protocol=tcp tls-host=*.trueconf.com action=mark-packet new-packet-mark=pm_class_voip passthrough=yes
|
||||
|
||||
# Interactive (SSH/RDP и пр.) — средний приоритет
|
||||
add chain=prerouting protocol=tcp port=22,3389 action=mark-packet new-packet-mark=pm_class_interactive passthrough=yes
|
||||
|
||||
# Steam загрузки — bulk (контент CDN и портовые диапазоны Steam)
|
||||
add chain=prerouting protocol=tcp tls-host=*.steamcontent.com action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
add chain=prerouting protocol=tcp tls-host=*.steamservercontent.com action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
add chain=prerouting protocol=tcp port=27014-27050 action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
|
||||
# Торренты — bulk (классический диапазон + опционально p2p=bittorrent)
|
||||
add chain=prerouting protocol=tcp port=6881-6999 action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
add chain=prerouting protocol=udp port=6881-6999 action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
# Опционально (может давать ложные срабатывания и нагрузку):
|
||||
# add chain=prerouting p2p=bittorrent action=mark-packet new-packet-mark=pm_class_bulk passthrough=yes
|
||||
|
||||
# YouTube: не понижаем (оставляем default). Можно матчингово наблюдать:
|
||||
add chain=prerouting protocol=tcp tls-host=*.googlevideo.com action=mark-packet new-packet-mark=pm_class_default passthrough=yes
|
||||
```
|
||||
|
||||
Примечания:
|
||||
- `tls-host` не работает для QUIC (UDP/443). Для стабильной классификации YouTube можно временно отключать QUIC в браузере или не менять приоритет YouTube (как в примере).
|
||||
- Если TrueConf — on‑prem с нестандартными портами, подставьте их вместо доменов.
|
||||
|
||||
### 3) Queue Tree: корни per‑WAN и дочерние классы
|
||||
|
||||
Вариант A (CAKE доступен):
|
||||
```rsc
|
||||
/queue tree
|
||||
# WAN1 (ether7)
|
||||
add name=qt_w1_up parent=ether7 packet-mark=pm_w1_up queue=cake-diffserv4 max-limit=950M
|
||||
add name=qt_w1_up_voip parent=qt_w1_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w1_up_interactive parent=qt_w1_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w1_up_bulk parent=qt_w1_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w1_down parent=sfp-sfpplus1 packet-mark=pm_w1_down queue=cake-diffserv4 max-limit=950M
|
||||
add name=qt_w1_down_voip parent=qt_w1_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w1_down_interactive parent=qt_w1_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w1_down_bulk parent=qt_w1_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
# WAN2 (ether1)
|
||||
add name=qt_w2_up parent=ether1 packet-mark=pm_w2_up queue=cake-diffserv4 max-limit=580M
|
||||
add name=qt_w2_up_voip parent=qt_w2_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w2_up_interactive parent=qt_w2_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w2_up_bulk parent=qt_w2_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w2_down parent=sfp-sfpplus1 packet-mark=pm_w2_down queue=cake-diffserv4 max-limit=580M
|
||||
add name=qt_w2_down_voip parent=qt_w2_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w2_down_interactive parent=qt_w2_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w2_down_bulk parent=qt_w2_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
# WAN3 (RTK-Internet PPPoE)
|
||||
add name=qt_w3_up parent=RTK-Internet packet-mark=pm_w3_up queue=cake-diffserv4 max-limit=500M
|
||||
add name=qt_w3_up_voip parent=qt_w3_up packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w3_up_interactive parent=qt_w3_up packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w3_up_bulk parent=qt_w3_up packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
|
||||
add name=qt_w3_down parent=sfp-sfpplus1 packet-mark=pm_w3_down queue=cake-diffserv4 max-limit=500M
|
||||
add name=qt_w3_down_voip parent=qt_w3_down packet-mark=pm_class_voip priority=1 queue=cake-diffserv4
|
||||
add name=qt_w3_down_interactive parent=qt_w3_down packet-mark=pm_class_interactive priority=2 queue=cake-diffserv4
|
||||
add name=qt_w3_down_bulk parent=qt_w3_down packet-mark=pm_class_bulk priority=8 queue=cake-diffserv4
|
||||
```
|
||||
|
||||
Вариант B (fallback: fq_codel/PCQ):
|
||||
```rsc
|
||||
/queue tree
|
||||
# WAN1 (ether7)
|
||||
add name=qt_w1_up parent=ether7 packet-mark=pm_w1_up queue=fqcodel max-limit=950M
|
||||
add name=qt_w1_up_voip parent=qt_w1_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w1_up_interactive parent=qt_w1_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w1_up_bulk parent=qt_w1_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w1_down parent=sfp-sfpplus1 packet-mark=pm_w1_down queue=fqcodel max-limit=950M
|
||||
add name=qt_w1_down_voip parent=qt_w1_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w1_down_interactive parent=qt_w1_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w1_down_bulk parent=qt_w1_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
# WAN2 (ether1)
|
||||
add name=qt_w2_up parent=ether1 packet-mark=pm_w2_up queue=fqcodel max-limit=580M
|
||||
add name=qt_w2_up_voip parent=qt_w2_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w2_up_interactive parent=qt_w2_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w2_up_bulk parent=qt_w2_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w2_down parent=sfp-sfpplus1 packet-mark=pm_w2_down queue=fqcodel max-limit=580M
|
||||
add name=qt_w2_down_voip parent=qt_w2_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w2_down_interactive parent=qt_w2_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w2_down_bulk parent=qt_w2_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
# WAN3 (RTK-Internet PPPoE)
|
||||
add name=qt_w3_up parent=RTK-Internet packet-mark=pm_w3_up queue=fqcodel max-limit=500M
|
||||
add name=qt_w3_up_voip parent=qt_w3_up packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w3_up_interactive parent=qt_w3_up packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w3_up_bulk parent=qt_w3_up packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
|
||||
add name=qt_w3_down parent=sfp-sfpplus1 packet-mark=pm_w3_down queue=fqcodel max-limit=500M
|
||||
add name=qt_w3_down_voip parent=qt_w3_down packet-mark=pm_class_voip priority=1 queue=fqcodel
|
||||
add name=qt_w3_down_interactive parent=qt_w3_down packet-mark=pm_class_interactive priority=2 queue=fqcodel
|
||||
add name=qt_w3_down_bulk parent=qt_w3_down packet-mark=pm_class_bulk priority=8 queue=fqcodel
|
||||
```
|
||||
|
||||
Опционально: справедливость per‑user. Замените дочерние очереди класса `default`/`bulk` на `pcq-upload`/`pcq-download`, чтобы делить полосу между IP‑адресами устройств.
|
||||
|
||||
### 4) (Опция) Отправлять TrueConf через самый «низкий пинг» WAN3
|
||||
Если хотите принудительно маршрутизировать TrueConf через `RTK-Internet`, добавьте метку маршрутизации для соответствующих соединений и policy routing в вашу таблицу `wan3`. Пример (адаптируйте к вашей схеме):
|
||||
|
||||
```rsc
|
||||
/ip firewall mangle
|
||||
add chain=prerouting protocol=tcp tls-host=*.trueconf.net action=mark-routing new-routing-mark=to_wan3 passthrough=yes
|
||||
add chain=prerouting protocol=tcp tls-host=*.trueconf.com action=mark-routing new-routing-mark=to_wan3 passthrough=yes
|
||||
add chain=prerouting protocol=udp port=3478-3481 action=mark-routing new-routing-mark=to_wan3 passthrough=yes
|
||||
|
||||
/ip route add dst-address=0.0.0.0/0 gateway=RTK-Internet routing-table=to_wan3 distance=1 check-gateway=ping
|
||||
```
|
||||
|
||||
Учтите: это вмешивается в ваш текущий policy routing. Добавляйте только если понимаете последствия в вашей схеме PCC/ECMP.
|
||||
|
||||
---
|
||||
|
||||
### Что такое PCQ и зачем он нужен (коротко)
|
||||
PCQ (Per Connection/Client Queue) — тип очереди, который автоматически делит доступную полосу между множеством «подочередей» (обычно по IP-адресам). В типовой схеме:
|
||||
- `pcq-upload` с `pcq-classifier=src-address` обеспечивает справедливость по исходящим IP клиентов (upload)
|
||||
- `pcq-download` с `pcq-classifier=dst-address` — по входящим IP клиентов (download)
|
||||
|
||||
Это предотвращает ситуацию, когда один пользователь/устройство забирает всю полосу в пределах класса (например, торренты или крупные загрузки Steam), сохраняя комфорт для остальных. В сочетании с приоритетами классов (VoIP/interactive/default/bulk) получается и приоритет, и справедливость.
|
||||
Reference in New Issue
Block a user