# Failover - Автоматическое переключение маршрутов

> Failover routing на VyOS - policy-based переключение маршрутов, health checks (ICMP, ARP, TCP) и мониторинг nexthop в облаке

Source: https://opennix.org/docs/vyos/routing/vyos-failover/


Failover routing в VyOS обеспечивает автоматическое переключение маршрутов на основе мониторинга доступности целевых хостов или сервисов, позволяя создавать отказоустойчивые сетевые решения без использования динамических протоколов маршрутизации.

## Обзор

Failover routing - это механизм автоматической маршрутизации, который добавляет или удаляет статические маршруты в таблицу маршрутизации ядра на основе результатов проверки доступности (health check) целевых адресов.

**Принцип работы**:
- Маршруты настраиваются вручную администратором
- Маршрут устанавливается в таблицу маршрутизации только если health-check target доступен
- При недоступности target маршрут автоматически удаляется
- При восстановлении доступности маршрут возвращается

**Отличия от других механизмов**:

| Механизм | Автоматизация | Скорость обнаружения | Сложность | Overhead |
|----------|---------------|----------------------|-----------|----------|
| Failover routes | Health checks | Средняя (секунды) | Низкая | Минимальный |
| BFD | Протокол мониторинга | Очень высокая (мс) | Средняя | Низкий |
| Динамические протоколы | Полная | Высокая | Высокая | Высокий |
| Static routes + distance | Нет | Нет | Низкая | Нет |

**Преимущества**:
- Простая настройка без динамических протоколов
- Автоматическое переключение при отказах
- Гибкие health check механизмы
- Поддержка различных типов проверок
- Минимальное потребление ресурсов
- Предсказуемое поведение

**Недостатки**:
- Медленнее чем BFD
- Требует настройки health check targets
- Не подходит для сложных топологий
- Ограниченная масштабируемость

## Основные концепции

### Failover Route

Failover маршрут состоит из:
- **Subnet** - сеть назначения
- **Next-hop** - следующий переход (gateway)
- **Target** - адрес для проверки доступности
- **Check type** - тип проверки (ICMP, ARP, TCP)
- **Check parameters** - параметры проверки

### Health Check

Механизм проверки доступности:
- Периодические проверки target адресов
- Различные типы проверок (ping, ARP, TCP port)
- Настраиваемые интервалы и таймауты
- Политики проверки (all-available, any-available)

### Route Installation

Логика установки маршрутов:
1. Health check выполняется с заданным интервалом
2. Если target доступен - маршрут устанавливается
3. Если target недоступен - маршрут удаляется
4. При восстановлении - маршрут возвращается

## Базовая конфигурация

### Простой failover маршрут

Минимальная конфигурация с ICMP health check:

```bash
configure

# Failover маршрут к сети 203.0.113.0/24
set protocols failover route 203.0.113.0/24 next-hop 192.0.2.1
set protocols failover route 203.0.113.0/24 next-hop 192.0.2.1 check target '192.0.2.1'
set protocols failover route 203.0.113.0/24 next-hop 192.0.2.1 check type 'icmp'
set protocols failover route 203.0.113.0/24 next-hop 192.0.2.1 interface 'eth0'

commit
save
```

Этот маршрут:
- Устанавливается если 192.0.2.1 отвечает на ICMP ping
- Удаляется если 192.0.2.1 недоступен
- Использует интерфейс eth0 для выхода

### Синтаксис команд

```bash
set protocols failover route <subnet> next-hop <ip-address>
set protocols failover route <subnet> next-hop <ip-address> check target '<target-ip>'
set protocols failover route <subnet> next-hop <ip-address> check type '<type>'
set protocols failover route <subnet> next-hop <ip-address> interface '<interface>'
set protocols failover route <subnet> next-hop <ip-address> metric <1-65535>
set protocols failover route <subnet> next-hop <ip-address> check timeout <1-300>
```

**Параметры**:
- `<subnet>` - сеть назначения в формате IP/prefix
- `<ip-address>` - next-hop адрес
- `<target-ip>` - адрес для health check
- `<type>` - тип проверки: icmp, arp, tcp
- `<interface>` - исходящий интерфейс
- `<metric>` - метрика маршрута (по умолчанию 1)
- `<timeout>` - таймаут проверки в секундах (по умолчанию 10)

## Типы Health Check

### ICMP (Ping)

ICMP проверка (по умолчанию) - самый распространенный тип.

```bash
set protocols failover route 10.0.0.0/8 next-hop 192.0.2.1 check target '192.0.2.1'
set protocols failover route 10.0.0.0/8 next-hop 192.0.2.1 check type 'icmp'
set protocols failover route 10.0.0.0/8 next-hop 192.0.2.1 check timeout 5
```

**Параметры ICMP**:
- Отправляется 2 ICMP Echo Request пакета
- Таймаут ответа 1 секунда на пакет
- Health check успешен если получен хотя бы один ответ
- Общий timeout настраивается отдельно

**Когда использовать**:
- Проверка доступности gateway
- Проверка связности с удаленным хостом
- Общий мониторинг канала связи

