# IGMP Proxy - Internet Group Management Protocol Proxy

> Настройка IGMP Proxy на VyOS: multicast маршрутизация, upstream/downstream интерфейсы, IPTV, видео стриминг для Yandex Cloud и VK Cloud

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


IGMP Proxy позволяет маршрутизировать multicast трафик между различными сегментами сети, действуя как прокси для IGMP сообщений от клиентов.

## Обзор

IGMP (Internet Group Management Protocol) - протокол управления multicast группами в IPv4 сетях.

**IGMP Proxy**:
- Отправляет IGMP host сообщения от имени подключенных клиентов
- Обеспечивает multicast маршрутизацию без полноценного multicast routing протокола
- Простая альтернатива PIM (Protocol Independent Multicast)
- Используется для распределения IPTV, видео стриминга, конференций

**Стандарты**:
- **RFC 2236** - IGMPv2
- **RFC 3376** - IGMPv3
- **RFC 9776** - IGMPv3 обновление (2025)

**Применение**:
- IPTV сервисы
- Видео конференции
- Multicast потоковое видео
- Корпоративные вещательные приложения
- Финансовые данные (market data feeds)

## Как работает IGMP

### IGMP в сети

**IGMP версии**:

**IGMPv1** (RFC 1112):
- Базовая функциональность
- Только Join сообщения
- Устаревшая версия

**IGMPv2** (RFC 2236):
- Leave Group сообщения
- Querier election механизм
- Max Response Time поле
- Быстрое удаление из группы

**IGMPv3** (RFC 3376, RFC 9776):
- Source-Specific Multicast (SSM)
- Include/Exclude режимы
- Фильтрация по источникам

### IGMP Сообщения

**Membership Query**:
- Отправляется роутером для обнаружения членов группы
- General Query - для всех групп
- Group-Specific Query - для конкретной группы

**Membership Report**:
- Отправляется хостом для присоединения к группе
- Периодические обновления

**Leave Group** (IGMPv2+):
- Хост покидает multicast группу
- Быстрое удаление подписки

### Multicast Адреса

**Диапазон IPv4 multicast**: 224.0.0.0/4 (224.0.0.0 - 239.255.255.255)

**Специальные адреса**:
- **224.0.0.1** - All Hosts (все хосты в subnet)
- **224.0.0.2** - All Routers (все роутеры)
- **224.0.0.5** - OSPF All Routers
- **224.0.0.6** - OSPF Designated Routers
- **224.0.0.9** - RIPv2
- **224.0.0.22** - IGMP
- **224.0.0.251** - mDNS
- **224.0.0.252** - LLMNR

**Organization-Local**: 239.0.0.0/8 - для частного использования

**IPTV диапазоны** (примеры):
- 233.0.0.0/8 - SSM диапазон
- 239.x.x.x - Organization-local

## IGMP Proxy Концепция

### Архитектура

**Upstream Interface** - входящий интерфейс:
- Подключен к источнику multicast трафика
- Коммуницирует с multicast источниками данных
- Может быть только **один** upstream интерфейс
- Обычно WAN интерфейс или интерфейс провайдера

**Downstream Interface** - исходящие интерфейсы:
- Подключены к клиентским сетям
- Распределяют multicast данные к получателям
- Может быть **один или несколько** downstream интерфейсов
- Обычно LAN интерфейсы

**Работа прокси**:
1. Клиент отправляет IGMP Join на downstream интерфейс
2. IGMP Proxy получает Join и запоминает подписку
3. Прокси отправляет IGMP Join на upstream интерфейс (от своего имени)
4. Multicast источник начинает отправлять трафик
5. Прокси пересылает multicast пакеты на downstream интерфейсы с активными подписками
6. При IGMP Leave прокси обновляет подписки

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

**IGMP Proxy vs Full Multicast Routing** (PIM):

| Характеристика | IGMP Proxy | PIM |
|---------------|------------|-----|
| Сложность конфигурации | Низкая | Высокая |
| Ресурсы | Минимальные | Значительные |
| Топология | Простая | Любая |
| Масштабируемость | Ограниченная | Высокая |
| Применение | Edge networks | Core networks |

**Когда использовать IGMP Proxy**:
- Простая топология (один источник, несколько приемников)
- Домашние/офисные сети
- IPTV от провайдера
- Ограниченные ресурсы

**Когда использовать PIM**:
- Сложная топология
- Множество источников
- Redundancy требуется
- Data center multicast

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

### Простая IGMP Proxy

**Сценарий**: IPTV от провайдера через eth0 (WAN), клиенты в eth1 (LAN).

```
set protocols igmp-proxy interface eth0 role upstream
set protocols igmp-proxy interface eth1 role downstream

commit
save
```

**Объяснение**:
- **eth0** (upstream) - подключен к IPTV провайдеру
- **eth1** (downstream) - LAN с IPTV клиентами

