MikroTik: Резервування та балансування каналів

Коли у вас більше одного інтернет-провайдера — можна налаштувати автоматичне переключення при падінні основного каналу (failover) або розподіл навантаження між каналами (load balancing).

Що таке Failover і Load Balancing?

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   FAILOVER (Резервування)                                   │
│   ─────────────────────────                                 │
│                                                             │
│   ISP1 (основний) ──────► Працює? ──► ТАК ──► Використовуй │
│                               │                             │
│                               ▼ НІ                          │
│   ISP2 (резервний) ─────────────────────────► Використовуй │
│                                                             │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   LOAD BALANCING (Балансування)                             │
│   ─────────────────────────────                             │
│                                                             │
│   Трафік ────┬────► ISP1 (50%)                              │
│              │                                              │
│              └────► ISP2 (50%)                              │
│                                                             │
│   Обидва канали працюють одночасно                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Коли що використовувати:

Сценарій Рішення
Основний швидкий канал + повільний резерв Failover
Два однакових канали, хочу більше швидкості Load Balancing
Критичний сервіс, не можна втратити з'єднання Failover
Багато користувачів, треба розподілити Load Balancing + Failover

Початкова конфігурація

Припустимо у вас:

Параметр ISP1 (основний) ISP2 (резервний)
Інтерфейс ether1 ether2
IP роутера 192.168.1.2/24 10.0.0.2/24
Gateway 192.168.1.1 10.0.0.1
DNS 8.8.8.8 1.1.1.1

Спосіб 1: Простий Failover (Distance)

Найпростіший спосіб — різні значення distance для маршрутів.

Принцип

  • Менший distance = вищий пріоритет
  • Якщо gateway недоступний — маршрут деактивується
  • Автоматично переключається на наступний

GUI (WinBox)

  1. IPRoutes
  2. Додайте два default gateway:

Основний маршрут (ISP1):
| Поле | Значення |
|------|----------|
| Dst. Address | 0.0.0.0/0 |
| Gateway | 192.168.1.1 |
| Distance | 1 |
| Check Gateway | ping |

Резервний маршрут (ISP2):
| Поле | Значення |
|------|----------|
| Dst. Address | 0.0.0.0/0 |
| Gateway | 10.0.0.1 |
| Distance | 2 |
| Check Gateway | ping |

CLI

# Основний маршрут (distance=1)
/ip route add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 check-gateway=ping

# Резервний маршрут (distance=2)  
/ip route add dst-address=0.0.0.0/0 gateway=10.0.0.1 distance=2 check-gateway=ping

Як це працює

┌────────────────────────────────────────────────────┐
│ Routing Table                                      │
├────────────────────────────────────────────────────┤
│ Dst.Address    Gateway       Distance  Status      │
│ 0.0.0.0/0      192.168.1.1   1         ACTIVE ◄── │
│ 0.0.0.0/0      10.0.0.1      2         ready       │
└────────────────────────────────────────────────────┘

Коли ISP1 падає:

┌────────────────────────────────────────────────────┐
│ Routing Table                                      │
├────────────────────────────────────────────────────┤
│ 0.0.0.0/0      192.168.1.1   1         unreachable │
│ 0.0.0.0/0      10.0.0.1      2         ACTIVE ◄── │
└────────────────────────────────────────────────────┘

Проблема простого методу

check-gateway=ping перевіряє тільки доступність gateway. Але що якщо:
- Gateway відповідає на ping
- Але інтернету за ним немає?

Рішення: Netwatch або рекурсивні маршрути.


Спосіб 2: Failover з Netwatch (рекомендований)

Netwatch перевіряє доступність зовнішнього хоста (наприклад 8.8.8.8) і виконує скрипти при зміні статусу.

Принцип

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   Netwatch пінгує 8.8.8.8 через ISP1                        │
│                     │                                       │
│                     ▼                                       │
│   ┌─────────────────────────────────┐                       │
│   │ Відповідає?                     │                       │
│   └─────────────────────────────────┘                       │
│         │ ТАК              │ НІ                             │
│         ▼                  ▼                                │
│   ISP1 активний      Вимкнути ISP1                          │
│                      Увімкнути ISP2                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Крок 1: Створити маршрути до хостів перевірки