**Ограничения**:
- Может быть заблокирован firewall
- Не проверяет работоспособность сервиса
- Может давать ложные срабатывания при ICMP rate limiting

### ARP

ARP проверка - для локальных сетей (Layer 2).

```bash
set protocols failover route 172.16.0.0/12 next-hop 192.168.1.1 check target '192.168.1.1'
set protocols failover route 172.16.0.0/12 next-hop 192.168.1.1 check type 'arp'
set protocols failover route 172.16.0.0/12 next-hop 192.168.1.1 interface 'eth1'
```

**Параметры ARP**:
- Отправляется 2 ARP Request пакета
- Таймаут ответа 1 секунда на пакет
- Health check успешен если получен хотя бы один ARP Reply
- Работает только в локальной подсети

**Когда использовать**:
- Проверка локального gateway
- Мониторинг устройств в той же L2 сети
- Когда ICMP заблокирован

**Ограничения**:
- Только для локальной подсети
- Не работает через роутеры
- Проверяет только Layer 2 доступность

### TCP Port

TCP проверка - проверка доступности конкретного сервиса.

```bash
set protocols failover route 198.51.100.0/24 next-hop 203.0.113.1 check target '203.0.113.10'
set protocols failover route 198.51.100.0/24 next-hop 203.0.113.1 check type 'tcp'
set protocols failover route 198.51.100.0/24 next-hop 203.0.113.1 check port 443
set protocols failover route 198.51.100.0/24 next-hop 203.0.113.1 interface 'eth0'
```

**Параметры TCP**:
- Проверяет возможность установки TCP соединения
- Требует указания порта через `check port <1-65535>`
- Health check успешен если порт открыт (TCP handshake завершен)
- Соединение сразу закрывается после проверки

**Когда использовать**:
- Проверка работоспособности web-сервера (80, 443)
- Мониторинг конкретных сервисов
- Когда важна не только сетевая, но и сервисная доступность

**Ограничения**:
- Требует открытого TCP порта
- Медленнее чем ICMP/ARP
- Может быть заблокирован firewall

**Пример с HTTPS сервером**:

```bash
# Маршрут к серверам активен только если web-сервер работает
set protocols failover route 10.100.0.0/16 next-hop 192.0.2.10 check target '10.100.1.100'
set protocols failover route 10.100.0.0/16 next-hop 192.0.2.10 check type 'tcp'
set protocols failover route 10.100.0.0/16 next-hop 192.0.2.10 check port 443
```

## Множественные target адреса

Поддержка проверки нескольких целевых адресов с различными политиками.

### Multiple targets с политикой any-available

По умолчанию: маршрут активен если доступен хотя бы один target.

```bash
set protocols failover route 10.20.0.0/16 next-hop 192.0.2.1 check target '8.8.8.8'
set protocols failover route 10.20.0.0/16 next-hop 192.0.2.1 check target '8.8.4.4'
set protocols failover route 10.20.0.0/16 next-hop 192.0.2.1 check policy 'any-available'
```

**Логика any-available**:
- Маршрут устанавливается если доступен любой из target
- Маршрут удаляется только если недоступны все target
- Полезно для проверки общей связности канала

### Multiple targets с политикой all-available

Маршрут активен только если доступны все targets.

```bash
set protocols failover route 10.30.0.0/16 next-hop 192.0.2.5 check target '10.30.1.1'
set protocols failover route 10.30.0.0/16 next-hop 192.0.2.5 check target '10.30.2.1'
set protocols failover route 10.30.0.0/16 next-hop 192.0.2.5 check target '10.30.3.1'
set protocols failover route 10.30.0.0/16 next-hop 192.0.2.5 check policy 'all-available'
```

**Логика all-available**:
- Маршрут устанавливается только если доступны все targets
- Маршрут удаляется если хотя бы один target недоступен
- Полезно для критичных путей требующих полной доступности

**Выбор политики**:
- `any-available` - для общей проверки связности (по умолчанию)
- `all-available` - для гарантии полной доступности инфраструктуры

## Failover сценарии

### Dual ISP Failover

Автоматическое переключение между двумя интернет-каналами.

**Топология**:
```
                 Internet
                    |
          +---------+---------+
          |                   |
      ISP1 (Primary)      ISP2 (Backup)
    203.0.113.1/30       198.51.100.1/30
          |                   |
        eth0                eth1
          |                   |
          +------- VyOS -------+
                    |
             LAN (192.168.1.0/24)
```

**Конфигурация**:

```bash
configure

# Интерфейсы ISP
set interfaces ethernet eth0 address '203.0.113.2/30'
set interfaces ethernet eth0 description 'ISP1-Primary'

set interfaces ethernet eth1 address '198.51.100.2/30'
set interfaces ethernet eth1 description 'ISP2-Backup'

# Primary ISP - failover маршрут (metric 10)
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check target '1.1.1.1'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check policy 'any-available'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check type 'icmp'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check timeout 10
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 interface 'eth0'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 metric 10

# Backup ISP - failover маршрут (metric 20)
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 check target '1.1.1.1'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 check policy 'any-available'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 check type 'icmp'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 check timeout 10
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 interface 'eth1'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 metric 20

# NAT для обоих ISP
set nat source rule 100 outbound-interface name 'eth0'
set nat source rule 100 source address '192.168.1.0/24'
set nat source rule 100 translation address 'masquerade'

set nat source rule 200 outbound-interface name 'eth1'
set nat source rule 200 source address '192.168.1.0/24'
set nat source rule 200 translation address 'masquerade'

commit
save
```