### Проверка базовой конфигурации

```
show protocols igmp-proxy
```

Вывод:
```
interface eth0 {
    role upstream
}
interface eth1 {
    role downstream
}
```

Просмотр активных multicast групп:
```
show igmp groups
```

Вывод:
```
Interface        Address         Group           Uptime
eth1             192.168.1.254   239.0.1.10      00:05:23
eth1             192.168.1.254   239.0.1.11      00:03:45
```

### Restart IGMP Proxy

После изменения конфигурации:
```
restart igmp-proxy
```

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

### Alternate Subnets

**Назначение**: Определяет альтернативные источники для multicast трафика.

**Применение**:
- Источник multicast в другой подсети
- Трафик проходит через NAT
- Удаленные multicast источники

**Синтаксис**:
```
set protocols igmp-proxy interface <interface> alt-subnet <network>
```

**Пример**:
```
set protocols igmp-proxy interface eth0 role upstream
set protocols igmp-proxy interface eth0 alt-subnet 10.0.0.0/23
set protocols igmp-proxy interface eth0 alt-subnet 172.16.0.0/16
set protocols igmp-proxy interface eth1 role downstream

commit
save
```

**Когда использовать alt-subnet**:
- Multicast источник имеет адрес не из directly connected подсети
- Между upstream интерфейсом и источником есть роутер
- IPTV провайдер использует централизованные multicast серверы

### Множественные Downstream интерфейсы

**Сценарий**: Несколько LAN сегментов.

```
set protocols igmp-proxy interface eth0 role upstream

set protocols igmp-proxy interface eth1 role downstream
set protocols igmp-proxy interface eth2 role downstream
set protocols igmp-proxy interface eth3 role downstream

commit
save
```

**Применение**:
- Множество VLAN для клиентов
- Различные физические сегменты
- Разделение трафика по отделам

### Threshold (TTL)

**Threshold** - минимальный TTL для пересылки multicast пакетов на интерфейс.

**Синтаксис**:
```
set protocols igmp-proxy interface <interface> threshold <ttl>
```

**Пример**:
```
set protocols igmp-proxy interface eth0 role upstream
set protocols igmp-proxy interface eth0 threshold 1

set protocols igmp-proxy interface eth1 role downstream
set protocols igmp-proxy interface eth1 threshold 1

commit
save
```

**Значения TTL**:
- **1** - только локальная сеть (по умолчанию)
- **32** - в пределах организации
- **64** - в пределах региона
- **128** - в пределах континента
- **255** - глобально

**Применение**:
- Ограничение распространения multicast трафика
- Предотвращение утечки во внешние сети
- Контроль области действия

### Disable Quick Leave

**Quick Leave** - быстрое удаление из группы без дополнительных проверок.

**Отключение**:
```
set protocols igmp-proxy disable-quickleave

commit
save
```

**По умолчанию**: Quick Leave включен.

**Когда отключать**:
- Несколько клиентов на одном downstream интерфейсе
- Необходимо убедиться, что все клиенты покинули группу
- Предотвращение преждевременного прекращения потока

**Эффект отключения**:
- Прокси отправит Group-Specific Query перед удалением группы
- Задержка в несколько секунд при Leave

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

### Пример 1: IPTV от провайдера (Yandex Cloud)

**Сценарий**:
- VyOS роутер в Yandex Cloud
- WAN (eth0) - подключение к IPTV провайдеру (внешняя сеть)
- LAN (eth1) - клиентская сеть 192.168.1.0/24
- IPTV multicast группы в диапазоне 239.0.0.0/8

**Топология**:
```
[IPTV Provider] --- eth0 (WAN) --- [VyOS] --- eth1 (LAN) --- [IPTV Clients]
  10.100.0.0/24               192.168.1.0/24
  239.0.1.10 (Channel 1)
  239.0.1.11 (Channel 2)
```

**VyOS конфигурация**:
```
# Интерфейсы
set interfaces ethernet eth0 address 10.100.0.10/24
set interfaces ethernet eth0 description 'WAN - IPTV Provider'

set interfaces ethernet eth1 address 192.168.1.1/24
set interfaces ethernet eth1 description 'LAN - IPTV Clients'

# IGMP Proxy
set protocols igmp-proxy interface eth0 role upstream
set protocols igmp-proxy interface eth0 alt-subnet 10.0.0.0/8

set protocols igmp-proxy interface eth1 role downstream

# Firewall для IGMP
set firewall ipv4 input filter rule 100 action accept
set firewall ipv4 input filter rule 100 description 'Allow IGMP'
set firewall ipv4 input filter rule 100 protocol igmp

# Firewall для multicast трафика
set firewall ipv4 input filter rule 110 action accept
set firewall ipv4 input filter rule 110 description 'Allow multicast from provider'
set firewall ipv4 input filter rule 110 source address 10.100.0.0/24
set firewall ipv4 input filter rule 110 destination address 224.0.0.0/4

# NAT (если требуется)
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
# Исключаем multicast из NAT
set nat source rule 90 outbound-interface name eth0
set nat source rule 90 destination address 224.0.0.0/4
set nat source rule 90 translation address 10.100.0.10

# Static routes для multicast (если необходимо)
set protocols static route 239.0.0.0/8 interface eth0

commit
save
```

