# Multicast - Многоадресная маршрутизация

> Multicast-маршрутизация в VyOS - доставка потокового видео и аудио по протоколам IGMP и PIM в корпоративной сетевой инфраструктуре.

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


## Обзор

Многоадресная маршрутизация (Multicast Routing) позволяет эффективно передавать данные от одного источника множеству получателей одновременно. Это критически важно для приложений потоковой передачи данных, таких как:

- IPTV и потоковое видео
- Видеоконференции
- Распространение программного обеспечения
- Финансовые данные в реальном времени
- Онлайн-игры

VyOS поддерживает многоадресную маршрутизацию через интеграцию с FRRouting (FRR), обеспечивая полноценную поддержку протоколов IGMP и PIM.

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

**Адресация Multicast**:
- IPv4 диапазон: 224.0.0.0/4 (224.0.0.0 - 239.255.255.255)
- 224.0.0.0/24 - зарезервированные адреса для локальной сети
- 239.0.0.0/8 - административно ограниченные адреса (для частных сетей)

**Группы Multicast**:
- Получатели присоединяются к группам по IP-адресу группы
- Источники отправляют данные на адрес группы
- Маршрутизаторы доставляют трафик только заинтересованным получателям

**Протоколы**:
- **IGMP (Internet Group Management Protocol)**: управление членством в группах между хостами и маршрутизаторами
- **PIM (Protocol Independent Multicast)**: маршрутизация multicast-трафика между маршрутизаторами
- **MSDP (Multicast Source Discovery Protocol)**: обмен информацией об источниках между доменами

## Архитектура многоадресной маршрутизации

### Основные компоненты

**Source (Источник)**:
- Узел, отправляющий multicast-трафик
- Идентифицируется по IP-адресу

**Group (Группа)**:
- Множество получателей, заинтересованных в данных
- Идентифицируется multicast IP-адресом

**RPF (Reverse Path Forwarding)**:
- Механизм проверки, что пакет пришел по кратчайшему пути к источнику
- Предотвращает петли маршрутизации

**Multicast RIB (MRIB)**:
- Отдельная таблица маршрутизации для multicast
- Используется для RPF-проверок

### Типы деревьев распространения

**SPT (Shortest Path Tree)**:
- Дерево кратчайших путей от источника к получателям
- Оптимальная задержка
- Больше состояний на маршрутизаторах
- Обозначение: (S,G) - Source, Group

**RPT (Rendezvous Point Tree)**:
- Общее дерево через точку встречи (RP)
- Меньше состояний на маршрутизаторах
- Возможна неоптимальная маршрутизация
- Обозначение: (*,G) - Any Source, Group

## Статические маршруты Multicast

VyOS поддерживает статические многоадресные маршруты для управления RPF-проверками. Эти маршруты используются только для определения обратного пути и не влияют на обычную маршрутизацию unicast.

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

**Статический маршрут с next-hop**:

```bash
set protocols static mroute <подсеть> next-hop <адрес>
set protocols static mroute <подсеть> next-hop <адрес> distance <расстояние>
```

Параметры:
- `<подсеть>` - адрес сети источника multicast-трафика
- `<адрес>` - IP-адрес следующего узла для RPF
- `<расстояние>` - административное расстояние (опционально, по умолчанию 1)

**Статический маршрут через интерфейс**:

```bash
set protocols static mroute <подсеть> interface <интерфейс>
set protocols static mroute <подсеть> interface <интерфейс> distance <расстояние>
```

Параметры:
- `<интерфейс>` - исходящий интерфейс для RPF-проверки

**Отключение маршрута**:

```bash
set protocols static mroute <подсеть> next-hop <адрес> disable
set protocols static mroute <подсеть> interface <интерфейс> disable
```

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

**Пример 1: Базовый статический mroute**

```bash
# Настройка статического маршрута для источника 10.100.50.0/24
configure
set protocols static mroute 10.100.50.0/24 next-hop 192.168.1.1
commit
save
```

**Пример 2: Несколько маршрутов с разными метриками**

```bash
configure
# Основной путь с низкой метрикой
set protocols static mroute 10.200.0.0/16 next-hop 192.168.1.1 distance 10

# Резервный путь с высокой метрикой
set protocols static mroute 10.200.0.0/16 next-hop 192.168.2.1 distance 20
commit
save
```

**Пример 3: Маршрут через интерфейс**

```bash
configure
# Multicast-трафик от источников в 172.16.0.0/12 ожидается на eth1
set protocols static mroute 172.16.0.0/12 interface eth1
commit
save
```

### Важные замечания

**Предостережение**: Статические multicast-маршруты следует использовать с осторожностью. В большинстве случаев они не требуются, так как динамические протоколы маршрутизации (PIM) автоматически обрабатывают RPF.