# Маршрут до 8.8.8.8 тільки через ISP1
/ip route add dst-address=8.8.8.8/32 gateway=192.168.1.1 scope=10

# Маршрут до 1.1.1.1 тільки через ISP2
/ip route add dst-address=1.1.1.1/32 gateway=10.0.0.1 scope=10

Крок 2: Створити основні маршрути з коментарями

# Основний маршрут (буде керуватися Netwatch)
/ip route add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 comment="ISP1-main"

# Резервний маршрут (вимкнений за замовчуванням)
/ip route add dst-address=0.0.0.0/0 gateway=10.0.0.1 distance=2 comment="ISP2-backup" disabled=yes

Крок 3: Налаштувати Netwatch

GUI: Tools → Netwatch → [+]

CLI:

/tool netwatch add \
    host=8.8.8.8 \
    interval=10s \
    timeout=2s \
    up-script=":log info \"ISP1 UP\"; /ip route enable [find comment=\"ISP1-main\"]; /ip route disable [find comment=\"ISP2-backup\"]" \
    down-script=":log info \"ISP1 DOWN\"; /ip route disable [find comment=\"ISP1-main\"]; /ip route enable [find comment=\"ISP2-backup\"]"

Крок 4: Перевірка

# Статус Netwatch
/tool netwatch print

# Логи
/log print where topics~"script"

Спосіб 3: Рекурсивні маршрути

Елегантний спосіб без скриптів — маршрут активний тільки коли доступний зовнішній хост.

Принцип

Звичайний маршрут:
  0.0.0.0/0 → gateway 192.168.1.1

Рекурсивний маршрут:
  0.0.0.0/0 → gateway 8.8.8.8 (віртуальний)
      └─► 8.8.8.8 → gateway 192.168.1.1 (реальний)

Якщо 8.8.8.8 недоступний через ISP1 — весь маршрут деактивується!

CLI

# Статичні маршрути до хостів перевірки
/ip route add dst-address=8.8.8.8/32 gateway=192.168.1.1 scope=10 target-scope=10
/ip route add dst-address=1.1.1.1/32 gateway=10.0.0.1 scope=10 target-scope=10

# Рекурсивні default маршрути
/ip route add dst-address=0.0.0.0/0 gateway=8.8.8.8 distance=1 check-gateway=ping target-scope=11
/ip route add dst-address=0.0.0.0/0 gateway=1.1.1.1 distance=2 check-gateway=ping target-scope=11

Пояснення scope

Параметр Призначення
scope "Видимість" маршруту для інших маршрутів
target-scope Максимальний scope gateway, який може використовуватись
scope=10, target-scope=10 → може знайти тільки directly connected
scope=10, target-scope=11 → може знайти маршрути з scope ≤ 11

Спосіб 4: Load Balancing (PCC)

PCC (Per Connection Classifier) — розподіляє з'єднання між каналами.

Принцип

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   Нове з'єднання ──► Hash(src+dst) ──► Залишок від ділення  │
│                                              │              │
│                           ┌──────────────────┴────────────┐ │
│                           │                               │ │
│                           ▼                               ▼ │
│                     Залишок = 0                   Залишок = 1│
│                           │                               │ │
│                           ▼                               ▼ │
│                        ISP1                            ISP2 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Mangle правила

# Маркування з'єднань
/ip firewall mangle

# Трафік для ISP1 (парні)
add chain=prerouting in-interface=bridge \
    dst-address-type=!local \
    per-connection-classifier=both-addresses:2/0 \
    action=mark-connection new-connection-mark=ISP1_conn passthrough=yes

# Трафік для ISP2 (непарні)
add chain=prerouting in-interface=bridge \
    dst-address-type=!local \
    per-connection-classifier=both-addresses:2/1 \
    action=mark-connection new-connection-mark=ISP2_conn passthrough=yes

# Маркування маршрутів
add chain=prerouting connection-mark=ISP1_conn action=mark-routing new-routing-mark=to_ISP1
add chain=prerouting connection-mark=ISP2_conn action=mark-routing new-routing-mark=to_ISP2