**Проверка**:
```
show protocols igmp-proxy
show igmp groups
show igmp interface eth1

# На клиенте
# Подписаться на канал: igmp join 239.0.1.10 eth1
# Проверить поток: tcpdump -i eth1 -n host 239.0.1.10
```

**Результат**:
- Клиенты в 192.168.1.0/24 могут подписываться на IPTV каналы
- Multicast трафик проходит через прокси
- Оптимизированная доставка (только активные подписки)

### Пример 2: Корпоративное видео вещание (VK Cloud)

**Сценарий**:
- VyOS в VK Cloud как multicast роутер
- Видео сервер в DMZ (eth0): 10.50.0.0/24
- Офис 1 (eth1): 192.168.10.0/24
- Офис 2 (eth2): 192.168.20.0/24
- Видео конференции в диапазоне 239.255.0.0/16

**Топология**:
```
[Video Server] --- eth0 (DMZ) --- [VyOS] --- eth1 (Office 1) --- [Users]
  10.50.0.10                             |
  239.255.1.100                          |
                                         --- eth2 (Office 2) --- [Users]
```

**VyOS конфигурация**:
```
# Интерфейсы
set interfaces ethernet eth0 address 10.50.0.1/24
set interfaces ethernet eth0 description 'DMZ - Video Servers'

set interfaces ethernet eth1 address 192.168.10.1/24
set interfaces ethernet eth1 description 'Office 1 - Users'

set interfaces ethernet eth2 address 192.168.20.1/24
set interfaces ethernet eth2 description 'Office 2 - Users'

# IGMP Proxy
set protocols igmp-proxy interface eth0 role upstream
set protocols igmp-proxy interface eth0 threshold 1

set protocols igmp-proxy interface eth1 role downstream
set protocols igmp-proxy interface eth1 threshold 1

set protocols igmp-proxy interface eth2 role downstream
set protocols igmp-proxy interface eth2 threshold 1

# Disable Quick Leave (множество клиентов)
set protocols igmp-proxy disable-quickleave

# Firewall для IGMP
set firewall ipv4 name LAN-TO-ROUTER rule 100 action accept
set firewall ipv4 name LAN-TO-ROUTER rule 100 description 'Allow IGMP from clients'
set firewall ipv4 name LAN-TO-ROUTER rule 100 protocol igmp

set firewall ipv4 input filter rule 100 action accept
set firewall ipv4 input filter rule 100 description 'Allow IGMP'
set firewall ipv4 input filter rule 100 protocol igmp

# Firewall для multicast потоков
set firewall ipv4 name DMZ-TO-LAN rule 100 action accept
set firewall ipv4 name DMZ-TO-LAN rule 100 description 'Allow multicast video'
set firewall ipv4 name DMZ-TO-LAN rule 100 source address 10.50.0.0/24
set firewall ipv4 name DMZ-TO-LAN rule 100 destination address 239.255.0.0/16

# QoS для видео трафика (опционально)
set qos policy shaper VIDEO-SHAPER bandwidth 100mbit
set qos policy shaper VIDEO-SHAPER default bandwidth 50%
set qos policy shaper VIDEO-SHAPER default queue-type fair-queue

set qos policy shaper VIDEO-SHAPER class 10 bandwidth 30%
set qos policy shaper VIDEO-SHAPER class 10 description 'Multicast Video'
set qos policy shaper VIDEO-SHAPER class 10 match MULTICAST ip destination address 239.255.0.0/16
set qos policy shaper VIDEO-SHAPER class 10 priority 1

set qos interface eth1 egress VIDEO-SHAPER
set qos interface eth2 egress VIDEO-SHAPER

commit
save
```

**Проверка**:
```
show protocols igmp-proxy
show igmp groups
show igmp interface
show igmp statistics

# Статистика QoS
show qos interface eth1
show qos interface eth2
```

**Мониторинг multicast трафика**:
```
# На роутере
tcpdump -i eth0 -n host 239.255.1.100

# Статистика интерфейсов
show interfaces ethernet eth0
show interfaces ethernet eth1
show interfaces ethernet eth2
```

### Пример 3: IGMP через VPN туннель

**Сценарий**:
- Главный офис с multicast источником
- Удаленный офис через IPsec VPN
- IGMP через VTI интерфейс