**Логика работы**:
1. Primary ISP (metric 10) устанавливается если доступны DNS сервера
2. Backup ISP (metric 20) устанавливается параллельно
3. Ядро выбирает маршрут с меньшей метрикой (Primary)
4. При отказе Primary маршрут удаляется, трафик идет через Backup
5. При восстановлении Primary маршрут возвращается, трафик переключается обратно

### Active-Backup Gateway

Failover между двумя gateway в одной сети.

**Топология**:
```
    Gateway1 (Primary)     Gateway2 (Backup)
      192.168.1.1            192.168.1.2
          |                       |
          +----------+------------+
                     |
                   VyOS
                  eth0: 192.168.1.10
                     |
            LAN: 192.168.10.0/24
```

**Конфигурация**:

```bash
configure

# Primary gateway
set protocols failover route 0.0.0.0/0 next-hop 192.168.1.1
set protocols failover route 0.0.0.0/0 next-hop 192.168.1.1 check target '192.168.1.1'
set protocols failover route 0.0.0.0/0 next-hop 192.168.1.1 check type 'arp'
set protocols failover route 0.0.0.0/0 next-hop 192.168.1.1 interface 'eth0'
set protocols failover route 0.0.0.0/0 next-hop 192.168.1.1 metric 10

# Backup gateway
set protocols failover route 0.0.0.0/0 next-hop 192.168.1.2
set protocols failover route 0.0.0.0/0 next-hop 192.168.1.2 check target '192.168.1.2'
set protocols failover route 0.0.0.0/0 next-hop 192.168.1.2 check type 'arp'
set protocols failover route 0.0.0.0/0 next-hop 192.168.1.2 interface 'eth0'
set protocols failover route 0.0.0.0/0 next-hop 192.168.1.2 metric 20

commit
save
```

**Использование ARP проверки**:
- Быстрая проверка локальных gateway
- Не зависит от ICMP блокировок
- Проверяет только L2 доступность

### Multi-site VPN Failover

Автоматическое переключение между VPN туннелями.

**Конфигурация**:

```bash
configure

# Primary VPN tunnel (через ISP1)
set protocols failover route 10.20.0.0/16 next-hop 10.100.1.1
set protocols failover route 10.20.0.0/16 next-hop 10.100.1.1 check target '10.20.1.1'
set protocols failover route 10.20.0.0/16 next-hop 10.100.1.1 check type 'icmp'
set protocols failover route 10.20.0.0/16 next-hop 10.100.1.1 interface 'tun0'
set protocols failover route 10.20.0.0/16 next-hop 10.100.1.1 metric 10

# Backup VPN tunnel (через ISP2)
set protocols failover route 10.20.0.0/16 next-hop 10.100.2.1
set protocols failover route 10.20.0.0/16 next-hop 10.100.2.1 check target '10.20.1.1'
set protocols failover route 10.20.0.0/16 next-hop 10.100.2.1 check type 'icmp'
set protocols failover route 10.20.0.0/16 next-hop 10.100.2.1 interface 'tun1'
set protocols failover route 10.20.0.0/16 next-hop 10.100.2.1 metric 20

commit
save
```

## Примеры для облачных провайдеров

### Yandex Cloud: Dual ISP с NAT Failover

Конфигурация для Yandex Cloud с двумя публичными IP адресами.

**Архитектура**:
```
Yandex Cloud VPC: 10.128.0.0/24

VyOS Instance:
- eth0 (внешний): 10.128.0.10
  - Public IP1: 51.250.10.20 (Primary)
  - Public IP2: 51.250.10.21 (Backup)
- eth1 (внутренний): 192.168.1.1/24
```

**Полная конфигурация**:

```bash
configure

# Интерфейсы
set interfaces ethernet eth0 address '10.128.0.10/24'
set interfaces ethernet eth0 description 'Yandex-Cloud-External'

set interfaces ethernet eth1 address '192.168.1.1/24'
set interfaces ethernet eth1 description 'Internal-Network'

# Default route через Yandex Cloud gateway
set protocols static route 0.0.0.0/0 next-hop 10.128.0.1

# Failover маршруты для проверки публичной связности
# Проверяем доступность через Primary IP
set protocols failover route 8.8.8.8/32 next-hop 10.128.0.1
set protocols failover route 8.8.8.8/32 next-hop 10.128.0.1 check target '8.8.8.8'
set protocols failover route 8.8.8.8/32 next-hop 10.128.0.1 check type 'icmp'
set protocols failover route 8.8.8.8/32 next-hop 10.128.0.1 check timeout 5
set protocols failover route 8.8.8.8/32 next-hop 10.128.0.1 interface 'eth0'

# Source NAT через Primary IP (приоритет выше)
set nat source rule 100 outbound-interface name 'eth0'
set nat source rule 100 source address '192.168.1.0/24'
set nat source rule 100 translation address '51.250.10.20'
set nat source rule 100 description 'NAT-Primary-IP'

# Source NAT через Backup IP (приоритет ниже, используется при отказе Primary)
set nat source rule 200 outbound-interface name 'eth0'
set nat source rule 200 source address '192.168.1.0/24'
set nat source rule 200 translation address '51.250.10.21'
set nat source rule 200 description 'NAT-Backup-IP'

# Destination NAT для входящих соединений
set nat destination rule 10 destination address '51.250.10.20'
set nat destination rule 10 destination port '443'
set nat destination rule 10 inbound-interface name 'eth0'
set nat destination rule 10 protocol 'tcp'
set nat destination rule 10 translation address '192.168.1.100'
set nat destination rule 10 translation port '443'

commit
save
```

**Проверка**:

```bash
# Статус failover маршрутов
show ip route failover

# Проверка NAT
show nat source statistics

# Мониторинг переключений
monitor log tail
```

### VK Cloud: Multi-AZ Gateway Failover

Failover между gateway в разных зонах доступности VK Cloud.

**Архитектура**:
```
VK Cloud VPC: 10.0.0.0/16

Availability Zone 1:
- Gateway1: 10.0.1.1 (Primary)
- VyOS eth0: 10.0.1.10

Availability Zone 2:
- Gateway2: 10.0.2.1 (Backup)
- VyOS eth1: 10.0.2.10
```

**Конфигурация**:

```bash
configure

# Интерфейсы в разных AZ
set interfaces ethernet eth0 address '10.0.1.10/24'
set interfaces ethernet eth0 description 'VK-Cloud-AZ1'

set interfaces ethernet eth1 address '10.0.2.10/24'
set interfaces ethernet eth1 description 'VK-Cloud-AZ2'

# Failover default route через AZ1 (Primary)
set protocols failover route 0.0.0.0/0 next-hop 10.0.1.1
set protocols failover route 0.0.0.0/0 next-hop 10.0.1.1 check target '10.0.1.1'
set protocols failover route 0.0.0.0/0 next-hop 10.0.1.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 10.0.1.1 check policy 'all-available'
set protocols failover route 0.0.0.0/0 next-hop 10.0.1.1 check type 'icmp'
set protocols failover route 0.0.0.0/0 next-hop 10.0.1.1 interface 'eth0'
set protocols failover route 0.0.0.0/0 next-hop 10.0.1.1 metric 10

# Failover default route через AZ2 (Backup)
set protocols failover route 0.0.0.0/0 next-hop 10.0.2.1
set protocols failover route 0.0.0.0/0 next-hop 10.0.2.1 check target '10.0.2.1'
set protocols failover route 0.0.0.0/0 next-hop 10.0.2.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 10.0.2.1 check policy 'all-available'
set protocols failover route 0.0.0.0/0 next-hop 10.0.2.1 check type 'icmp'
set protocols failover route 0.0.0.0/0 next-hop 10.0.2.1 interface 'eth1'
set protocols failover route 0.0.0.0/0 next-hop 10.0.2.1 metric 20

# Policy routing для симметричного трафика
set policy route PBR rule 10 source address '10.0.1.0/24'
set policy route PBR rule 10 set table '100'

set policy route PBR rule 20 source address '10.0.2.0/24'
set policy route PBR rule 20 set table '200'

# Таблицы маршрутизации для разных AZ
set protocols static table 100 route 0.0.0.0/0 next-hop 10.0.1.1
set protocols static table 200 route 0.0.0.0/0 next-hop 10.0.2.1

commit
save
```

**Проверка Multi-AZ failover**:

```bash
# Проверка маршрутов в main table
show ip route

# Проверка policy routing
show policy route statistics

# Проверка доступности обоих AZ
ping 10.0.1.1 source-address 10.0.1.10
ping 10.0.2.1 source-address 10.0.2.10
```

### Комбинированный сценарий: VPN + ISP Failover

Failover между VPN каналом и прямым ISP маршрутом.

**Конфигурация**:

```bash
configure

# VPN tunnel (Primary) - через WireGuard
set protocols failover route 10.50.0.0/16 next-hop 10.200.0.1
set protocols failover route 10.50.0.0/16 next-hop 10.200.0.1 check target '10.50.1.1'
set protocols failover route 10.50.0.0/16 next-hop 10.200.0.1 check type 'icmp'
set protocols failover route 10.50.0.0/16 next-hop 10.200.0.1 check timeout 5
set protocols failover route 10.50.0.0/16 next-hop 10.200.0.1 interface 'wg0'
set protocols failover route 10.50.0.0/16 next-hop 10.200.0.1 metric 10

# Direct ISP route (Backup) - через интернет
set protocols failover route 10.50.0.0/16 next-hop 203.0.113.50
set protocols failover route 10.50.0.0/16 next-hop 203.0.113.50 check target '10.50.1.1'
set protocols failover route 10.50.0.0/16 next-hop 203.0.113.50 check type 'tcp'
set protocols failover route 10.50.0.0/16 next-hop 203.0.113.50 check port 443
set protocols failover route 10.50.0.0/16 next-hop 203.0.113.50 interface 'eth0'
set protocols failover route 10.50.0.0/16 next-hop 203.0.113.50 metric 50

commit
save
```