# Вихідний трафік з роутера
add chain=output connection-mark=ISP1_conn action=mark-routing new-routing-mark=to_ISP1
add chain=output connection-mark=ISP2_conn action=mark-routing new-routing-mark=to_ISP2

Маршрути з routing-mark

/ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.1 routing-mark=to_ISP1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=10.0.0.1 routing-mark=to_ISP2 check-gateway=ping

# Fallback маршрути (якщо один ISP впаде)
add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=10.0.0.1 distance=2 check-gateway=ping

NAT для обох ISP

/ip firewall nat
add chain=srcnat out-interface=ether1 action=masquerade
add chain=srcnat out-interface=ether2 action=masquerade

Спосіб 5: ECMP (Equal Cost Multi-Path)

Найпростіший load balancing — декілька gateway з однаковим distance.

CLI

/ip route add dst-address=0.0.0.0/0 gateway=192.168.1.1,10.0.0.1 check-gateway=ping

Особливості

  • RouterOS сам розподіляє трафік
  • Per-connection балансування (одне з'єднання = один gateway)
  • Якщо один gateway падає — весь трафік йде через інший

Повний скрипт: Failover + Netwatch

# ============================================
# НАЛАШТУВАННЯ (змініть під себе)
# ============================================
:local ISP1_GW "192.168.1.1"
:local ISP2_GW "10.0.0.1"
:local CHECK_HOST1 "8.8.8.8"
:local CHECK_HOST2 "1.1.1.1"

# ============================================
# МАРШРУТИ
# ============================================

# Маршрути для перевірки (прив'язані до конкретних ISP)
/ip route
add dst-address=$CHECK_HOST1 gateway=$ISP1_GW scope=10 comment="Check-ISP1"
add dst-address=$CHECK_HOST2 gateway=$ISP2_GW scope=10 comment="Check-ISP2"

# Рекурсивні default маршрути
add dst-address=0.0.0.0/0 gateway=$CHECK_HOST1 distance=1 target-scope=11 check-gateway=ping comment="WAN1-recursive"
add dst-address=0.0.0.0/0 gateway=$CHECK_HOST2 distance=2 target-scope=11 check-gateway=ping comment="WAN2-recursive"

# ============================================
# NAT
# ============================================
/ip firewall nat
add chain=srcnat out-interface=ether1 action=masquerade comment="NAT-ISP1"
add chain=srcnat out-interface=ether2 action=masquerade comment="NAT-ISP2"

# ============================================
# NETWATCH (опціонально, для логування)
# ============================================
/tool netwatch
add host=$CHECK_HOST1 interval=30s \
    up-script=":log warning \"ISP1 is UP\"" \
    down-script=":log error \"ISP1 is DOWN\""

add host=$CHECK_HOST2 interval=30s \
    up-script=":log warning \"ISP2 is UP\"" \
    down-script=":log error \"ISP2 is DOWN\""

Перевірка роботи

Тест failover

# Подивитись активні маршрути
/ip route print where active=yes

# Симулювати падіння ISP1
/ip route disable [find comment~"ISP1"]

# Перевірити що трафік пішов через ISP2
/tool traceroute 8.8.8.8

# Увімкнути назад
/ip route enable [find comment~"ISP1"]

Моніторинг

# Статус маршрутів
/ip route print detail where dst-address=0.0.0.0/0

# Netwatch статус
/tool netwatch print

# Логи переключень
/log print where message~"ISP"

Типові проблеми

Проблема: Не переключається автоматично

Причина: Gateway відповідає на ping, але інтернету немає

Рішення: Використовуйте рекурсивні маршрути або Netwatch з перевіркою зовнішнього хоста

Проблема: Деякі сайти не працюють при load balancing

Причина: Сесія розривається при зміні IP

Рішення: Використовуйте PCC (Per Connection Classifier) — одне з'єднання завжди йде через один канал

Проблема: DNS не працює при failover

Рішення: Налаштуйте DNS на обидва ISP:

/ip dns set servers=8.8.8.8,1.1.1.1

Див. також

Шлях: step-by-step/mikrotik-failover-loadbalancing.md

UMTC Wiki © 2026 | Ukrainian Military Tactical Communications