**Топология**:
```
[Multicast Source] --- eth1 --- [HQ VyOS] --- vti0 (VPN) --- [Remote VyOS] --- eth1 --- [Clients]
  10.10.0.0/24                    172.16.0.1/30              172.16.0.2/30        192.168.100.0/24
```

**HQ Router**:
```
# VTI интерфейс для VPN
set interfaces vti vti0 address 172.16.0.1/30

# IGMP Proxy
set protocols igmp-proxy interface eth1 role upstream
set protocols igmp-proxy interface eth1 alt-subnet 10.10.0.0/24

set protocols igmp-proxy interface vti0 role downstream
set protocols igmp-proxy interface vti0 threshold 64

commit
save
```

**Remote Router**:
```
# VTI интерфейс для VPN
set interfaces vti vti0 address 172.16.0.2/30

# IGMP Proxy
set protocols igmp-proxy interface vti0 role upstream
set protocols igmp-proxy interface vti0 alt-subnet 10.10.0.0/24

set protocols igmp-proxy interface eth1 role downstream

commit
save
```

**IPsec конфигурация** (на обоих роутерах):
```
# Фаза 1 (IKE)
set vpn ipsec ike-group IKE-GROUP proposal 1 encryption aes256
set vpn ipsec ike-group IKE-GROUP proposal 1 hash sha256
set vpn ipsec ike-group IKE-GROUP lifetime 28800

# Фаза 2 (ESP)
set vpn ipsec esp-group ESP-GROUP proposal 1 encryption aes256
set vpn ipsec esp-group ESP-GROUP proposal 1 hash sha256
set vpn ipsec esp-group ESP-GROUP lifetime 3600

# Site-to-Site VPN с VTI
set vpn ipsec site-to-site peer 203.0.113.2 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer 203.0.113.2 authentication pre-shared-secret 'SecureKey123!'
set vpn ipsec site-to-site peer 203.0.113.2 ike-group IKE-GROUP
set vpn ipsec site-to-site peer 203.0.113.2 vti bind vti0

commit
save
```

### Пример 4: IGMP с VLAN

**Сценарий**:
- Провайдер на VLAN 100
- Клиенты на VLAN 10, 20, 30

**VyOS конфигурация**:
```
# VLAN интерфейсы
set interfaces ethernet eth0 vif 100 address 10.100.0.10/24
set interfaces ethernet eth0 vif 100 description 'VLAN 100 - Provider'

set interfaces ethernet eth1 vif 10 address 192.168.10.1/24
set interfaces ethernet eth1 vif 10 description 'VLAN 10 - Office A'

set interfaces ethernet eth1 vif 20 address 192.168.20.1/24
set interfaces ethernet eth1 vif 20 description 'VLAN 20 - Office B'

set interfaces ethernet eth1 vif 30 address 192.168.30.1/24
set interfaces ethernet eth1 vif 30 description 'VLAN 30 - Office C'

# IGMP Proxy
set protocols igmp-proxy interface eth0.100 role upstream
set protocols igmp-proxy interface eth0.100 alt-subnet 10.0.0.0/8

set protocols igmp-proxy interface eth1.10 role downstream
set protocols igmp-proxy interface eth1.20 role downstream
set protocols igmp-proxy interface eth1.30 role downstream

commit
save
```

## Операционные команды

### Show Commands

**Конфигурация IGMP Proxy**:
```
show protocols igmp-proxy
```

Вывод:
```
interface eth0 {
    alt-subnet 10.0.0.0/23
    role upstream
    threshold 1
}
interface eth1 {
    role downstream
    threshold 1
}
```

**IGMP Groups**:
```
show igmp groups
```

Вывод:
```
Interface        Address         Group           Uptime    Expires
eth1             192.168.1.1     239.0.1.10      00:10:15  00:04:23
eth1             192.168.1.1     239.0.1.11      00:05:33  00:04:45
eth2             192.168.2.1     239.0.1.10      00:08:42  00:04:18
```

**IGMP Interface**:
```
show igmp interface
```

Вывод:
```
Interface  State  Address      V  Querier  Query Timer  Uptime
eth0       up     10.100.0.10  3  local    00:00:58     00:15:23
eth1       up     192.168.1.1  3  local    00:00:45     00:15:23
eth2       up     192.168.2.1  3  local    00:00:52     00:15:23
```

**Детали интерфейса**:
```
show igmp interface eth1
```

Вывод:
```
Interface eth1:
  State: up
  Address: 192.168.1.1
  Version: 3
  Querier: local
  Query Interval: 125s
  Query Timer: 00:00:58
  Other Querier Present Timer: 00:00:00
  Uptime: 00:15:23
  Multicast routing: enabled
```

**IGMP Statistics**:
```
show igmp statistics
```