**Логика**:
- Primary: трафик через защищенный VPN туннель
- Backup: при отказе VPN трафик через незащищенный интернет
- TCP проверка на backup подтверждает доступность конечного сервиса

## Расширенная конфигурация

### Custom Timeout и Interval

Настройка таймаутов для различных сценариев.

**Быстрое переключение**:

```bash
# Агрессивные проверки для критичных каналов
set protocols failover route 10.100.0.0/16 next-hop 192.0.2.10
set protocols failover route 10.100.0.0/16 next-hop 192.0.2.10 check target '10.100.1.1'
set protocols failover route 10.100.0.0/16 next-hop 192.0.2.10 check type 'icmp'
set protocols failover route 10.100.0.0/16 next-hop 192.0.2.10 check timeout 3
```

Быстрое обнаружение (3 секунды), но больше overhead.

**Медленное переключение**:

```bash
# Консервативные проверки для стабильности
set protocols failover route 10.200.0.0/16 next-hop 192.0.2.20
set protocols failover route 10.200.0.0/16 next-hop 192.0.2.20 check target '10.200.1.1'
set protocols failover route 10.200.0.0/16 next-hop 192.0.2.20 check type 'icmp'
set protocols failover route 10.200.0.0/16 next-hop 192.0.2.20 check timeout 30
```

Медленное обнаружение (30 секунд), избегает ложных срабатываний.

### Метрики для приоритизации

Использование метрик для fine-grained контроля.

```bash
# Tier 1: Самый быстрый канал (fiber)
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 metric 10

# Tier 2: Средний канал (cable)
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 metric 20

# Tier 3: Медленный канал (DSL backup)
set protocols failover route 0.0.0.0/0 next-hop 192.0.2.1
set protocols failover route 0.0.0.0/0 next-hop 192.0.2.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 192.0.2.1 metric 30

# Tier 4: Последний резерв (4G/LTE)
set protocols failover route 0.0.0.0/0 next-hop 10.64.0.1
set protocols failover route 0.0.0.0/0 next-hop 10.64.0.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 10.64.0.1 metric 100
```

Каскадный failover с четкой иерархией приоритетов.

### Интеграция с Firewall

Failover с учетом firewall зон.

```bash
configure

# Failover через разные firewall зоны
set firewall zone WAN1 interface 'eth0'
set firewall zone WAN2 interface 'eth1'

# Failover routes
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 interface 'eth0'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 metric 10

set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 interface 'eth1'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 metric 20

# Firewall правила применяются автоматически при переключении
set firewall zone WAN1 from LAN firewall name LAN-to-WAN
set firewall zone WAN2 from LAN firewall name LAN-to-WAN

commit
save
```

## Мониторинг и верификация

### Просмотр failover маршрутов

**Все failover маршруты**:

```bash
show protocols failover
```

Вывод:
```
Failover routes:
  route 0.0.0.0/0 next-hop 203.0.113.1
    check target: 8.8.8.8
    check type: icmp
    check timeout: 10
    interface: eth0
    metric: 10
    status: active

  route 0.0.0.0/0 next-hop 198.51.100.1
    check target: 8.8.8.8
    check type: icmp
    check timeout: 10
    interface: eth1
    metric: 20
    status: standby
```

**Активные маршруты в таблице**:

```bash
show ip route
```

Видны только failover маршруты, прошедшие health check.

**Детали конкретного маршрута**:

```bash
show ip route 0.0.0.0/0
```

Вывод:
```
Routing entry for 0.0.0.0/0
  Known via "failover", distance 10, metric 10, best
  Last update 00:05:23 ago
  * 203.0.113.1, via eth0
```

### Мониторинг Health Check

**Статус проверок**:

```bash
show protocols failover route 0.0.0.0/0 next-hop 203.0.113.1
```

Вывод:
```
Route: 0.0.0.0/0
Next-hop: 203.0.113.1
Check targets:
  8.8.8.8 - UP (last check: 2s ago, rtt: 15ms)
  1.1.1.1 - UP (last check: 2s ago, rtt: 12ms)
Check policy: any-available
Check type: icmp
Check timeout: 10s
Route status: ACTIVE
Uptime: 2h 15m 42s
```

**Логи failover событий**:

```bash
show log | match failover
```