**Ограничения**:
- Маршруты используются только для RPF-проверок
- Не вставляются в таблицу маршрутизации ядра
- Не обрабатываются ZEBRA для обычной маршрутизации
- Могут создавать "странные состояния" при неправильной настройке

**Применение**:
- Разрешение конфликтов RPF в сложных топологиях
- Переопределение unicast-маршрутов для multicast-трафика
- Поддержка асимметричной маршрутизации

## Multicast Forwarding (MFIB)

### Таблица многоадресной пересылки

MFIB (Multicast Forwarding Information Base) - структура данных, используемая для пересылки multicast-пакетов.

**Ключевые элементы**:
- **(S,G) entries**: запись для конкретного источника и группы
- **(*,G) entries**: запись для всех источников определенной группы
- **IIF (Incoming Interface)**: интерфейс, с которого ожидается трафик
- **OIL (Outgoing Interface List)**: список интерфейсов для пересылки

### Состояния интерфейсов

**Incoming Interface (IIF)**:
- Определяется RPF-проверкой
- Только один IIF для каждого (S,G)
- Пакеты принимаются только с IIF

**Outgoing Interfaces (OIF)**:
- Интерфейсы с активными получателями
- Управляются IGMP/PIM
- Могут включать туннели и виртуальные интерфейсы

### Процесс пересылки

1. **Прием пакета**: проверка, что пакет пришел через IIF
2. **RPF check**: если провален - пакет отбрасывается
3. **TTL scope**: проверка TTL boundary
4. **Forwarding**: копирование пакета на все OIF из списка

## IGMP - Internet Group Management Protocol

IGMP управляет членством хостов в multicast-группах. VyOS поддерживает IGMPv2 и IGMPv3.

### Основные версии

**IGMPv2**:
- Поддержка базовых операций join/leave
- Выборы querier
- Быстрый leave process

**IGMPv3**:
- Source-Specific Multicast (SSM)
- Фильтрация по источникам (INCLUDE/EXCLUDE)
- Обратная совместимость с IGMPv2

### Конфигурация IGMP

**Включение IGMP на интерфейсе**:

```bash
set protocols igmp interface <интерфейс>
```

**Настройка версии IGMP**:

```bash
set protocols igmp interface <интерфейс> version <2|3>
```

**Query интервалы**:

```bash
# Query interval (секунды, по умолчанию 125)
set protocols igmp interface <интерфейс> query-interval <секунды>

# Query max-response-time (десятые доли секунды, по умолчанию 100)
set protocols igmp interface <интерфейс> query-max-response-time <значение>
```

**Настройки join**:

```bash
# Статическое присоединение к группе
set protocols igmp interface <интерфейс> join <group-address>

# Присоединение с указанием источника (SSM)
set protocols igmp interface <интерфейс> join <group-address> source <source-address>
```

### Пример конфигурации IGMP

```bash
configure

# Настройка IGMP на LAN интерфейсе
set protocols igmp interface eth1
set protocols igmp interface eth1 version 3
set protocols igmp interface eth1 query-interval 125
set protocols igmp interface eth1 query-max-response-time 100

# Статическое присоединение (для тестирования)
set protocols igmp interface eth1 join 239.1.1.1

commit
save
```

## PIM - Protocol Independent Multicast

PIM обеспечивает маршрутизацию multicast-трафика между маршрутизаторами. VyOS поддерживает PIM-SM (Sparse Mode) и PIM-SSM (Source-Specific Multicast).

### Режимы работы PIM

**PIM-SM (Sparse Mode)**:
- Использует Rendezvous Point (RP)
- Эффективен для разреженного распределения получателей
- Поддерживает (*,G) и (S,G) деревья

**PIM-SSM (Source-Specific Multicast)**:
- Только (S,G) деревья
- Не требует RP
- Диапазон адресов: 232.0.0.0/8
- Требует IGMPv3

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

**Включение PIM**:

```bash
set protocols pim interface <интерфейс>
```

**Настройка RP (для PIM-SM)**:

```bash
# Статический RP
set protocols pim rp address <IP-адрес>

# RP для определенных групп
set protocols pim rp address <IP-адрес> group <адрес-группы/префикс>
```

**Настройка SSM диапазона**:

```bash
set protocols pim ssm-range <префикс>
```

**Keep-alive timer**:

```bash
set protocols pim interface <интерфейс> hello-interval <секунды>
set protocols pim interface <интерфейс> dead-interval <секунды>
```

### Расширенные настройки PIM

**DR Priority**:

```bash
# Приоритет Designated Router (по умолчанию 1)
set protocols pim interface <интерфейс> dr-priority <0-4294967295>
```

**Регистрация в RP**:

```bash
# Подавление null-register
set protocols pim register-suppress-time <секунды>
```

**BSR (Bootstrap Router)**:

```bash
# Настройка BSR кандидата
set protocols pim bsr-candidate interface <интерфейс>
set protocols pim bsr-candidate priority <0-255>
```