Вывод:
```
Interface eth1:
  IGMP queries sent: 152
  IGMP queries received: 0
  IGMP reports sent: 45
  IGMP reports received: 287
  IGMP leaves sent: 12
  IGMP leaves received: 35
  IGMP v1 reports received: 0
  IGMP v2 reports received: 156
  IGMP v3 reports received: 131
```

### Management Commands

**Restart IGMP Proxy**:
```
restart igmp-proxy
```

**Clear IGMP groups** (reset подписок):
```
# Нет прямой команды в VyOS, используйте restart
restart igmp-proxy
```

## Troubleshooting

### Клиенты не получают multicast трафик

**Проблема**: Подписка на multicast группу не работает.

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

1. **IGMP Proxy работает**:
   ```
   show protocols igmp-proxy
   ```

2. **Интерфейсы правильно настроены**:
   ```
   show igmp interface
   ```

   Убедитесь что:
   - Upstream интерфейс только один
   - Downstream интерфейсы имеют правильный role
   - Multicast routing включен

3. **IGMP группы видны**:
   ```
   show igmp groups
   ```

   Должны быть активные подписки.

4. **Multicast трафик достигает upstream**:
   ```
   tcpdump -i eth0 -n host 239.0.1.10
   ```

5. **Firewall правила**:
   ```
   show firewall
   ```

   Проверьте что IGMP и multicast трафик разрешен:
   ```
   set firewall ipv4 input filter rule 100 action accept
   set firewall ipv4 input filter rule 100 protocol igmp

   set firewall ipv4 input filter rule 110 action accept
   set firewall ipv4 input filter rule 110 destination address 224.0.0.0/4

   commit
   ```

6. **Routing для multicast**:
   ```
   show ip route 239.0.1.10
   ```

   Может потребоваться static route:
   ```
   set protocols static route 239.0.0.0/8 interface eth0
   commit
   ```

### IGMP Join не проходит upstream

**Проблема**: IGMP прокси не отправляет Join на upstream интерфейс.

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

1. **Downstream получает Join от клиента**:
   ```
   tcpdump -i eth1 -n igmp
   ```

   Должны видеть IGMP Membership Report.

2. **Upstream отправляет Join**:
   ```
   tcpdump -i eth0 -n igmp
   ```

   Должен отправляться IGMP Join для группы.

3. **Alternate subnet настроен** (если источник в другой подсети):
   ```
   set protocols igmp-proxy interface eth0 alt-subnet 10.0.0.0/8
   commit
   ```

4. **Restart прокси**:
   ```
   restart igmp-proxy
   ```

5. **Логи системы**:
   ```
   show log | match igmp
   ```

### Multicast источник в другой подсети

**Проблема**: Multicast источник имеет IP не из directly connected сети upstream интерфейса.

**Решение**: Использовать `alt-subnet`.

**Пример**:
```
# Upstream интерфейс: 10.100.0.10/24
# Multicast источник: 172.16.50.100

set protocols igmp-proxy interface eth0 alt-subnet 172.16.0.0/16
commit
save
```

**Проверка**:
```
show protocols igmp-proxy interface eth0
```

### Задержка при Leave Group

**Проблема**: После Leave Group трафик продолжает идти несколько секунд.

**Причина**: Quick Leave отключен или несколько клиентов на интерфейсе.

**Решение 1** - Включить Quick Leave (только один клиент):
```
delete protocols igmp-proxy disable-quickleave
commit
```

**Решение 2** - Настроить IGMP Query Interval (уменьшить интервал):
```
# Это делается на upstream роутере провайдера
# На VyOS IGMP Proxy нет прямых настроек Query Interval
```

**Workaround** - Restart прокси после массовых изменений:
```
restart igmp-proxy
```

### Высокая нагрузка от multicast трафика

**Проблема**: Избыточный multicast трафик нагружает сеть.

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

1. **Threshold для ограничения распространения**:
   ```
   set protocols igmp-proxy interface eth1 threshold 1
   commit
   ```

2. **QoS для приоритизации**:
   ```
   set qos policy shaper MULTICAST-LIMIT bandwidth 50mbit
   set qos policy shaper MULTICAST-LIMIT class 10 bandwidth 20mbit
   set qos policy shaper MULTICAST-LIMIT class 10 match VIDEO ip destination address 239.0.0.0/8

   set qos interface eth1 egress MULTICAST-LIMIT
   commit
   ```

3. **Firewall rate limiting**:
   ```
   set firewall ipv4 name LAN-LOCAL rule 100 action accept
   set firewall ipv4 name LAN-LOCAL rule 100 destination address 224.0.0.0/4
   set firewall ipv4 name LAN-LOCAL rule 100 limit rate 10/second

   set firewall ipv4 input filter rule 100 jump-target LAN-LOCAL
   commit
   ```

### IGMP версии не совпадают

**Проблема**: Клиенты используют IGMPv3, провайдер - IGMPv2.