Вывод:
```
Oct 15 10:23:45 vyos-gw failover[1234]: Route 0.0.0.0/0 via 203.0.113.1: target 8.8.8.8 DOWN
Oct 15 10:23:45 vyos-gw failover[1234]: Route 0.0.0.0/0 via 203.0.113.1: REMOVED from table
Oct 15 10:25:12 vyos-gw failover[1234]: Route 0.0.0.0/0 via 203.0.113.1: target 8.8.8.8 UP
Oct 15 10:25:12 vyos-gw failover[1234]: Route 0.0.0.0/0 via 203.0.113.1: INSTALLED to table
```

### Мониторинг в реальном времени

**Непрерывный мониторинг маршрутов**:

```bash
monitor protocols failover
```

**Мониторинг логов**:

```bash
monitor log | match failover
```

**Ping мониторинг target**:

```bash
monitor ping 8.8.8.8
```

### Статистика переключений

**Количество failover событий**:

```bash
show protocols failover statistics
```

Вывод:
```
Failover Statistics:
  Total routes configured: 2
  Active routes: 1
  Standby routes: 1

  Route 0.0.0.0/0 via 203.0.113.1:
    Uptime: 2h 15m 42s
    Total checks: 1521
    Successful checks: 1521
    Failed checks: 0
    Failover count: 0

  Route 0.0.0.0/0 via 198.51.100.1:
    Uptime: 0s (standby)
    Total checks: 1521
    Successful checks: 1521
    Failed checks: 0
    Failover count: 0
```

## Устранение неполадок

### Failover маршрут не устанавливается

**Проблема**: Маршрут не появляется в таблице маршрутизации.

**Диагностика**:

```bash
# Проверка конфигурации
show configuration commands | match failover

# Проверка доступности target
ping <target-ip> source-address <nexthop-interface-ip>

# Проверка интерфейса
show interfaces <interface>

# Проверка firewall
show firewall
```

**Типичные причины**:
- Target недоступен
- Интерфейс down
- Firewall блокирует health check пакеты
- Неверный target IP
- Routing loop

**Решение**:

```bash
# Временно увеличить timeout
set protocols failover route <subnet> next-hop <ip> check timeout 30

# Изменить тип проверки
set protocols failover route <subnet> next-hop <ip> check type arp

# Проверить другой target
set protocols failover route <subnet> next-hop <ip> check target '<alternative-ip>'

commit
```

### Частые переключения (flapping)

**Проблема**: Маршрут постоянно добавляется и удаляется.

**Диагностика**:

```bash
# Мониторинг логов
show log | match failover | tail -50

# Проверка latency к target
monitor ping <target-ip>

# Проверка packet loss
ping <target-ip> count 100
```

**Типичные причины**:
- Нестабильный канал связи
- Слишком агрессивный timeout
- Target перегружен
- ICMP rate limiting
- Сетевые проблемы

**Решение - увеличение timeout**:

```bash
# Увеличить timeout
set protocols failover route <subnet> next-hop <ip> check timeout 30

# Добавить hysteresis (использовать all-available с несколькими targets)
set protocols failover route <subnet> next-hop <ip> check target '<target1>'
set protocols failover route <subnet> next-hop <ip> check target '<target2>'
set protocols failover route <subnet> next-hop <ip> check target '<target3>'
set protocols failover route <subnet> next-hop <ip> check policy 'all-available'

commit
```

### Медленное переключение

**Проблема**: Failover происходит слишком медленно.

**Диагностика**:

```bash
# Проверка текущего timeout
show protocols failover route <subnet> next-hop <ip>
```

**Решение**:

```bash
# Уменьшить timeout
set protocols failover route <subnet> next-hop <ip> check timeout 5

# Использовать более быстрый тип проверки (ARP вместо ICMP)
set protocols failover route <subnet> next-hop <ip> check type arp

commit
```

**Альтернатива - BFD**:

Для очень быстрого переключения (миллисекунды) используйте BFD вместо failover:

```bash
set protocols bfd peer <nexthop-ip> interval transmit 300
set protocols bfd peer <nexthop-ip> interval receive 300
set protocols bfd peer <nexthop-ip> interval multiplier 3

set protocols static route <subnet> next-hop <ip> bfd

commit
```

### Health check не работает

**Проблема**: Health check всегда показывает DOWN.

**Диагностика ICMP**:

```bash
# Проверка ICMP с source interface
ping <target> source-address <interface-ip>

# Tcpdump для анализа
monitor traffic interface <interface> filter icmp
```

**Диагностика ARP**:

```bash
# Проверка ARP таблицы
show arp

# Очистка ARP cache
reset arp interface <interface> address <target>
```

**Диагностика TCP**:

```bash
# Проверка TCP порта
telnet <target> <port>

# Проверка с curl
run curl -v --connect-timeout 5 http://<target>:<port>
```

**Типичные причины**:
- Firewall на target блокирует ICMP
- Target не отвечает на ARP
- TCP порт закрыт или filtered
- Source routing проблемы
- Asymmetric routing

**Решение**:

```bash
# Изменить тип проверки
set protocols failover route <subnet> next-hop <ip> check type tcp
set protocols failover route <subnet> next-hop <ip> check port 443

# Или использовать другой target
set protocols failover route <subnet> next-hop <ip> check target '<new-target>'

commit
```

