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)¶
- IP → Routes
- Додайте два 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