**Решение**: VyOS IGMP Proxy поддерживает автоматическую конвертацию версий.

**Проверка версии**:
```
show igmp interface eth0
```

Вывод покажет:
```
Version: 2
```

или
```
Version: 3
```

**Совместимость**:
- IGMPv3 обратно совместима с IGMPv2
- IGMPv2 обратно совместима с IGMPv1
- Прокси автоматически адаптируется

### Multicast через NAT

**Проблема**: Multicast не работает через NAT.

**Решение**: Исключить multicast из NAT, использовать alt-subnet.

**Конфигурация**:
```
# Исключить multicast из NAT
set nat source rule 90 outbound-interface name eth0
set nat source rule 90 destination address 224.0.0.0/4
set nat source rule 90 translation address <router-wan-ip>

# Основное NAT правило
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

# Alt-subnet для upstream
set protocols igmp-proxy interface eth0 alt-subnet 10.0.0.0/8

commit
save
```

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

### Continuous Monitoring

**Мониторинг IGMP групп**:
```
watch -n 5 'show igmp groups'
```

**Мониторинг multicast трафика**:
```
# Входящий на upstream
tcpdump -i eth0 -n multicast

# Исходящий на downstream
tcpdump -i eth1 -n multicast

# Конкретная группа
tcpdump -i eth1 -n host 239.0.1.10
```

**Bandwidth мониторинг**:
```
# Установить bmon
sudo apt update
sudo apt install bmon

# Запустить
bmon -p eth0,eth1

# Или использовать iftop
sudo iftop -i eth1 -f 'dst net 224.0.0.0/4'
```

### Логирование

**Системные логи**:
```
show log tail 100 | match igmp
```

**Syslog для IGMP**:
```
set system syslog global facility protocols level info
commit
```

**External syslog сервер**:
```
set system syslog host 192.168.1.100 facility protocols level info
set system syslog host 192.168.1.100 port 514
commit
```

**Просмотр логов**:
```
show log | match igmp
show log tail 50 | match "multicast|igmp"
```

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

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

1. **Один upstream интерфейс**:
   - IGMP Proxy требует ровно один upstream
   - Для redundancy используйте VRRP + IGMP Proxy на обоих роутерах

2. **Alt-subnet для провайдеров**:
   - Всегда настраивайте alt-subnet если источник не в directly connected сети
   - Включайте широкие диапазоны (10.0.0.0/8)

3. **Threshold управление**:
   - Используйте threshold 1 для локальных сетей
   - Увеличивайте для WAN туннелей

4. **Quick Leave**:
   - Оставьте включенным для домашних сетей (один клиент)
   - Отключите для корпоративных сетей (множество клиентов)

5. **Firewall**:
   - Всегда разрешайте IGMP протокол
   - Разрешайте multicast адреса (224.0.0.0/4)
   - Используйте rate limiting для защиты

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

1. **Firewall для IGMP**:
   ```
   set firewall ipv4 input filter rule 100 action accept
   set firewall ipv4 input filter rule 100 protocol igmp
   set firewall ipv4 input filter rule 100 source address 192.168.0.0/16
   ```

2. **Ограничение multicast групп**:
   ```
   set firewall ipv4 input filter rule 110 action accept
   set firewall ipv4 input filter rule 110 destination address 239.0.0.0/16
   set firewall ipv4 input filter rule 110 description 'Allow only company multicast'
   ```

3. **Rate limiting IGMP**:
   ```
   set firewall ipv4 input filter rule 100 limit rate 10/second
   ```

4. **Drop unknown multicast**:
   ```
   set firewall ipv4 input filter rule 999 action drop
   set firewall ipv4 input filter rule 999 destination address 224.0.0.0/4
   set firewall ipv4 input filter rule 999 description 'Drop unknown multicast'
   ```

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

1. **QoS для видео**:
   ```
   set qos policy shaper VIDEO bandwidth 100mbit
   set qos policy shaper VIDEO class 10 bandwidth 50%
   set qos policy shaper VIDEO class 10 match MULTICAST ip destination address 239.0.0.0/8
   set qos policy shaper VIDEO class 10 priority 1

   set qos interface eth1 egress VIDEO
   commit
   ```

2. **Мониторинг bandwidth**:
   - Регулярно проверяйте использование через `show interfaces`
   - Используйте external monitoring (Zabbix, Prometheus)

3. **Hardware acceleration**:
   - Используйте hardware offloading если доступно
   - Проверьте `ethtool -k eth0` для offload опций

### Масштабирование

1. **Количество групп**:
   - IGMP Proxy поддерживает сотни групп
   - Для тысяч групп - используйте PIM

2. **Количество downstream интерфейсов**:
   - Нет жесткого лимита
   - Ограничено производительностью роутера

3. **Bandwidth**:
   - Учитывайте что multicast умножается на количество downstream интерфейсов
   - 10 Mbps поток на 5 интерфейсов = 50 Mbps от роутера

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