### Пример конфигурации PIM-SM

```bash
configure

# Включение PIM на интерфейсах
set protocols pim interface eth0
set protocols pim interface eth1
set protocols pim interface eth2

# Настройка интервалов hello
set protocols pim interface eth0 hello-interval 30
set protocols pim interface eth1 hello-interval 30
set protocols pim interface eth2 hello-interval 30

# Настройка Rendezvous Point
set protocols pim rp address 10.0.0.1
set protocols pim rp address 10.0.0.1 group 239.0.0.0/8

# Настройка DR priority на upstream интерфейсе
set protocols pim interface eth0 dr-priority 100

commit
save
```

### Пример конфигурации PIM-SSM

```bash
configure

# Включение PIM на интерфейсах
set protocols pim interface eth0
set protocols pim interface eth1

# Настройка SSM диапазона
set protocols pim ssm-range 232.0.0.0/8

# IGMP версия 3 обязательна для SSM
set protocols igmp interface eth1 version 3

commit
save
```

## SSM - Source-Specific Multicast

SSM является улучшенной моделью multicast, где получатели явно указывают источники, от которых хотят получать данные.

### Преимущества SSM

**Безопасность**:
- Получатели выбирают только доверенные источники
- Предотвращение DoS атак через неизвестные источники

**Простота**:
- Не требует Rendezvous Point
- Упрощенная конфигурация
- Только SPT деревья (S,G)

**Эффективность**:
- Оптимальные пути от источника к получателям
- Нет начального периода на RPT

### Диапазоны адресов SSM

**IPv4**: 232.0.0.0/8
- Стандартизирован RFC 4607
- Зарезервирован только для SSM

**Пример распределения**:
- 232.0.0.0/24 - локальные тесты
- 232.1.0.0/16 - корпоративное использование
- 232.2.0.0/16 - провайдерские сервисы

### Конфигурация SSM

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

```bash
configure

# Настройка IGMP v3 на клиентских интерфейсах
set protocols igmp interface eth1 version 3
set protocols igmp interface eth2 version 3

# Включение PIM
set protocols pim interface eth0
set protocols pim interface eth1
set protocols pim interface eth2

# Определение SSM диапазона
set protocols pim ssm-range 232.0.0.0/8

# Опционально: добавление custom диапазонов
set protocols pim ssm-range 239.232.0.0/16

commit
save
```

**Статическое присоединение (SSM)**:

```bash
# Клиент присоединяется к группе с конкретным источником
set protocols igmp interface eth1 join 232.1.1.1 source 10.100.50.10
```

## Практические примеры

### Пример 1: IPTV распространение в Yandex Cloud

**Сценарий**: Провайдер IPTV в Yandex Cloud распространяет телевизионные каналы пользователям в разных подсетях.

**Топология**:
- Источник IPTV: 10.100.50.10
- Multicast группы: 239.1.1.0/24 (каналы)
- VyOS маршрутизатор: граничный шлюз
- Клиентские сети: 10.200.1.0/24, 10.200.2.0/24

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

```bash
configure

# Интерфейсы
# eth0 - uplink к источнику IPTV
# eth1 - клиентская сеть 1
# eth2 - клиентская сеть 2

# Включение IGMP на клиентских интерфейсах
set protocols igmp interface eth1 version 3
set protocols igmp interface eth1 query-interval 125
set protocols igmp interface eth1 query-max-response-time 100

set protocols igmp interface eth2 version 3
set protocols igmp interface eth2 query-interval 125
set protocols igmp interface eth2 query-max-response-time 100

# Включение PIM на всех интерфейсах
set protocols pim interface eth0
set protocols pim interface eth1
set protocols pim interface eth2

# Настройка hello интервалов
set protocols pim interface eth0 hello-interval 30
set protocols pim interface eth1 hello-interval 30
set protocols pim interface eth2 hello-interval 30

# Настройка RP (сам маршрутизатор)
set protocols pim rp address 10.100.1.1
set protocols pim rp address 10.100.1.1 group 239.1.0.0/16

# Повышение DR priority на uplink
set protocols pim interface eth0 dr-priority 100

# Оптимизация: статический mroute для RPF
set protocols static mroute 10.100.50.0/24 interface eth0

# Настройка firewall для multicast (если требуется)
set firewall group network-group MULTICAST_SOURCES network 10.100.50.0/24
set firewall name WAN_IN rule 100 action accept
set firewall name WAN_IN rule 100 source group network-group MULTICAST_SOURCES
set firewall name WAN_IN rule 100 destination address 239.0.0.0/8
set firewall name WAN_IN rule 100 protocol udp

commit
save
```

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

```bash
# Проверка IGMP групп
show ip igmp groups

# Проверка PIM соседей
show ip pim neighbor

# Проверка multicast маршрутов
show ip mroute

# Проверка конкретной группы
show ip mroute 239.1.1.10

# Статистика IGMP
show ip igmp interface eth1

# PIM интерфейсы
show ip pim interface
```