### Асимметричная маршрутизация

**Проблема**: Входящий и исходящий трафик идут разными путями.

**Диагностика**:

```bash
# Traceroute в обе стороны
traceroute <destination>

# На удаленном хосте
traceroute <local-address>
```

**Решение - Policy Based Routing**:

```bash
# Маршрутизация на основе source address
set policy route PBR rule 10 source address '<subnet>'
set policy route PBR rule 10 set table 100

set protocols static table 100 route 0.0.0.0/0 next-hop <specific-gateway>

# Применение к интерфейсу
set interfaces ethernet <interface> policy route PBR

commit
```

## Лучшие практики

### Выбор Health Check параметров

**Timeout**:
- **3-5 секунд** - для критичных каналов, требующих быстрого failover
- **10 секунд** - стандартное значение (по умолчанию)
- **20-30 секунд** - для нестабильных каналов, избегание flapping

**Тип проверки**:
- **ICMP** - для общей проверки связности (стандартный выбор)
- **ARP** - для локальных gateway в той же L2 сети
- **TCP** - для проверки конкретного сервиса

**Target выбор**:
- Используйте стабильные, всегда доступные targets (8.8.8.8, 1.1.1.1)
- Для критичных маршрутов используйте несколько targets с all-available
- Для общих маршрутов используйте any-available

### Метрики и приоритеты

**Правило**: Разница в метриках должна быть достаточной для четкого приоритета.

```bash
# Хорошо: четкая иерархия
metric 10, 20, 30, 50, 100

# Плохо: слишком близкие значения
metric 10, 11, 12, 13
```

**Рекомендуемая схема**:
- Primary: 10
- Secondary: 20
- Tertiary: 30
- Emergency backup: 100

### Избегание Flapping

**Используйте hysteresis**:

```bash
# Несколько targets с all-available
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check target '1.1.1.1'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check policy 'all-available'
```

Маршрут удаляется только если все targets недоступны.

**Адекватный timeout**:

```bash
# Не слишком агрессивный
set protocols failover route <subnet> next-hop <ip> check timeout 15
```

### Документирование

**Используйте description**:

```bash
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 description 'Primary-ISP-Fiber-1Gbps'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 description 'Backup-ISP-Cable-100Mbps'
```

### Мониторинг и алертинг

**Настройка syslog**:

```bash
set system syslog global facility protocols level info
set system syslog host 192.168.1.100 facility protocols level warning
```

**Логирование failover событий**:

```bash
# Все события попадают в syslog
show log | match failover
```

### Тестирование Failover

**Регулярное тестирование**:

```bash
# Симуляция отказа - временное отключение интерфейса
set interfaces ethernet eth0 disable
commit

# Проверка переключения
show ip route

# Восстановление
delete interfaces ethernet eth0 disable
commit
```

**Тестирование с контролируемым трафиком**:

```bash
# Непрерывный ping во время теста
monitor ping 8.8.8.8
```

### Комбинирование с другими технологиями

**Failover + VRRP**:
- VRRP для локального gateway redundancy
- Failover для upstream маршрутов

**Failover + NAT**:
- Убедитесь что NAT правила применяются к обоим интерфейсам
- Используйте masquerade для автоматической адаптации

**Failover + VPN**:
- Health check должен проверять конечный хост за VPN
- Используйте TCP check для критичных VPN сервисов

## Сравнение с альтернативами

### Failover vs Static Routes + Distance

**Static routes + distance**:
```bash
set protocols static route 0.0.0.0/0 next-hop 203.0.113.1 distance 10
set protocols static route 0.0.0.0/0 next-hop 198.51.100.1 distance 20
```

**Проблемы**:
- Нет автоматического failover
- Backup route активируется только если Primary nexthop unreachable (not pingable)
- Медленное обнаружение отказов

**Failover routes**:
```bash
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.1 check target '8.8.8.8' metric 10
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.1 check target '8.8.8.8' metric 20
```

**Преимущества**:
- Активный мониторинг
- Быстрое обнаружение
- Проверка реальной связности

### Failover vs BFD

**BFD**:
```bash
set protocols bfd peer 203.0.113.1 interval transmit 300
set protocols static route 0.0.0.0/0 next-hop 203.0.113.1 bfd
```

**Преимущества BFD**:
- Очень быстрое обнаружение (миллисекунды)
- Протокол мониторинга
- Двунаправленная проверка

**Преимущества Failover**:
- Проще в настройке
- Не требует поддержки BFD на nexthop
- Гибкие типы проверок (ICMP, ARP, TCP)
- Может проверять end-to-end связность

**Когда использовать BFD**:
- Критичные приложения требующие sub-second failover
- Nexthop поддерживает BFD
- Нужна двунаправленная проверка

**Когда использовать Failover**:
- Nexthop не поддерживает BFD
- Нужна проверка конкретного сервиса (TCP)
- Простота важнее скорости

### Failover vs динамические протоколы (OSPF/BGP)

**OSPF/BGP**:
- Автоматическая маршрутизация
- Быстрая конвергенция
- Масштабируемость