### IGMP Proxy + OSPF

**Сценарий**: IGMP Proxy на edge роутере, OSPF для unicast маршрутизации.

```
# OSPF
set protocols ospf parameters router-id 10.0.0.1
set protocols ospf area 0 network 192.168.0.0/16

# IGMP Proxy
set protocols igmp-proxy interface eth0 role upstream
set protocols igmp-proxy interface eth1 role downstream

commit
```

**Важно**: IGMP Proxy работает независимо от OSPF.

### IGMP Proxy + BGP

**Сценарий**: BGP для Internet, IGMP для multicast от провайдера.

```
# BGP
set protocols bgp system-as 65001
set protocols bgp neighbor 203.0.113.1 remote-as 65000

# IGMP Proxy
set protocols igmp-proxy interface eth0 role upstream
set protocols igmp-proxy interface eth1 role downstream

commit
```

### IGMP Proxy + VPN (IPsec)

**Сценарий**: Multicast через VPN туннель.

См. Пример 3 выше - IGMP через VTI.

**Ключевые моменты**:
- Используйте VTI (не policy-based VPN)
- Настройте alt-subnet для удаленной сети
- Увеличьте threshold для VPN интерфейса

### IGMP Proxy + VRRP

**Сценарий**: Redundancy с VRRP, IGMP Proxy на обоих роутерах.

**Router 1**:
```
# VRRP
set high-availability vrrp group 1 interface eth0
set high-availability vrrp group 1 vrid 1
set high-availability vrrp group 1 virtual-address 192.168.1.254/24
set high-availability vrrp group 1 priority 200

# IGMP Proxy
set protocols igmp-proxy interface eth0 role upstream
set protocols igmp-proxy interface eth1 role downstream

commit
```

**Router 2**:
```
# VRRP
set high-availability vrrp group 1 interface eth0
set high-availability vrrp group 1 vrid 1
set high-availability vrrp group 1 virtual-address 192.168.1.254/24
set high-availability vrrp group 1 priority 100

# IGMP Proxy
set protocols igmp-proxy interface eth0 role upstream
set protocols igmp-proxy interface eth1 role downstream

commit
```

**Примечание**: Оба роутера запускают IGMP Proxy, но активен только master.

## Сравнение с PIM

### IGMP Proxy vs PIM-SM

| Характеристика | IGMP Proxy | PIM-SM |
|---------------|------------|---------|
| Сложность | Низкая | Высокая |
| Конфигурация | Минимальная | Обширная |
| Топология | Простая (дерево) | Любая (mesh) |
| Redundancy | Ограниченная | Полная |
| Масштабируемость | До сотен групп | Тысячи групп |
| RP (Rendezvous Point) | Не требуется | Требуется |
| Множество источников | Ограничено | Полная поддержка |
| CPU/Memory | Низкое | Среднее |
| Применение | Edge networks | Core networks |

### Когда использовать что

**IGMP Proxy**:
- Домашние/офисные сети
- IPTV от провайдера
- Простая топология (один источник)
- Ограниченные ресурсы

**PIM-SM**:
- Data center multicast
- Множество источников и получателей
- Redundancy критична
- Сложная топология

## Диагностика с клиентской стороны

### Linux клиент

**Подписка на группу**:
```bash
# Установка smcroute
sudo apt install smcroute

# Подписка
sudo smcroute -j eth0 239.0.1.10

# Просмотр подписок
ip maddr show dev eth0
```

**Прослушивание multicast**:
```bash
# С помощью socat
socat UDP4-RECV:5000,ip-add-membership=239.0.1.10:eth0 STDOUT

# С помощью VLC
vlc udp://@239.0.1.10:5000
```

**Отправка multicast** (тестирование):
```bash
# Отправка пакетов
echo "Test multicast" | socat - UDP4-DATAGRAM:239.0.1.10:5000,bind=:0
```

### Windows клиент

**Просмотр multicast групп**:
```cmd
netsh interface ipv4 show joins
```

**Тестирование с VLC**:
1. Открыть VLC Media Player
2. Media → Open Network Stream
3. Ввести: `udp://@239.0.1.10:5000`
4. Play

### Packet Capture

**tcpdump для IGMP**:
```bash
# Все IGMP сообщения
sudo tcpdump -i eth1 -vv igmp

# IGMP с деталями
sudo tcpdump -i eth1 -vv -n igmp

# Сохранить в файл
sudo tcpdump -i eth1 -w igmp-capture.pcap igmp
```

**tcpdump для multicast потока**:
```bash
# Конкретная группа
sudo tcpdump -i eth1 -n host 239.0.1.10

# Весь multicast
sudo tcpdump -i eth1 -n 'dst net 224.0.0.0/4'

# С подсчетом пакетов
sudo tcpdump -i eth1 -n host 239.0.1.10 -c 100
```