### Пример 2: Видеоконференции в VK Cloud

**Сценарий**: Корпоративная система видеоконференций использует SSM для распространения видеопотоков между филиалами в VK Cloud.

**Топология**:
- Офис A: 192.168.10.0/24
- Офис B: 192.168.20.0/24
- Офис C: 192.168.30.0/24
- SSM диапазон: 232.10.0.0/16
- VyOS роутеры в каждом офисе

**Конфигурация (центральный маршрутизатор)**:

```bash
configure

# Интерфейсы к филиалам
# eth1 - Офис A (192.168.10.0/24)
# eth2 - Офис B (192.168.20.0/24)
# eth3 - Офис C (192.168.30.0/24)

# IGMP версия 3 обязательна для SSM
set protocols igmp interface eth1 version 3
set protocols igmp interface eth2 version 3
set protocols igmp interface eth3 version 3

# Короткие query интервалы для быстрого реагирования
set protocols igmp interface eth1 query-interval 60
set protocols igmp interface eth2 query-interval 60
set protocols igmp interface eth3 query-interval 60

# Включение PIM
set protocols pim interface eth1
set protocols pim interface eth2
set protocols pim interface eth3

# Настройка SSM диапазона
set protocols pim ssm-range 232.0.0.0/8
set protocols pim ssm-range 232.10.0.0/16

# Короткие hello интервалы для быстрой сходимости
set protocols pim interface eth1 hello-interval 15
set protocols pim interface eth2 hello-interval 15
set protocols pim interface eth3 hello-interval 15

# QoS для multicast трафика (опционально)
set qos policy shaper OFFICE_OUT bandwidth 100mbit
set qos policy shaper OFFICE_OUT class 10 bandwidth 50mbit
set qos policy shaper OFFICE_OUT class 10 match VIDEO_CONFERENCE ip destination address 232.10.0.0/16
set qos policy shaper OFFICE_OUT class 10 priority 1
set qos policy shaper OFFICE_OUT default bandwidth 50mbit

set interfaces ethernet eth1 qos-policy out OFFICE_OUT
set interfaces ethernet eth2 qos-policy out OFFICE_OUT
set interfaces ethernet eth3 qos-policy out OFFICE_OUT

commit
save
```

**Конфигурация клиента (для тестирования)**:

На Linux клиенте для присоединения к SSM группе:

```bash
# Утилита для SSM join
ip maddr add 232.10.1.1 dev eth0

# Или с указанием источника (IGMPv3)
# Требуется специальное приложение, поддерживающее SSM
# Например, VLC с параметрами:
vlc udp://@232.10.1.1:5000 --miface=eth0 --program-ssrc=192.168.10.100
```

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

```bash
# Проверка (S,G) записей
show ip mroute

# Должны видеть записи вида:
# (192.168.10.100, 232.10.1.1)
# (192.168.20.50, 232.10.1.2)

# Проверка IGMP групп с источниками
show ip igmp groups

# PIM upstream состояние
show ip pim upstream

# Статистика по группе
show ip mroute 232.10.1.1
```

### Пример 3: Комплексная конфигурация с несколькими RP

**Сценарий**: Крупная сеть с разделением multicast доменов и резервированием RP.

```bash
configure

# ========================================
# Базовые настройки интерфейсов
# ========================================

# Upstream интерфейсы
set protocols igmp interface eth0
set protocols igmp interface eth0 version 3
set protocols pim interface eth0
set protocols pim interface eth0 dr-priority 100

# Downstream интерфейсы
set protocols igmp interface eth1 version 3
set protocols igmp interface eth2 version 3
set protocols igmp interface eth3 version 3

set protocols pim interface eth1
set protocols pim interface eth2
set protocols pim interface eth3

# ========================================
# Настройка множественных RP
# ========================================

# Основной RP для общих групп
set protocols pim rp address 10.0.1.1
set protocols pim rp address 10.0.1.1 group 239.0.0.0/16

# Специализированный RP для видео (239.1.x.x)
set protocols pim rp address 10.0.2.1
set protocols pim rp address 10.0.2.1 group 239.1.0.0/16

# RP для аудио (239.2.x.x)
set protocols pim rp address 10.0.3.1
set protocols pim rp address 10.0.3.1 group 239.2.0.0/16

# SSM диапазон (без RP)
set protocols pim ssm-range 232.0.0.0/8

# ========================================
# Статические mroute для управления RPF
# ========================================

# Источники видео
set protocols static mroute 10.100.0.0/16 next-hop 10.0.1.254 distance 10

# Резервный путь
set protocols static mroute 10.100.0.0/16 next-hop 10.0.2.254 distance 20

# ========================================
# Оптимизация таймеров
# ========================================

# Быстрая сходимость на критичных интерфейсах
set protocols pim interface eth0 hello-interval 15
set protocols pim interface eth1 hello-interval 30
set protocols pim interface eth2 hello-interval 30
set protocols pim interface eth3 hello-interval 30

# IGMP query оптимизация
set protocols igmp interface eth1 query-interval 60
set protocols igmp interface eth2 query-interval 60
set protocols igmp interface eth3 query-interval 60

# ========================================
# Логирование и отладка
# ========================================

# Включение логов PIM (опционально, для отладки)
# set protocols pim log-neighbor-changes

commit
save
```