**Failover routes**:
- Ручная настройка
- Контролируемое поведение
- Простота

**Когда использовать Failover**:
- Простые топологии (2-3 маршрута)
- Stub networks
- ISP не поддерживает BGP
- Нужен полный контроль

**Когда использовать динамические протоколы**:
- Сложные топологии
- Множественные пути
- Требуется быстрая адаптация
- Enterprise сети

## Производительность и ограничения

### Производительность

**Health check overhead**:
- ICMP: минимальный (2 пакета каждые N секунд)
- ARP: минимальный (2 пакета каждые N секунд)
- TCP: средний (полный 3-way handshake)

**CPU impact**:
- Незначительный для 10-20 failover маршрутов
- Возрастает с количеством маршрутов и частотой проверок

**Рекомендации**:
- До 50 failover маршрутов на стандартном оборудовании
- Timeout ≥ 5 секунд для минимального overhead

### Ограничения

**Технические**:
- Нет поддержки IPv6 failover routes (только IPv4)
- Один check type на маршрут
- Ограниченные типы проверок (ICMP, ARP, TCP)

**Операционные**:
- Скорость переключения: секунды (зависит от timeout)
- Нет stateful failover для TCP соединений
- Может вызывать асимметричную маршрутизацию

## Интеграция с системами мониторинга

### SNMP Monitoring

```bash
configure

# Включение SNMP
set service snmp community public authorization ro
set service snmp community public network 192.168.1.0/24
set service snmp listen-address 192.168.1.1

commit
```

**Мониторинг через SNMP**:
- IP-MIB::ipRouteTable - таблица маршрутизации
- IF-MIB::ifOperStatus - статус интерфейсов

### Syslog Integration

```bash
# Отправка failover событий на syslog сервер
set system syslog host 192.168.1.100 facility protocols level info
set system syslog host 192.168.1.100 port 514
set system syslog host 192.168.1.100 protocol udp
```

### Custom Scripts

Интеграция с event handler для автоматических действий:

```bash
set system event-handler event failover filter pattern 'failover.*REMOVED'
set system event-handler event failover script path '/config/scripts/failover-alert.sh'
```

**Пример скрипта** `/config/scripts/failover-alert.sh`:

```bash
#!/bin/bash
# Отправка уведомления при failover
MESSAGE="Failover event detected on $(hostname) at $(date)"
echo "$MESSAGE" | mail -s "VyOS Failover Alert" admin@example.com
```

## Примеры полной конфигурации

### Enterprise Branch Office

Полная конфигурация для филиала с dual ISP и VPN.

```bash
configure

# Интерфейсы
set interfaces ethernet eth0 address '203.0.113.10/30'
set interfaces ethernet eth0 description 'ISP1-Primary'

set interfaces ethernet eth1 address '198.51.100.10/30'
set interfaces ethernet eth1 description 'ISP2-Backup'

set interfaces ethernet eth2 address '192.168.100.1/24'
set interfaces ethernet eth2 description 'LAN'

# Failover default routes
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.9
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.9 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.9 check target '1.1.1.1'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.9 check policy 'any-available'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.9 check type 'icmp'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.9 interface 'eth0'
set protocols failover route 0.0.0.0/0 next-hop 203.0.113.9 metric 10

set protocols failover route 0.0.0.0/0 next-hop 198.51.100.9
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.9 check target '8.8.8.8'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.9 check target '1.1.1.1'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.9 check policy 'any-available'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.9 check type 'icmp'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.9 interface 'eth1'
set protocols failover route 0.0.0.0/0 next-hop 198.51.100.9 metric 20

# NAT
set nat source rule 100 outbound-interface name 'eth0'
set nat source rule 100 source address '192.168.100.0/24'
set nat source rule 100 translation address 'masquerade'

set nat source rule 200 outbound-interface name 'eth1'
set nat source rule 200 source address '192.168.100.0/24'
set nat source rule 200 translation address 'masquerade'

# Firewall
set firewall zone LAN interface 'eth2'
set firewall zone WAN1 interface 'eth0'
set firewall zone WAN2 interface 'eth1'

set firewall zone WAN1 from LAN firewall name LAN-to-WAN
set firewall zone WAN2 from LAN firewall name LAN-to-WAN

set firewall name LAN-to-WAN default-action accept
set firewall name LAN-to-WAN enable-default-log

# Syslog
set system syslog global facility protocols level info
set system syslog host 192.168.100.50 facility all level warning

commit
save
```

## Следующие шаги

- [Static Routes](/docs/vyos/routing/vyos-static/) - базовая статическая маршрутизация
- [OSPF](/docs/vyos/routing/vyos-ospf/) - динамическая маршрутизация в enterprise
- [BGP](/docs/vyos/routing/vyos-bgp/) - для подключения к ISP
- [BFD](/docs/vyos/routing/vyos-bfd/) - быстрое обнаружение отказов
- [VPN](/docs/vyos/vpn/) - для защищенных туннелей
- [High Availability](/docs/vyos/ha/) - VRRP для gateway redundancy