**Wireshark фильтры**:
```
igmp
ip.dst == 239.0.1.10
ip.dst >= 224.0.0.0 and ip.dst <= 239.255.255.255
```

## Автоматизация и скрипты

### Мониторинг скрипт

**Bash скрипт для проверки IGMP групп**:
```bash
#!/bin/bash

# igmp-monitor.sh
# Мониторинг IGMP групп

EXPECTED_GROUPS="239.0.1.10 239.0.1.11"
LOG_FILE="/var/log/igmp-monitor.log"

check_groups() {
    local missing=0

    for group in $EXPECTED_GROUPS; do
        if ! sudo vtysh -c "show igmp groups" | grep -q "$group"; then
            echo "$(date): WARNING - Group $group is missing" >> "$LOG_FILE"
            missing=1
        fi
    done

    if [ $missing -eq 0 ]; then
        echo "$(date): OK - All groups present" >> "$LOG_FILE"
    fi

    return $missing
}

# Запуск проверки
check_groups

# Вывод статистики
echo "Current IGMP groups:"
sudo vtysh -c "show igmp groups"
```

**Установка в cron**:
```bash
# Каждые 5 минут
*/5 * * * * /usr/local/bin/igmp-monitor.sh
```

### Auto-restart скрипт

**Скрипт для автоматического перезапуска**:
```bash
#!/bin/bash

# igmp-watchdog.sh
# Автоматический перезапуск IGMP Proxy

MAX_RETRY=3
RETRY_COUNT=0

check_igmp() {
    # Проверка что IGMP Proxy работает
    if pgrep -x "igmpproxy" > /dev/null; then
        return 0
    else
        return 1
    fi
}

while [ $RETRY_COUNT -lt $MAX_RETRY ]; do
    if check_igmp; then
        echo "$(date): IGMP Proxy is running"
        exit 0
    else
        echo "$(date): IGMP Proxy not running, restarting..."
        sudo /opt/vyatta/bin/vyatta-op-cmd-wrapper restart igmp-proxy
        RETRY_COUNT=$((RETRY_COUNT + 1))
        sleep 10
    fi
done

echo "$(date): ERROR - Failed to restart IGMP Proxy after $MAX_RETRY attempts"
exit 1
```

## Ссылки и ресурсы

### RFC Documents

- **RFC 1112** - Host Extensions for IP Multicasting (IGMPv1)
- **RFC 2236** - Internet Group Management Protocol, Version 2
- **RFC 3376** - Internet Group Management Protocol, Version 3
- **RFC 9776** - Internet Group Management Protocol, Version 3 (обновление 2025)
- **RFC 4605** - Internet Group Management Protocol (IGMP) / Multicast Listener Discovery (MLD)-Based Multicast Forwarding ("IGMP/MLD Proxying")

### VyOS Documentation

- [VyOS IGMP Proxy Documentation](https://docs.vyos.io/en/latest/configuration/protocols/igmp-proxy.html)
- [VyOS Multicast Routing](https://docs.vyos.io/en/latest/configuration/protocols/multicast.html)
- [VyOS PIM Configuration](https://docs.vyos.io/en/latest/configuration/protocols/pim.html)

### Полезные инструменты

- **igmpproxy** - IGMP Proxy daemon (используется VyOS)
- **smcroute** - Multicast routing tool
- **VLC** - Media player с multicast поддержкой
- **iperf** - Network performance testing (multicast режим)
- **tcpdump** - Packet capture
- **Wireshark** - Packet analyzer

### Community

- [VyOS Forum](https://forum.vyos.io/)
- [VyOS Phabricator](https://vyos.dev/)
- [GitHub VyOS](https://github.com/vyos)

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

После настройки IGMP Proxy рекомендуется изучить:

- **[PIM (Protocol Independent Multicast)](/docs/vyos/routing/vyos-pim)** - для сложных multicast топологий
- **[QoS (Quality of Service)](/docs/vyos/qos/)** - для приоритизации multicast трафика
- **[Firewall](/docs/vyos/firewall/vyos-firewall/)** - для защиты multicast сетей
- **[VPN (IPsec/WireGuard)](/docs/vyos/vpn/)** - для multicast через туннели
- **[VRRP](/docs/vyos/ha/)** - для redundancy

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

IGMP Proxy - эффективное решение для распределения multicast трафика в простых топологиях. Правильная конфигурация upstream/downstream интерфейсов, использование alt-subnet и firewall правил обеспечивают стабильную работу IPTV и видео стриминга в сетях Yandex Cloud и VK Cloud.

**Ключевые моменты**:
- Один upstream, один или более downstream
- Alt-subnet для удаленных источников
- Firewall для IGMP и multicast
- QoS для приоритизации видео трафика
- Мониторинг групп и bandwidth