## Команды проверки и мониторинга

### Основные команды show

**Multicast routing table**:

```bash
# Полная таблица multicast маршрутов
show ip mroute

# Конкретная группа
show ip mroute 239.1.1.1

# Только active источники
show ip mroute active

# Подробная информация
show ip mroute detail

# Статистика
show ip mroute count
```

**Вывод show ip mroute**:

```
IP Multicast Routing Table
Flags: S - Sparse, C - Connected, P - Pruned
       R - RP-bit set, F - Register flag, T - SPT-bit set

(10.100.50.10, 239.1.1.1), uptime 00:15:23, flags: SCT
  Incoming interface: eth0, RPF neighbor 10.100.1.254
  Outgoing interface list:
    eth1, uptime 00:15:23, PIM
    eth2, uptime 00:10:15, PIM

(*, 239.1.1.1), uptime 00:20:45, flags: SC
  Incoming interface: eth0, RPF neighbor 10.0.1.1
  Outgoing interface list:
    eth1, uptime 00:20:45, PIM
    eth2, uptime 00:18:30, PIM
```

**IGMP информация**:

```bash
# Все IGMP группы
show ip igmp groups

# Группы на конкретном интерфейсе
show ip igmp interface eth1

# IGMP sources (для IGMPv3/SSM)
show ip igmp sources

# Статистика IGMP
show ip igmp statistics
```

**PIM информация**:

```bash
# PIM соседи
show ip pim neighbor

# PIM интерфейсы
show ip pim interface

# PIM RP информация
show ip pim rp-info

# Upstream состояние
show ip pim upstream

# BSR информация (если используется)
show ip pim bsr

# PIM топология для группы
show ip pim join
```

**Статические mroute**:

```bash
# Отображение статических multicast маршрутов
show ip mroute static

# Или через общую команду
run show configuration commands | grep "protocols static mroute"
```

### Команды отладки

**Включение отладки PIM**:

```bash
# ВНИМАНИЕ: генерирует много логов!
configure
set system syslog global facility all level debug
commit

# Просмотр логов
monitor log messages
```

**Отладка конкретных компонентов** (через vtysh):

```bash
# Войти в FRR shell
vtysh

# PIM отладка
debug pim events
debug pim packets
debug pim trace

# IGMP отладка
debug igmp events
debug igmp packets
debug igmp trace

# Multicast forwarding
debug mroute
debug mroute detail

# Отключение отладки
no debug pim events
no debug igmp events

# Выход
exit
```

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

```bash
# Проверка RPF для конкретного источника
show ip rpf 10.100.50.10

# Вывод:
# RPF information for 10.100.50.10
#   RPF interface: eth0
#   RPF address: 10.100.1.254
#   RPF metric: 10
#   RPF protocol: Static Mroute
```

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

**Наблюдение за изменениями**:

```bash
# Мониторинг лога в реальном времени
monitor log messages

# Отслеживание изменений в mroute
watch -n 2 'vtysh -c "show ip mroute"'

# Мониторинг IGMP присоединений
watch -n 5 'vtysh -c "show ip igmp groups"'
```

**Тестирование multicast**:

```bash
# На отправителе (source)
# Отправка multicast пакетов (требует установки утилит)
# mcast-sender -g 239.1.1.1 -p 5000

# На получателе (receiver)
# Присоединение к группе
# ip maddr add 239.1.1.1 dev eth0
# mcast-receiver -g 239.1.1.1 -p 5000

# Или использовать VLC
# vlc udp://@239.1.1.1:5000
```

## Troubleshooting - Устранение неисправностей

### Общие проблемы

#### Проблема 1: Нет multicast трафика

**Симптомы**:
- Клиенты не получают multicast поток
- `show ip mroute` пуст или нет нужных записей

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

```bash
# Шаг 1: Проверить IGMP группы
show ip igmp groups
# Должны видеть группы на downstream интерфейсах

# Шаг 2: Проверить PIM соседей
show ip pim neighbor
# Должны быть соседи на всех PIM интерфейсах

# Шаг 3: Проверить RPF
show ip rpf <source-ip>
# RPF interface должен указывать на правильный upstream

# Шаг 4: Проверить firewall
show firewall name <rule-set> statistics
# Убедиться, что multicast трафик не блокируется

# Шаг 5: Проверить интерфейсы PIM
show ip pim interface
# Все интерфейсы должны быть UP
```

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

```bash
# Если нет IGMP групп - проверить версию IGMP
configure
set protocols igmp interface eth1 version 3
commit

# Если нет PIM соседей - проверить конфигурацию
show configuration protocols pim
set protocols pim interface eth0
commit

# Если RPF неправильный - добавить static mroute
set protocols static mroute <source-network> next-hop <correct-gateway>
commit

# Если firewall блокирует - добавить правила
set firewall name WAN_IN rule 100 action accept
set firewall name WAN_IN rule 100 protocol pim
set firewall name WAN_IN rule 100 description "Allow PIM protocol"

set firewall name WAN_IN rule 101 action accept
set firewall name WAN_IN rule 101 protocol igmp
set firewall name WAN_IN rule 101 description "Allow IGMP protocol"

set firewall name WAN_IN rule 102 action accept
set firewall name WAN_IN rule 102 destination address 224.0.0.0/4
set firewall name WAN_IN rule 102 description "Allow multicast traffic"
commit
save
```

#### Проблема 2: RPF failures

**Симптомы**:
- В логах: "RPF failure for (S,G)"
- `show ip mroute` показывает записи, но без outgoing interfaces

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

```bash
# Проверить RPF для источника
show ip rpf <source-ip>

# Проверить unicast маршрут к источнику
show ip route <source-ip>

# Проверить static mroute (если используются)
run show configuration commands | grep mroute
```

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

```bash
configure

# Вариант 1: Добавить static mroute
set protocols static mroute <source-network> interface <correct-interface>

# Вариант 2: Изменить метрику существующего маршрута
set protocols static mroute <source-network> next-hop <gateway> distance 5

# Вариант 3: Использовать route-map для изменения RPF
# (более сложный сценарий, обычно не требуется)

commit
save
```

#### Проблема 3: SSM не работает

**Симптомы**:
- IGMPv3 клиенты не могут присоединиться к SSM группам
- Нет (S,G) записей для SSM диапазона

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

```bash
# Проверить версию IGMP
show ip igmp interface

# Проверить SSM диапазон
run show configuration commands | grep "pim ssm-range"

# Проверить IGMP sources
show ip igmp sources
```

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

```bash
configure

# Убедиться, что IGMPv3 включена
set protocols igmp interface eth1 version 3

# Настроить SSM диапазон
set protocols pim ssm-range 232.0.0.0/8

# Проверить, что клиент использует правильный SSM диапазон
# (232.0.0.0/8 для IPv4)

commit
save
```

#### Проблема 4: Медленная сходимость

**Симптомы**:
- Долгое время до начала получения multicast
- Задержки при переключении источников

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

```bash
# Проверить таймеры IGMP
show ip igmp interface detail

# Проверить PIM hello интервалы
show ip pim interface detail
```

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

```bash
configure

# Уменьшить IGMP query interval
set protocols igmp interface eth1 query-interval 60
set protocols igmp interface eth1 query-max-response-time 50

# Уменьшить PIM hello interval
set protocols pim interface eth0 hello-interval 15

# Для критичных сценариев можно еще меньше:
# set protocols igmp interface eth1 query-interval 30
# set protocols pim interface eth0 hello-interval 10

commit
save
```

#### Проблема 5: Duplicate packets

**Симптомы**:
- Клиенты получают дублирующиеся multicast пакеты
- Сетевая петля в multicast топологии

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

```bash
# Проверить топологию PIM
show ip pim neighbor

# Проверить DR (Designated Router)
show ip pim interface

# Проверить наличие петель
show ip mroute detail
# Искать одинаковые (S,G) на разных интерфейсах с одинаковым uptime
```

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

```bash
configure

# Установить правильный DR priority
# Более высокий priority = предпочтительный DR
set protocols pim interface eth0 dr-priority 100
set protocols pim interface eth1 dr-priority 10

# Проверить правильность RPF
show ip rpf <source-ip>

# Если необходимо, исправить static mroute
delete protocols static mroute <incorrect-route>
set protocols static mroute <source-network> interface <correct-interface>

commit
save
```

### Команды для расширенной диагностики

**PIM assert механизм**:

```bash
# Проверить PIM assert состояние (через vtysh)
vtysh -c "show ip pim assert"

# Проверить metric для assert
vtysh -c "show ip pim assert-metric"
```

**Multicast VIF (Virtual Interface)**:

```bash
# Просмотр multicast virtual interfaces
vtysh -c "show ip multicast vif"
```

**PIM register состояние**:

```bash
# Проверить состояние регистрации на RP
vtysh -c "show ip pim state"
```

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

### Проектирование сети

1. **Планирование адресного пространства**:
   - Используйте 239.0.0.0/8 для частных multicast групп
   - 232.0.0.0/8 резервируйте для SSM
   - Документируйте назначение групп

2. **Размещение RP**:
   - RP должен быть в стабильной, центральной точке сети
   - Рассмотрите anycast RP для отказоустойчивости
   - Используйте разные RP для разных диапазонов групп

3. **Topology дизайн**:
   - Минимизируйте количество hops от источников к получателям
   - Избегайте asymmetric routing для multicast
   - Используйте dedicated links для high-bandwidth multicast

### Конфигурация

1. **Использование SSM где возможно**:
   - SSM проще и безопаснее PIM-SM
   - Не требует RP configuration
   - Оптимальная маршрутизация

2. **Настройка таймеров**:
   - Балансируйте между быстрой сходимостью и overhead
   - Для критичных приложений: короткие интервалы
   - Для стабильных сетей: стандартные значения

3. **Static mroute**:
   - Используйте только при необходимости
   - Документируйте причину каждого static mroute
   - Регулярно проверяйте актуальность

4. **Firewall правила**:
   - Разрешите протоколы: IGMP (2), PIM (103)
   - Разрешите multicast адреса (224.0.0.0/4)
   - Используйте rate limiting для защиты от floods

### Безопасность

1. **Контроль источников**:
   - Ограничивайте, какие источники могут отправлять multicast
   - Используйте SSM для явного указания источников
   - Фильтруйте на edge маршрутизаторах

2. **Scope ограничения**:
   - Используйте TTL scoping для ограничения области
   - Административные границы для групп
   - Фильтрация на границах доменов

3. **Rate limiting**:
   - Ограничивайте bandwidth для multicast
   - Используйте QoS для приоритизации
   - Мониторинг аномального трафика

**Пример firewall с защитой**:

```bash
configure

# Группа разрешенных multicast источников
set firewall group network-group MULTICAST_SOURCES network 10.100.0.0/16
set firewall group network-group MULTICAST_SOURCES network 10.200.0.0/16

# Группа разрешенных multicast адресов
set firewall group network-group MULTICAST_GROUPS network 239.1.0.0/16
set firewall group network-group MULTICAST_GROUPS network 232.0.0.0/8

# Правила на входящем интерфейсе
set firewall name WAN_IN default-action drop

# Разрешить IGMP
set firewall name WAN_IN rule 10 action accept
set firewall name WAN_IN rule 10 protocol igmp
set firewall name WAN_IN rule 10 description "IGMP traffic"

# Разрешить PIM
set firewall name WAN_IN rule 20 action accept
set firewall name WAN_IN rule 20 protocol pim
set firewall name WAN_IN rule 20 description "PIM protocol"

# Разрешить multicast от доверенных источников
set firewall name WAN_IN rule 100 action accept
set firewall name WAN_IN rule 100 source group network-group MULTICAST_SOURCES
set firewall name WAN_IN rule 100 destination group network-group MULTICAST_GROUPS
set firewall name WAN_IN rule 100 protocol udp
set firewall name WAN_IN rule 100 description "Allowed multicast traffic"

# Rate limit для защиты от флуда
set firewall name WAN_IN rule 100 limit rate 50/second

# Логировать отброшенный multicast (для мониторинга)
set firewall name WAN_IN rule 999 action drop
set firewall name WAN_IN rule 999 destination address 224.0.0.0/4
set firewall name WAN_IN rule 999 log enable
set firewall name WAN_IN rule 999 description "Log dropped multicast"

commit
save
```

### Мониторинг и обслуживание

1. **Регулярные проверки**:
   - Мониторинг `show ip mroute count` на аномалии
   - Проверка PIM соседей на стабильность
   - Анализ логов на errors

2. **Baseline метрики**:
   - Запишите нормальное количество (S,G) записей
   - Нормальное количество IGMP групп
   - Обычный bandwidth multicast трафика

3. **Alerting**:
   - Уведомления при потере PIM соседей
   - Alerts на резкие изменения в mroute count
   - Мониторинг CPU/memory при большом multicast

4. **Документация**:
   - Схема multicast топологии
   - Назначение RP
   - Распределение multicast групп по приложениям
   - Процедуры troubleshooting

### Оптимизация производительности

1. **SPT switchover**:
   - Настройте порог переключения на SPT
   - Для high-bandwidth источников используйте немедленный SPT

2. **IGMP snooping**:
   - Включите на switches для оптимизации L2 flooding
   - Убедитесь в совместимости с IGMPv3

3. **Multicast VPN**:
   - Для inter-site multicast рассмотрите MVPN
   - Используйте draft-rosen или next-generation MVPN

4. **Buffer tuning**:
   - Увеличьте буферы для high-throughput multicast
   - Настройте queue management

**Пример оптимизации**:

```bash
configure

# Немедленный переход на SPT для всех групп
# (требует поддержки в FRR, проверить версию)
# set protocols pim spt-switchover infinity-and-beyond immediate

# QoS для multicast (приоритизация)
set qos policy shaper MULTICAST_SHAPER bandwidth 500mbit
set qos policy shaper MULTICAST_SHAPER class 10 bandwidth 400mbit
set qos policy shaper MULTICAST_SHAPER class 10 match MCAST destination address 224.0.0.0/4
set qos policy shaper MULTICAST_SHAPER class 10 priority 1
set qos policy shaper MULTICAST_SHAPER class 10 queue-type fair-queue

set interfaces ethernet eth1 qos-policy out MULTICAST_SHAPER

commit
save
```

## Интеграция с другими протоколами

### OSPF и PIM

Multicast RPF использует unicast routing table. При использовании OSPF:

```bash
configure

# OSPF для unicast
set protocols ospf area 0 network 10.0.0.0/8

# PIM использует OSPF routes для RPF
set protocols pim interface eth0
set protocols pim interface eth1

# RPF будет автоматически использовать OSPF маршруты
commit
save
```

### BGP и Multicast

Для inter-AS multicast:

```bash
configure

# BGP для unicast connectivity
set protocols bgp system-as 65001
set protocols bgp neighbor 192.168.1.1 remote-as 65002

# MSDP для обмена источниками между AS (если требуется)
# Настройка через vtysh, так как VyOS может не иметь прямой поддержки

# PIM для intra-AS multicast
set protocols pim interface eth0
set protocols pim interface eth1

commit
save
```

### VRF и Multicast

VyOS с FRR поддерживает multicast в VRF context (в новых версиях):

```bash
configure

# Создание VRF
set vrf name CUSTOMER-A table 100

# Назначение интерфейсов
set interfaces ethernet eth2 vrf CUSTOMER-A

# Multicast в VRF context может требовать настройки через vtysh
# vtysh
# configure terminal
# vrf CUSTOMER-A
#  ip multicast-routing
#  exit
# interface eth2 vrf CUSTOMER-A
#  ip pim
#  ip igmp
#  exit

commit
save
```

## Справочная информация

### Multicast адреса

**Зарезервированные диапазоны**:
- 224.0.0.0/24 - локальная сеть (не маршрутизируется)
  - 224.0.0.1 - все хосты в подсети
  - 224.0.0.2 - все маршрутизаторы
  - 224.0.0.5 - OSPF AllSPFRouters
  - 224.0.0.6 - OSPF AllDRouters
  - 224.0.0.13 - PIM Hello
- 224.0.1.0/24 - internetwork control
- 232.0.0.0/8 - Source-Specific Multicast (SSM)
- 233.0.0.0/8 - GLOP addressing (AS-based)
- 239.0.0.0/8 - административно ограниченные (организационные)

### Протокольные номера

- **IGMP**: IP protocol 2
- **PIM**: IP protocol 103

### Стандартные таймеры

**IGMP**:
- Query Interval: 125 секунд
- Query Response Time: 10 секунд
- Group Membership Timeout: 260 секунд
- Last Member Query Count: 2
- Last Member Query Interval: 1 секунда

**PIM**:
- Hello Interval: 30 секунд
- Hold Time: 105 секунд (3.5 * Hello)
- Join/Prune Interval: 60 секунд
- Register Suppress Time: 60 секунд

### Полезные ссылки

**RFC документы**:
- RFC 4601 - PIM-SM
- RFC 3376 - IGMPv3
- RFC 4607 - SSM
- RFC 5059 - Bootstrap Router (BSR)
- RFC 3618 - MSDP
- RFC 4610 - Anycast-RP using PIM

**VyOS документация**:
- https://docs.vyos.io/en/latest/configuration/protocols/multicast.html
- https://docs.vyos.io/en/latest/configuration/protocols/pim.html
- https://docs.vyos.io/en/latest/configuration/protocols/igmp.html

**FRRouting документация**:
- https://docs.frrouting.org/en/latest/pim.html
- https://docs.frrouting.org/en/latest/multicast.html

## Заключение

Многоадресная маршрутизация в VyOS предоставляет мощный инструментарий для эффективного распространения потокового контента. Правильная конфигурация PIM, IGMP и статических multicast маршрутов обеспечивает:

- Эффективное использование пропускной способности
- Масштабируемость для большого числа получателей
- Низкую задержку доставки
- Безопасность через SSM и фильтрацию

**Ключевые моменты**:
1. Используйте SSM (232.0.0.0/8) где возможно для упрощения и безопасности
2. Статические mroute применяйте только при необходимости
3. Тщательно планируйте размещение RP для PIM-SM
4. Регулярно мониторьте состояние multicast маршрутизации
5. Документируйте конфигурацию и назначение групп

При правильной реализации VyOS обеспечивает надежную платформу для enterprise multicast сервисов в облачных и on-premise средах.

