# PIM6 - Protocol Independent Multicast для IPv6

> Настройка PIM6 на VyOS: IPv6 multicast маршрутизация с MLD, Source-Specific Multicast (SSM), Rendezvous Point, Bootstrap Router для Yandex Cloud и VK Cloud

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


PIM6 (Protocol Independent Multicast for IPv6) обеспечивает multicast маршрутизацию в IPv6 сетях, используя MLD (Multicast Listener Discovery) вместо IGMP.

## Обзор

PIM6 - версия протокола PIM для IPv6 сетей.

**Основные характеристики**:
- Multicast маршрутизация для IPv6
- Использует MLD вместо IGMP
- Поддерживает PIM-SM (Sparse Mode) и PIM-SSM (Source-Specific Multicast)
- Работает с IPv6 адресным пространством ff00::/8
- Требует конфигурации RP (Rendezvous Point) для SM режима
- Встроенная поддержка Embedded RP (RFC 3956)

**Стандарты**:
- **RFC 4601** - Protocol Independent Multicast - Sparse Mode (PIM-SM): основной стандарт
- **RFC 7761** - Protocol Independent Multicast - Sparse Mode (PIM-SM): обновление
- **RFC 3810** - Multicast Listener Discovery Version 2 (MLDv2) for IPv6
- **RFC 3956** - Embedding the Rendezvous Point (RP) Address in an IPv6 Multicast Address
- **RFC 4607** - Source-Specific Multicast for IP
- **RFC 5059** - Bootstrap Router (BSR) Mechanism for PIM

**Применение**:
- IPv6-only сети с multicast требованиями
- Современные data center с IPv6
- IoT сети на базе IPv6
- Видео конференции через IPv6
- IPTV over IPv6
- Software-defined networking (SDN) с IPv6 multicast

## PIM6 vs PIM (IPv4)

### Ключевые различия

| Характеристика | PIM (IPv4) | PIM6 (IPv6) |
|---------------|------------|-------------|
| Группы управления | IGMP | MLD |
| Адресное пространство | 224.0.0.0/4 | ff00::/8 |
| RP адрес | IPv4 | IPv6, поддержка Embedded RP |
| SSM диапазон | 232.0.0.0/8 | ff3x::/32 |
| Neighbor discovery | PIM Hello (IPv4) | PIM Hello (IPv6) |
| BSR адрес | IPv4 | IPv6 |
| Auto-RP | Доступен | Не применим |

### Общие функции

**Схожие между PIM и PIM6**:
- Алгоритм PIM-SM идентичен
- Механизм Bootstrap Router (BSR)
- Source-Specific Multicast (SSM)
- Register mechanism для новых источников
- Join/Prune сообщения
- Assert mechanism для выбора forwarder

## MLD (Multicast Listener Discovery)

### Обзор MLD

MLD - эквивалент IGMP для IPv6.

**Версии MLD**:

**MLDv1** (RFC 2710):
- Базовая функциональность
- Listener Report и Listener Done сообщения
- Any-Source Multicast (ASM)

**MLDv2** (RFC 3810):
- Source filtering (Include/Exclude)
- Source-Specific Multicast (SSM) поддержка
- Совместимость с MLDv1

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

**Multicast Listener Query**:
- Отправляется роутером для обнаружения слушателей
- General Query - для всех групп
- Multicast-Address-Specific Query - для конкретной группы
- Multicast-Address-and-Source-Specific Query - для группы и источника (MLDv2)

**Multicast Listener Report**:
- Хост сообщает о желании получать multicast трафик
- Периодические обновления

**Multicast Listener Done** (MLDv1):
- Хост покидает multicast группу
- Быстрое удаление подписки

**MLDv2 Report**:
- Расширенный Report с source filtering
- Include/Exclude режимы

### IPv6 Multicast Адреса

**Структура IPv6 multicast**: `ffXY::/8`

**X - Flags**:
- 0 = Well-known multicast
- 1 = Transient multicast

**Y - Scope**:
- 0 = Reserved
- 1 = Interface-local
- 2 = Link-local
- 4 = Admin-local
- 5 = Site-local
- 8 = Organization-local
- E = Global

**Специальные адреса**:
- **ff02::1** - All Nodes (все узлы на link)
- **ff02::2** - All Routers (все роутеры на link)
- **ff02::5** - OSPFv3 All Routers
- **ff02::6** - OSPFv3 Designated Routers
- **ff02::9** - RIPng Routers
- **ff02::d** - PIM Routers
- **ff02::16** - MLDv2 Reports destination
- **ff02::1:2** - All DHCP Servers and Relay Agents
- **ff05::1:3** - All DHCP Servers (site-local)

**SSM диапазон**: ff3x::/32 (x = scope)
- **ff3e::/32** - SSM Global scope

**Embedded RP**: ff7x:0RP0::/96
- RP адрес встроен в multicast адрес

## PIM6-SM (Sparse Mode)

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

PIM6-SM использует shared tree через Rendezvous Point (RP).

**Этапы работы**:

1. **Источник регистрируется**:
   - Designated Router (DR) источника инкапсулирует multicast пакеты в PIM Register
   - Register отправляется unicast на RP

2. **Получатели присоединяются**:
   - DR получателя отправляет PIM Join к RP
   - Строится shared tree (*, G) от получателей к RP

3. **Shortest Path Tree (SPT)**:
   - DR получателя опционально переключается на SPT (S, G)
   - Прямой путь от источника к получателю
   - Отправляет Prune к RP для (*, G)

4. **Оптимизация**:
   - SPT минимизирует задержку
   - RP разгружается после построения SPT

### RP для IPv6

**Методы конфигурации RP**:

1. **Статический RP**:
   - Ручная конфигурация на всех роутерах
   - Максимальный контроль
   - Требует синхронизации

2. **Embedded RP** (RFC 3956):
   - RP адрес встроен в multicast группу
   - Автоматическое определение RP
   - Формат: ff7x:0RP0::/96

3. **Bootstrap Router (BSR)**:
   - Динамическое распространение RP информации
   - Candidate-RP и Candidate-BSR
   - Автоматическое обновление

### Embedded RP

**Формат адреса**:
```
ff7S:0RPN:PPPP:PPPP:PPPP:PPPP:GGGG:GGGG
```

Где:
- **S** - Scope (4 бита)
- **0** - Reserved (4 бита)
- **R** - Riid (4 бита) - интерфейс RP
- **P** - Plen (8 бит) - длина префикса RP
- **N** - Network prefix (8 бит)
- **P...P** - RP IPv6 prefix (64 бита)
- **G...G** - Group ID (32 бита)

**Пример**:
```
RP адрес: 2001:db8::1
Multicast группа: ff75:0030:2001:0db8:0000:0000:0000:1234

Разбор:
ff75 - flags=7 (transient), scope=5 (site-local)
0030 - Riid=0, Plen=48 (2001:db8::/48)
2001:0db8:0000 - RP prefix
0000:0000:1234 - Group ID
```

**Преимущества**:
- Не требует ручной конфигурации RP на каждом роутере
- RP определяется автоматически из группы
- Упрощенная конфигурация

**Недостатки**:
- Ограниченная гибкость выбора RP
- Зависимость от адресной схемы

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

### Включение PIM6 на интерфейсе

**Синтаксис**:
```
set protocols pim6 interface <interface>
```

**Пример**:
```
set protocols pim6 interface eth0
set protocols pim6 interface eth1
set protocols pim6 interface eth2

commit
save
```

**Эффект**:
- Включает PIM6 на интерфейсе
- Автоматически запускает MLD
- Отправляет/принимает PIM Hello сообщения
- Участвует в multicast маршрутизации

### Базовая PIM6-SM сеть

**Сценарий**:
- Три роутера в треугольной топологии
- Статический RP на Router2
- Multicast источник за Router1
- Получатели за Router3

**Топология**:
```
[Source] --- Router1 --- Router2 (RP) --- Router3 --- [Receivers]
             eth1         eth0  eth1     eth0  eth1
```

**Router1** (First Hop Router):
```
# Интерфейсы
set interfaces ethernet eth0 address 2001:db8:12::1/64
set interfaces ethernet eth1 address 2001:db8:1::1/64

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1

# Статический RP (должен совпадать на всех роутерах)
set protocols pim6 rp address 2001:db8:2::1

commit
save
```

**Router2** (RP):
```
# Интерфейсы
set interfaces ethernet eth0 address 2001:db8:12::2/64
set interfaces ethernet eth1 address 2001:db8:23::1/64
set interfaces ethernet eth2 address 2001:db8:2::1/64

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1
set protocols pim6 interface eth2

# RP на loopback или eth2
set protocols pim6 rp address 2001:db8:2::1

commit
save
```

**Router3** (Last Hop Router):
```
# Интерфейсы
set interfaces ethernet eth0 address 2001:db8:23::2/64
set interfaces ethernet eth1 address 2001:db8:3::1/64

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1

# Статический RP
set protocols pim6 rp address 2001:db8:2::1

commit
save
```

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

**Проверка PIM6 интерфейсов**:
```
show ipv6 pim interface
```

Вывод:
```
Interface  State  Address            PIM Nbrs  PIM DR   DR Priority
eth0       up     2001:db8:12::1/64  1         2001:db8:12::2  1
eth1       up     2001:db8:1::1/64   0         local      1
```

**Проверка PIM6 соседей**:
```
show ipv6 pim neighbor
```

Вывод:
```
Interface  Neighbor          Uptime     Holdtime  DR Priority
eth0       2001:db8:12::2    00:15:23   105       1
```

**Проверка RP**:
```
show ipv6 pim rp-info
```

Вывод:
```
RP address       Group          Source          State
2001:db8:2::1    ff00::/8       Static          Active
```

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

### Включение MLD на интерфейсе

MLD автоматически включается при активации PIM6, но можно настроить параметры.

**Просмотр MLD групп**:
```
show ipv6 mld groups
```

Вывод:
```
Interface        Address                    Group                   Uptime    Expires
eth1             2001:db8:3::1              ff3e::1234              00:05:23  00:04:12
eth1             2001:db8:3::1              ff05::5678              00:03:45  00:04:18
```

**Просмотр MLD интерфейсов**:
```
show ipv6 mld interface
```

Вывод:
```
Interface  State  Address            Version  Querier         Query Timer  Uptime
eth0       up     fe80::1            2        fe80::1         00:01:15     00:20:34
eth1       up     fe80::2            2        fe80::2         00:00:58     00:20:34
```

### MLD параметры

**Отключение MLD на интерфейсе**:
```
set protocols pim6 interface <interface> mld disable
```

**Применение**:
- Интерфейс участвует в PIM6, но не обрабатывает MLD
- Используется для transit интерфейсов без клиентов

**Пример**:
```
set protocols pim6 interface eth0 mld disable

commit
save
```

**Query Interval**:
```
set protocols pim6 interface <interface> mld interval <seconds>
```

**Параметры**:
- **seconds**: 1-65535 (по умолчанию 125)

**Пример**:
```
set protocols pim6 interface eth1 mld interval 60

commit
save
```

**Last Member Query Count**:
```
set protocols pim6 interface <interface> mld last-member-query-count <count>
```

**Применение**:
- Количество Group-Specific Queries после Listener Done
- Влияет на скорость удаления из группы

**Пример**:
```
set protocols pim6 interface eth1 mld last-member-query-count 2

commit
save
```

**Last Member Query Interval**:
```
set protocols pim6 interface <interface> mld last-member-query-interval <milliseconds>
```

**Параметры**:
- **milliseconds**: 100-6553500 (по умолчанию 1000)

**Пример**:
```
set protocols pim6 interface eth1 mld last-member-query-interval 500

commit
save
```

**Max Response Time**:
```
set protocols pim6 interface <interface> mld max-response-time <milliseconds>
```

**Применение**:
- Максимальное время ожидания ответа на Query
- Влияет на сходимость

**Пример**:
```
set protocols pim6 interface eth1 mld max-response-time 5000

commit
save
```

**MLD Version**:
```
set protocols pim6 interface <interface> mld version <1-2>
```

**Применение**:
- Принудительное использование MLDv1 или MLDv2
- MLDv2 требуется для SSM

**Пример**:
```
set protocols pim6 interface eth1 mld version 2

commit
save
```

### Статическое присоединение к группе

**Join группы на интерфейсе**:
```
set protocols pim6 interface <interface> mld join <multicast-address>
```

**Пример**:
```
set protocols pim6 interface eth1 mld join ff3e::1234

commit
save
```

**Применение**:
- Роутер присоединяется к группе как host
- Полезно для тестирования
- Роутер начинает получать трафик группы на этом интерфейсе

**Join с указанием источника (SSM)**:
```
set protocols pim6 interface <interface> mld join <multicast-address> source <source-address>
```

**Пример**:
```
set protocols pim6 interface eth1 mld join ff3e::5678 source 2001:db8:100::10

commit
save
```

**Применение**:
- Source-Specific Multicast
- Роутер получает только от указанного источника
- Требует MLDv2

## RP конфигурация

### Статический RP

**Конфигурация RP адреса**:
```
set protocols pim6 rp address <ipv6-address>
```

**Важно**: Конфигурация должна быть идентична на всех PIM6 роутерах в домене.

**Пример**:
```
set protocols pim6 rp address 2001:db8:100::1

commit
save
```

**Проверка**:
```
show ipv6 pim rp-info
```

Вывод:
```
RP address       Group          Source          State
2001:db8:100::1  ff00::/8       Static          Active
```

### RP для конкретных групп

**RP для диапазона групп**:
```
set protocols pim6 rp address <ipv6-address> group <prefix>
```

**Пример**:
```
set protocols pim6 rp address 2001:db8:100::1 group ff3e::/32
set protocols pim6 rp address 2001:db8:100::2 group ff05::/16

commit
save
```

**Применение**:
- Разные RP для разных групп
- Load balancing между RP
- Разделение по scope

**Проверка**:
```
show ipv6 pim rp-info
```

Вывод:
```
RP address       Group          Source          State
2001:db8:100::1  ff3e::/32      Static          Active
2001:db8:100::2  ff05::/16      Static          Active
```

### Keep-Alive Timer для RP

**Keep-Alive для (S,G) на RP**:
```
set protocols pim6 rp keep-alive-timer <seconds>
```

**Параметры**:
- **seconds**: 31-60000 (по умолчанию 185)

**Применение**:
- Время хранения (S,G) state на RP
- Влияет на сходимость при изменениях

**Пример**:
```
set protocols pim6 rp keep-alive-timer 210

commit
save
```

## BSR (Bootstrap Router) для IPv6

### Обзор BSR

BSR обеспечивает динамическое распространение RP информации.

**Компоненты**:

**Candidate-BSR (C-BSR)**:
- Роутер, участвующий в выборе BSR
- Выбирается на основе приоритета и адреса
- Распространяет RP-Set

**Candidate-RP (C-RP)**:
- Роутер, желающий быть RP
- Отправляет Candidate-RP-Advertisement на BSR
- BSR включает в RP-Set

**Bootstrap Message (BSM)**:
- Содержит RP-Set
- Распространяется через multicast ff02::d
- Flooding в PIM6 домене

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

**Candidate-BSR**:
```
set protocols pim6 rp candidate-bsr address <ipv6-address>
set protocols pim6 rp candidate-bsr priority <priority>
```

**Параметры**:
- **address**: IPv6 адрес интерфейса
- **priority**: 0-255 (по умолчанию 0, выше = лучше)

**Пример**:
```
set protocols pim6 rp candidate-bsr address 2001:db8:100::1
set protocols pim6 rp candidate-bsr priority 100

commit
save
```

**Candidate-RP**:
```
set protocols pim6 rp candidate-rp address <ipv6-address>
set protocols pim6 rp candidate-rp priority <priority>
set protocols pim6 rp candidate-rp interval <seconds>
```

**Параметры**:
- **address**: IPv6 адрес, который будет RP
- **priority**: 0-255 (по умолчанию 192, ниже = лучше для RP)
- **interval**: 1-16383 (по умолчанию 60) - интервал отправки C-RP Advertisement

**Пример**:
```
set protocols pim6 rp candidate-rp address 2001:db8:100::1
set protocols pim6 rp candidate-rp priority 50
set protocols pim6 rp candidate-rp interval 30

commit
save
```

**Candidate-RP для конкретных групп**:
```
set protocols pim6 rp candidate-rp address <ipv6-address> group <prefix>
```

**Пример**:
```
set protocols pim6 rp candidate-rp address 2001:db8:100::1 group ff3e::/32

commit
save
```

### Проверка BSR

**Информация о BSR**:
```
show ipv6 pim bsr
```

Вывод:
```
PIM6 Bootstrap Information
Current BSR Address: 2001:db8:100::1
Priority: 100
Hash Mask Length: 126
Expires: 00:01:45

Candidate BSR Address: 2001:db8:100::1
  Priority: 100
  Hash Mask Length: 126
```

**RP-Set от BSR**:
```
show ipv6 pim rp-info
```

Вывод:
```
RP address       Group          Source          State      Priority  Holdtime
2001:db8:100::1  ff3e::/32      BSR             Active     50        150
2001:db8:100::2  ff05::/16      BSR             Active     100       150
```

## SSM (Source-Specific Multicast) для IPv6

### Обзор SSM для IPv6

SSM для IPv6 использует диапазон ff3x::/32.

**Формат адреса**:
```
ff3S::/32
```

Где **S** - scope:
- **ff3e::/32** - Global SSM
- **ff35::/32** - Site-local SSM
- **ff38::/32** - Organization-local SSM

**Преимущества SSM**:
- Не требует RP
- Прямые (S,G) деревья
- Улучшенная безопасность
- Меньше state на роутерах
- Предсказуемые пути трафика

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

**Автоматическое определение SSM**:
VyOS автоматически использует SSM для ff3x::/32.

**Явная конфигурация SSM диапазона**:
```
set protocols pim6 ssm-range <prefix>
```

**Пример**:
```
set protocols pim6 ssm-range ff3e::/32

commit
save
```

**Проверка SSM**:
```
show ipv6 pim state
```

Вывод покажет (S,G) entries без (*,G) для SSM групп:
```
Source           Group            IIF      OIL
2001:db8:100::10 ff3e::1234       eth0     eth1, eth2
```

### MLDv2 для SSM

SSM требует MLDv2 для source filtering.

**Включение MLDv2**:
```
set protocols pim6 interface eth1 mld version 2

commit
save
```

**Проверка**:
```
show ipv6 mld interface
```

Вывод:
```
Interface  State  Address            Version  Querier         Query Timer  Uptime
eth1       up     fe80::2            2        fe80::2         00:00:58     00:20:34
```

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

### DR Priority

**Настройка приоритета Designated Router**:
```
set protocols pim6 interface <interface> dr-priority <priority>
```

**Параметры**:
- **priority**: 0-4294967295 (по умолчанию 1, выше = лучше)

**Применение**:
- Выбор DR на multi-access сети
- DR регистрирует источники и отправляет Join

**Пример**:
```
set protocols pim6 interface eth0 dr-priority 100

commit
save
```

**Проверка DR**:
```
show ipv6 pim interface eth0
```

Вывод:
```
Interface  State  Address            PIM Nbrs  PIM DR          DR Priority
eth0       up     2001:db8:12::1/64  1         2001:db8:12::1  100
```

### Hello Interval

**Настройка интервала Hello**:
```
set protocols pim6 interface <interface> hello <interval>
```

**Параметры**:
- **interval**: 1-65535 секунд (по умолчанию 30)

**Применение**:
- Частота отправки PIM Hello
- Влияет на обнаружение соседей

**Пример**:
```
set protocols pim6 interface eth0 hello 15

commit
save
```

### Join/Prune Interval

**Настройка интервала Join/Prune**:
```
set protocols pim6 join-prune-interval <seconds>
```

**Параметры**:
- **seconds**: 60-600 (по умолчанию 60)

**Применение**:
- Частота отправки Join/Prune сообщений
- Refresh для существующих (S,G) и (*,G)

**Пример**:
```
set protocols pim6 join-prune-interval 90

commit
save
```

### Register Suppression Time

**Настройка времени подавления Register**:
```
set protocols pim6 register-suppress-time <seconds>
```

**Параметры**:
- **seconds**: 5-60000 (по умолчанию 60)

**Применение**:
- Время подавления Register после Register-Stop
- DR источника прекращает инкапсуляцию в Register

**Пример**:
```
set protocols pim6 register-suppress-time 120

commit
save
```

### Multicast Routing Table

**SPT Switchover (iif)**:
VyOS автоматически переключается на SPT при получении трафика.

**Infinity для SPT Threshold**:
Отключить переключение на SPT (оставаться на shared tree):
```
set protocols pim6 spt-switchover infinity-and-beyond
```

**Применение**:
- Все трафик идет через RP
- Упрощенная топология
- Может увеличить задержку

**Пример**:
```
set protocols pim6 spt-switchover infinity-and-beyond

commit
save
```

### Packet Parameters

**DSCP для PIM пакетов**:
```
set protocols pim6 packet dscp <value>
```

**Параметры**:
- **value**: 0-63

**Пример**:
```
set protocols pim6 packet dscp 46

commit
save
```

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

### Пример 1: IPv6 Multicast в Yandex Cloud

**Сценарий**:
- VyOS роутер в Yandex Cloud как PIM6 RP
- Видео сервер в подсети 2001:db8:100::/64
- Три офиса получают IPv6 multicast видео
- Использование PIM6-SM с статическим RP
- SSM для критичных потоков

**Топология**:
```
[Video Server] --- eth1 --- [VyOS RP] --- eth0 --- [Internet/VPC]
  2001:db8:100::10                |
  ff3e::1234 (SSM)                |--- eth2 --- [Office 1]
  ff05::5678 (SM)                 |               2001:db8:1::/64
                                  |--- eth3 --- [Office 2]
                                  |               2001:db8:2::/64
                                  |--- eth4 --- [Office 3]
                                                  2001:db8:3::/64
```

**VyOS RP конфигурация**:
```
# Интерфейсы
set interfaces ethernet eth0 address 2001:db8:10::1/64
set interfaces ethernet eth0 description 'WAN - VPC Interconnect'

set interfaces ethernet eth1 address 2001:db8:100::1/64
set interfaces ethernet eth1 description 'DMZ - Video Servers'

set interfaces ethernet eth2 address 2001:db8:1::1/64
set interfaces ethernet eth2 description 'Office 1'

set interfaces ethernet eth3 address 2001:db8:2::1/64
set interfaces ethernet eth3 description 'Office 2'

set interfaces ethernet eth4 address 2001:db8:3::1/64
set interfaces ethernet eth4 description 'Office 3'

# Loopback для RP
set interfaces loopback lo address 2001:db8:999::1/128

# PIM6 на всех интерфейсах
set protocols pim6 interface eth0
set protocols pim6 interface eth1
set protocols pim6 interface eth2
set protocols pim6 interface eth3
set protocols pim6 interface eth4

# MLD параметры для клиентских интерфейсов
set protocols pim6 interface eth2 mld version 2
set protocols pim6 interface eth2 mld interval 60

set protocols pim6 interface eth3 mld version 2
set protocols pim6 interface eth3 mld interval 60

set protocols pim6 interface eth4 mld version 2
set protocols pim6 interface eth4 mld interval 60

# Отключаем MLD на WAN
set protocols pim6 interface eth0 mld disable

# RP конфигурация
set protocols pim6 rp address 2001:db8:999::1

# SSM диапазон (автоматически для ff3x::/32)
set protocols pim6 ssm-range ff3e::/32

# DR Priority на server сегменте
set protocols pim6 interface eth1 dr-priority 100

# Firewall для IPv6 multicast
set firewall ipv6 input filter rule 100 action accept
set firewall ipv6 input filter rule 100 description 'Allow PIM6'
set firewall ipv6 input filter rule 100 protocol pim

set firewall ipv6 input filter rule 110 action accept
set firewall ipv6 input filter rule 110 description 'Allow MLD'
set firewall ipv6 input filter rule 110 protocol ipv6-icmp
set firewall ipv6 input filter rule 110 icmpv6 type 130-132

set firewall ipv6 input filter rule 120 action accept
set firewall ipv6 input filter rule 120 description 'Allow multicast traffic'
set firewall ipv6 input filter rule 120 destination address ff00::/8

# IPv6 Routing (OSPFv3 или BGP для unicast)
set protocols ospfv3 area 0 interface eth0
set protocols ospfv3 area 0 interface eth1
set protocols ospfv3 area 0 interface eth2
set protocols ospfv3 area 0 interface eth3
set protocols ospfv3 area 0 interface eth4
set protocols ospfv3 parameters router-id 10.0.0.1

commit
save
```

**Office роутеры** (пример для Office 1):
```
# Интерфейсы
set interfaces ethernet eth0 address 2001:db8:1::254/64
set interfaces ethernet eth0 description 'To RP'

set interfaces ethernet eth1 address 2001:db8:10::100/64
set interfaces ethernet eth1 description 'Clients'

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1

# MLD на клиентском интерфейсе
set protocols pim6 interface eth1 mld version 2
set protocols pim6 interface eth1 mld interval 60

# RP (тот же, что на main роутере)
set protocols pim6 rp address 2001:db8:999::1

# SSM
set protocols pim6 ssm-range ff3e::/32

# OSPFv3 для unicast
set protocols ospfv3 area 0 interface eth0
set protocols ospfv3 area 0 interface eth1
set protocols ospfv3 parameters router-id 10.0.0.2

commit
save
```

**Проверка**:
```
# На RP
show ipv6 pim interface
show ipv6 pim neighbor
show ipv6 pim rp-info
show ipv6 pim state

# На Office роутере
show ipv6 mld groups
show ipv6 pim join

# Мониторинг трафика
tcpdump -i eth1 -n 'ip6 and dst net ff00::/8'
```

### Пример 2: PIM6-SSM для IPv6-only сети (VK Cloud)

**Сценарий**:
- IPv6-only сеть в VK Cloud
- Используется только SSM (ff3e::/32)
- Нет необходимости в RP
- Видео конференции между офисами
- Источники в 2001:db8:100::/64

**Топология**:
```
[HQ Router] --- eth0 (2001:db8:10::1/64) --- [VK Cloud VPC]
     |                                              |
     eth1 (2001:db8:100::1/64)                     |
     |                                              |
[Video Server 2001:db8:100::10]            [Branch Router]
                                                    |
                                                    eth1 (2001:db8:200::1/64)
                                                    |
                                                [Users]
```

**HQ Router**:
```
# Интерфейсы
set interfaces ethernet eth0 address 2001:db8:10::1/64
set interfaces ethernet eth0 description 'VPC Interconnect'

set interfaces ethernet eth1 address 2001:db8:100::1/64
set interfaces ethernet eth1 description 'Video Servers'

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1

# Отключаем MLD на server интерфейсе
set protocols pim6 interface eth1 mld disable

# SSM only (no RP needed)
set protocols pim6 ssm-range ff3e::/32

# DR Priority
set protocols pim6 interface eth1 dr-priority 100

# Firewall
set firewall ipv6 input filter rule 100 action accept
set firewall ipv6 input filter rule 100 protocol pim

set firewall ipv6 input filter rule 110 action accept
set firewall ipv6 input filter rule 110 destination address ff3e::/32

# BGP для unicast routing
set protocols bgp system-as 65001
set protocols bgp neighbor 2001:db8:10::254 address-family ipv6-unicast
set protocols bgp neighbor 2001:db8:10::254 remote-as 65000

commit
save
```

**Branch Router**:
```
# Интерфейсы
set interfaces ethernet eth0 address 2001:db8:10::100/64
set interfaces ethernet eth0 description 'VPC Interconnect'

set interfaces ethernet eth1 address 2001:db8:200::1/64
set interfaces ethernet eth1 description 'Users'

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1

# MLDv2 для клиентов (обязательно для SSM)
set protocols pim6 interface eth1 mld version 2
set protocols pim6 interface eth1 mld interval 60

# SSM only
set protocols pim6 ssm-range ff3e::/32

# Firewall
set firewall ipv6 input filter rule 100 action accept
set firewall ipv6 input filter rule 100 protocol pim

set firewall ipv6 input filter rule 110 action accept
set firewall ipv6 input filter rule 110 destination address ff3e::/32

# BGP
set protocols bgp system-as 65001
set protocols bgp neighbor 2001:db8:10::254 address-family ipv6-unicast
set protocols bgp neighbor 2001:db8:10::254 remote-as 65000

commit
save
```

**Клиент подписка (Linux)**:
```bash
# SSM join: группа ff3e::1234, источник 2001:db8:100::10
smcroute -j eth0 2001:db8:100::10 ff3e::1234

# Или с помощью socat
socat UDP6-RECV:5000,ipv6-join-source-group='[ff3e::1234]:[2001:db8:100::10]:eth0' STDOUT
```

**Проверка**:
```
show ipv6 pim state
show ipv6 mld groups
```

### Пример 3: Embedded RP

**Сценарий**:
- Использование Embedded RP для упрощения конфигурации
- RP адрес: 2001:db8:999::1/64
- Группы: ff75:0040:2001:0db8:0999:0000::/96

**RP Router**:
```
# Интерфейсы
set interfaces loopback lo address 2001:db8:999::1/128

set interfaces ethernet eth0 address 2001:db8:10::1/64
set interfaces ethernet eth1 address 2001:db8:20::1/64

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1

# Embedded RP (автоматически для ff7x::/16)
# Никакой дополнительной конфигурации не требуется

commit
save
```

**Client Router**:
```
# Интерфейсы
set interfaces ethernet eth0 address 2001:db8:10::2/64
set interfaces ethernet eth1 address 2001:db8:100::1/64

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1

# Embedded RP - автоматически извлекается из адреса группы
# Никакой ручной конфигурации RP не требуется

commit
save
```

**Использование Embedded RP группы**:
Приложение использует группу вида:
```
ff75:0040:2001:0db8:0999:0000:0000:1234
```

Разбор:
- `ff75` - flags=7 (transient), scope=5 (site-local)
- `0040` - Riid=0, Plen=64
- `2001:0db8:0999:0000` - RP prefix (2001:db8:999::/64)
- `0000:1234` - Group ID

**Проверка**:
```
show ipv6 pim rp-info
```

Вывод:
```
RP address       Group                                  Source          State
2001:db8:999::1  ff75:40:2001:db8:999::/96              Embedded        Active
```

### Пример 4: BSR для динамического RP

**Сценарий**:
- Два Candidate-RP для redundancy
- Один BSR
- Автоматическое распространение RP информации

**BSR и Primary RP (Router1)**:
```
# Интерфейсы
set interfaces loopback lo address 2001:db8:100::1/128

set interfaces ethernet eth0 address 2001:db8:10::1/64
set interfaces ethernet eth1 address 2001:db8:20::1/64

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1

# BSR конфигурация
set protocols pim6 rp candidate-bsr address 2001:db8:100::1
set protocols pim6 rp candidate-bsr priority 100

# Candidate-RP конфигурация
set protocols pim6 rp candidate-rp address 2001:db8:100::1
set protocols pim6 rp candidate-rp priority 50
set protocols pim6 rp candidate-rp interval 30

commit
save
```

**Secondary RP (Router2)**:
```
# Интерфейсы
set interfaces loopback lo address 2001:db8:100::2/128

set interfaces ethernet eth0 address 2001:db8:10::2/64
set interfaces ethernet eth1 address 2001:db8:30::1/64

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1

# Backup BSR (lower priority)
set protocols pim6 rp candidate-bsr address 2001:db8:100::2
set protocols pim6 rp candidate-bsr priority 50

# Candidate-RP (lower priority)
set protocols pim6 rp candidate-rp address 2001:db8:100::2
set protocols pim6 rp candidate-rp priority 100
set protocols pim6 rp candidate-rp interval 30

commit
save
```

**Client Routers**:
```
# PIM6 на интерфейсах
set protocols pim6 interface eth0
set protocols pim6 interface eth1

# Нет статической конфигурации RP!
# RP информация получается через BSR

commit
save
```

**Проверка**:
```
show ipv6 pim bsr
show ipv6 pim rp-info
```

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

### Show Commands

**PIM6 интерфейсы**:
```
show ipv6 pim interface
```

Вывод:
```
Interface  State  Address            PIM Nbrs  PIM DR          DR Priority
eth0       up     2001:db8:10::1/64  2         2001:db8:10::1  100
eth1       up     2001:db8:20::1/64  0         local           1
```

**Детали интерфейса**:
```
show ipv6 pim interface eth0
```

Вывод:
```
Interface eth0:
  State: up
  Address: 2001:db8:10::1/64
  PIM Neighbors: 2
  PIM DR: 2001:db8:10::1
  DR Priority: 100
  Hello Interval: 30s
  Generation ID: 0x12345678
```

**PIM6 соседи**:
```
show ipv6 pim neighbor
```

Вывод:
```
Interface  Neighbor          Uptime     Holdtime  DR Priority  Generation ID
eth0       2001:db8:10::2    01:23:45   105       50           0xabcdef12
eth0       2001:db8:10::3    00:45:12   105       1            0x98765432
```

**Детали соседа**:
```
show ipv6 pim neighbor detail
```

**RP информация**:
```
show ipv6 pim rp-info
```

Вывод:
```
RP address       Group          Source          State      Priority  Holdtime
2001:db8:100::1  ff00::/8       Static          Active     -         -
2001:db8:100::1  ff3e::/32      BSR             Active     50        150
2001:db8:999::1  ff75::/16      Embedded        Active     -         -
```

**PIM6 state (multicast routes)**:
```
show ipv6 pim state
```

Вывод:
```
Installed Source           Group            IIF      OIL
1         2001:db8:100::10 ff3e::1234       eth0     eth1, eth2
1         *                ff05::5678       eth0     eth1
```

**Детали для группы**:
```
show ipv6 pim state ff3e::1234
```

**Join информация**:
```
show ipv6 pim join
```

Вывод:
```
Interface  Source           Group            State      Uptime     Expire   Prune
eth1       2001:db8:100::10 ff3e::1234       JOIN       00:15:23   00:00:45 -
eth0       *                ff05::5678       JOIN       00:10:12   00:00:38 -
```

**BSR информация**:
```
show ipv6 pim bsr
```

Вывод:
```
PIM6 Bootstrap Information
Current BSR Address: 2001:db8:100::1
Priority: 100
Hash Mask Length: 126
Expires: 00:01:45

Candidate BSR Address: 2001:db8:100::1
  Priority: 100
  Hash Mask Length: 126
```

**MLD groups**:
```
show ipv6 mld groups
```

Вывод:
```
Interface        Address                    Group                   Uptime    Expires
eth1             2001:db8:3::1              ff3e::1234              00:05:23  00:04:12
eth1             2001:db8:3::1              ff05::5678              00:03:45  00:04:18
```

**MLD интерфейсы**:
```
show ipv6 mld interface
```

Вывод:
```
Interface  State  Address            Version  Querier         Query Timer  Uptime
eth0       up     fe80::1            2        fe80::1         00:01:15     00:20:34
eth1       up     fe80::2            2        fe80::2         00:00:58     00:20:34
```

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

Вывод:
```
Interface eth1:
  State: up
  Link-local Address: fe80::2
  Version: 2
  Querier: fe80::2 (local)
  Query Interval: 125s
  Query Timer: 00:00:58
  Other Querier Present Timer: 00:00:00
  Startup Query Interval: 31s
  Startup Query Count: 2
  Last Member Query Interval: 1000ms
  Last Member Query Count: 2
  Uptime: 00:20:34
```

**MLD sources**:
```
show ipv6 mld sources
```

Вывод (для MLDv2 SSM):
```
Interface  Group           Source           Timer    Flags
eth1       ff3e::1234      2001:db8:100::10 00:04:15 I
```

**IPv6 Multicast Routing Table**:
```
show ipv6 mroute
```

Вывод:
```
Source           Group            Proto  Input      Output     Packets  Bytes
2001:db8:100::10 ff3e::1234       PIM6   eth0       eth1       15234    45678901
                                                     eth2       12456    37890123
*                ff05::5678       PIM6   eth0       eth1       5678     12345678
```

### Management Commands

**Restart PIM6**:
```
restart pim6
```

**Clear PIM6 interfaces**:
```
clear ipv6 pim interfaces
```

**Clear PIM6 oil (Outgoing Interface List)**:
```
clear ipv6 pim oil
```

## Troubleshooting

### Соседи не устанавливаются

**Проблема**: PIM6 соседи не видны.

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

1. **PIM6 включен на интерфейсах**:
   ```
   show ipv6 pim interface
   ```

2. **IPv6 connectivity**:
   ```
   ping6 2001:db8:10::2
   ```

3. **PIM Hello на wire**:
   ```
   tcpdump -i eth0 -vv ip6 proto 103
   ```

   Должны видеть PIM Hello на ff02::d.

4. **Firewall блокирует PIM**:
   ```
   set firewall ipv6 input filter rule 100 action accept
   set firewall ipv6 input filter rule 100 protocol pim
   commit
   ```

5. **Разные Hello intervals**:
   Убедитесь что Hello interval совпадает на обоих концах.

6. **MTU проблемы**:
   ```
   show interfaces ethernet eth0
   ```

   Проверьте что MTU достаточный для IPv6 PIM пакетов.

### RP не резолвится

**Проблема**: RP информация отсутствует.

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

1. **Статический RP настроен**:
   ```
   show ipv6 pim rp-info
   ```

   Должен показывать RP адрес.

2. **RP одинаковый на всех роутерах**:
   Проверьте конфигурацию на всех PIM6 роутерах:
   ```
   show protocols pim6 rp
   ```

3. **BSR работает**:
   ```
   show ipv6 pim bsr
   ```

   Должен показывать текущий BSR.

4. **C-RP Advertisement доходит до BSR**:
   ```
   tcpdump -i eth0 -vv 'ip6 proto 103 and dst ff02::d'
   ```

5. **Embedded RP формат правильный**:
   Проверьте что группа в формате ff7x::/16 и содержит валидный RP prefix.

### Трафик не доходит до получателей

**Проблема**: Клиенты подписаны, но multicast трафик не получают.

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

1. **MLD группы активны**:
   ```
   show ipv6 mld groups
   ```

2. **PIM Join отправлен**:
   ```
   show ipv6 pim join
   ```

   Должны видеть (*,G) или (S,G) Join.

3. **Multicast routing table**:
   ```
   show ipv6 mroute
   ```

   Должна быть запись для группы.

4. **PIM state**:
   ```
   show ipv6 pim state
   ```

   Проверьте IIF и OIL.

5. **Трафик на входном интерфейсе**:
   ```
   tcpdump -i eth0 -n 'ip6 and dst ff3e::1234'
   ```

6. **RPF check проходит**:
   ```
   show ipv6 route 2001:db8:100::10
   ```

   Unicast route к источнику должен указывать на IIF для multicast.

7. **Firewall разрешает multicast**:
   ```
   set firewall ipv6 input filter rule 120 action accept
   set firewall ipv6 input filter rule 120 destination address ff00::/8
   commit
   ```

### SSM не работает

**Проблема**: SSM группы не получают трафик.

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

1. **Группа в SSM диапазоне**:
   Должна быть ff3x::/32 (например ff3e::1234).

2. **MLDv2 включен**:
   ```
   show ipv6 mld interface
   ```

   Version должна быть 2.

   Если нет:
   ```
   set protocols pim6 interface eth1 mld version 2
   commit
   ```

3. **Клиент использует source-specific join**:
   На Linux:
   ```bash
   smcroute -j eth0 2001:db8:100::10 ff3e::1234
   ```

4. **(S,G) state существует**:
   ```
   show ipv6 pim state ff3e::1234
   ```

   Должна быть (S,G) запись, не (*,G).

5. **RP не настроен для SSM**:
   SSM не требует RP. Если есть RP конфигурация для ff3x::/32, удалите:
   ```
   delete protocols pim6 rp address <ipv6> group ff3e::/32
   commit
   ```

### Register пакеты не доходят до RP

**Проблема**: Источник активен, но RP не получает Register.

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

1. **DR определен правильно**:
   ```
   show ipv6 pim interface eth1
   ```

   PIM DR должен быть роутер, подключенный к источнику.

2. **RP адрес правильный**:
   ```
   show ipv6 pim rp-info
   ```

3. **Unicast route к RP**:
   ```
   show ipv6 route 2001:db8:100::1
   ```

   Должен быть маршрут к RP.

4. **Register на wire**:
   ```
   tcpdump -i eth0 -vv 'ip6 proto 103 and dst 2001:db8:100::1'
   ```

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

5. **Firewall на RP**:
   ```
   set firewall ipv6 input filter rule 100 action accept
   set firewall ipv6 input filter rule 100 protocol pim
   set firewall ipv6 input filter rule 100 source address 2001:db8::/16
   commit
   ```

### High CPU от PIM6

**Проблема**: Высокая загрузка CPU на роутере.

**Причины и решения**:

1. **Слишком много (S,G) entries**:
   ```
   show ipv6 pim state | wc -l
   ```

   Рассмотрите переход на SSM или увеличение ресурсов.

2. **Частые Join/Prune**:
   Увеличьте Join/Prune interval:
   ```
   set protocols pim6 join-prune-interval 120
   commit
   ```

3. **Слишком частые Hello**:
   Увеличьте Hello interval:
   ```
   set protocols pim6 interface eth0 hello 60
   commit
   ```

4. **Много MLD Query**:
   Увеличьте MLD interval:
   ```
   set protocols pim6 interface eth1 mld interval 125
   commit
   ```

5. **Multicast трафик обрабатывается CPU**:
   Проверьте hardware offloading:
   ```
   ethtool -k eth0 | grep offload
   ```

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

### Continuous Monitoring

**Мониторинг PIM6 neighbors**:
```
watch -n 5 'show ipv6 pim neighbor'
```

**Мониторинг multicast routes**:
```
watch -n 10 'show ipv6 mroute'
```

**Мониторинг MLD groups**:
```
watch -n 5 'show ipv6 mld groups'
```

**Packet capture для PIM6**:
```
tcpdump -i eth0 -vv ip6 proto 103
```

**Packet capture для MLD**:
```
tcpdump -i eth1 -vv 'icmp6 and (ip6[40] == 130 or ip6[40] == 131 or ip6[40] == 132 or ip6[40] == 143)'
```

**Packet capture для multicast трафика**:
```
tcpdump -i eth1 -n 'ip6 and dst net ff00::/8'
```

**Конкретная группа**:
```
tcpdump -i eth1 -n 'ip6 and dst ff3e::1234'
```

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

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

**Syslog для протоколов**:
```
set system syslog global facility protocols level info
commit
```

**External syslog**:
```
set system syslog host 2001:db8:100::100 facility protocols level info
set system syslog host 2001:db8:100::100 port 514
commit
```

**Debug logging** (для troubleshooting):
```
set system syslog global facility protocols level debug
commit
```

**Осторожно**: Debug может генерировать много логов.

После troubleshooting вернуть:
```
set system syslog global facility protocols level info
commit
```

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

### Дизайн сети

1. **RP размещение**:
   - RP в центре сети для минимизации задержки
   - Используйте loopback для RP адреса (стабильность)
   - Рассмотрите redundancy с BSR + несколько C-RP

2. **SSM vs SM**:
   - Используйте SSM (ff3x::/32) где возможно
   - SM только для Any-Source Multicast
   - SSM не требует RP и более эффективен

3. **Embedded RP vs Static RP**:
   - Embedded RP для упрощения конфигурации
   - Static RP для полного контроля
   - BSR для динамического RP в крупных сетях

4. **Scope selection**:
   - ff02::/16 - Link-local (только один hop)
   - ff05::/16 - Site-local (в пределах site)
   - ff08::/16 - Organization-local (вся организация)
   - ff0e::/16 - Global (весь Internet)

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

1. **DR Priority**:
   - Устанавливайте высокий DR priority на роутере ближайшем к источнику
   - Контролирует кто отправляет Register на RP

2. **Hello Interval**:
   - По умолчанию 30 секунд подходит для большинства сетей
   - Уменьшайте для быстрой сходимости (нагрузка на CPU)
   - Увеличивайте для стабильных сетей с медленными links

3. **MLD Version**:
   - Используйте MLDv2 для SSM support
   - MLDv1 только для legacy devices

4. **PIM6 на всех интерфейсах**:
   - Включайте PIM6 на всех интерфейсах, участвующих в multicast
   - Отключайте MLD на transit/upstream интерфейсах

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

1. **Firewall для PIM6**:
   ```
   set firewall ipv6 input filter rule 100 action accept
   set firewall ipv6 input filter rule 100 protocol pim
   set firewall ipv6 input filter rule 100 source address 2001:db8::/16
   ```

2. **Ограничение multicast групп**:
   ```
   set firewall ipv6 input filter rule 120 action accept
   set firewall ipv6 input filter rule 120 destination address ff3e::/32
   set firewall ipv6 input filter rule 120 description 'Allow only company SSM'
   ```

3. **Rate limiting для MLD**:
   ```
   set firewall ipv6 input filter rule 110 action accept
   set firewall ipv6 input filter rule 110 protocol ipv6-icmp
   set firewall ipv6 input filter rule 110 icmpv6 type 130-132
   set firewall ipv6 input filter rule 110 limit rate 10/second
   ```

4. **Drop неизвестный multicast**:
   ```
   set firewall ipv6 input filter rule 999 action drop
   set firewall ipv6 input filter rule 999 destination address ff00::/8
   set firewall ipv6 input filter rule 999 description 'Drop unknown multicast'
   ```

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

1. **SPT Switchover**:
   - По умолчанию VyOS переключается на SPT сразу
   - Для load на RP можно оставить на shared tree:
   ```
   set protocols pim6 spt-switchover infinity-and-beyond
   ```

2. **Register Suppression**:
   - Увеличьте для снижения нагрузки на DR:
   ```
   set protocols pim6 register-suppress-time 120
   ```

3. **Hardware Offloading**:
   - Включайте где доступно для multicast forwarding
   - Проверка:
   ```
   ethtool -k eth0 | grep offload
   ```

4. **Мониторинг ресурсов**:
   ```
   show system resources
   show ipv6 pim state | wc -l
   ```

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

### PIM6 + OSPFv3

**Сценарий**: OSPFv3 для unicast, PIM6 для multicast.

```
# OSPFv3
set protocols ospfv3 area 0 interface eth0
set protocols ospfv3 area 0 interface eth1
set protocols ospfv3 parameters router-id 10.0.0.1

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1
set protocols pim6 rp address 2001:db8:100::1

commit
```

**Важно**: PIM6 использует OSPFv3 unicast routes для RPF check.

### PIM6 + BGP

**Сценарий**: BGP для IPv6 unicast, PIM6 для multicast.

```
# BGP
set protocols bgp system-as 65001
set protocols bgp neighbor 2001:db8:10::254 address-family ipv6-unicast
set protocols bgp neighbor 2001:db8:10::254 remote-as 65000

# PIM6
set protocols pim6 interface eth0
set protocols pim6 interface eth1
set protocols pim6 rp address 2001:db8:100::1

commit
```

**Важно**: BGP routes используются для RPF check в PIM6.

### PIM6 + VPN (IPsec/WireGuard)

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

**IPsec с VTI**:
```
# VTI интерфейс
set interfaces vti vti0 address 2001:db8:999::1/64

# PIM6 на VTI
set protocols pim6 interface vti0

# RP
set protocols pim6 rp address 2001:db8:100::1

commit
```

**WireGuard**:
```
# WireGuard интерфейс
set interfaces wireguard wg0 address 2001:db8:888::1/64

# PIM6 на WireGuard
set protocols pim6 interface wg0

commit
```

**Важно**: Multicast через VPN может иметь performance impact.

### PIM6 + IPv4 (Dual Stack)

**Сценарий**: Одновременно PIM для IPv4 и PIM6 для IPv6.

```
# PIM для IPv4
set protocols pim interface eth0
set protocols pim interface eth1
set protocols pim rp address 10.0.0.1

# PIM6 для IPv6
set protocols pim6 interface eth0
set protocols pim6 interface eth1
set protocols pim6 rp address 2001:db8:100::1

commit
```

**Применение**:
- Dual-stack multicast
- Миграция с IPv4 на IPv6
- Legacy applications (IPv4) + новые (IPv6)

## Сравнение PIM6 с другими решениями

### PIM6 vs IGMP Proxy для IPv6

| Характеристика | PIM6 | IGMP/MLD Proxy |
|---------------|------|----------------|
| Сложность | Высокая | Низкая |
| Топология | Любая | Простая (дерево) |
| Масштабируемость | Высокая | Ограниченная |
| RP требуется | Да (SM) | Нет |
| Redundancy | Полная | Ограниченная |
| Применение | Core/Data center | Edge/Branch |

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

**Когда использовать MLD Proxy**:
- Простая топология (один источник)
- Branch office
- IPTV от провайдера
- Ограниченные ресурсы

### PIM6-SM vs PIM6-SSM

| Характеристика | PIM6-SM | PIM6-SSM |
|---------------|---------|----------|
| RP требуется | Да | Нет |
| Группы | ff00::/8 (кроме ff3x::/32) | ff3x::/32 |
| (*,G) tree | Да | Нет |
| (S,G) tree | Да | Да |
| Сложность | Высокая | Низкая |
| Безопасность | Средняя | Высокая |
| MLD Version | MLDv1/v2 | MLDv2 |

**Когда использовать PIM6-SM**:
- Any-Source Multicast
- Множество динамических источников
- Legacy applications

**Когда использовать PIM6-SSM**:
- Известные источники
- Видео distribution
- IPTV, streaming
- Улучшенная безопасность

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

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

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

# pim6-monitor.sh
# Мониторинг PIM6 соседей

LOG_FILE="/var/log/pim6-monitor.log"
EXPECTED_NEIGHBORS=2

check_neighbors() {
    local neighbor_count=$(vtysh -c "show ipv6 pim neighbor" | grep -c "eth0")

    if [ "$neighbor_count" -lt "$EXPECTED_NEIGHBORS" ]; then
        echo "$(date): WARNING - Only $neighbor_count neighbors, expected $EXPECTED_NEIGHBORS" >> "$LOG_FILE"
        return 1
    else
        echo "$(date): OK - $neighbor_count neighbors present" >> "$LOG_FILE"
        return 0
    fi
}

check_neighbors

vtysh -c "show ipv6 pim neighbor"
vtysh -c "show ipv6 pim interface"
```

**Установка в cron**:
```bash
*/5 * * * * /usr/local/bin/pim6-monitor.sh
```

### RP failover скрипт

**Скрипт для проверки RP доступности**:
```bash
#!/bin/bash

# rp-watchdog.sh
# Проверка RP и переключение на backup

PRIMARY_RP="2001:db8:100::1"
BACKUP_RP="2001:db8:100::2"
LOG_FILE="/var/log/rp-watchdog.log"

check_rp() {
    if ping6 -c 3 -W 2 "$PRIMARY_RP" > /dev/null 2>&1; then
        return 0
    else
        return 1
    fi
}

if ! check_rp; then
    echo "$(date): Primary RP $PRIMARY_RP unreachable, switching to backup" >> "$LOG_FILE"

    vtysh << EOF
configure terminal
protocols pim6 rp address $BACKUP_RP
commit
save
exit
EOF

    echo "$(date): Switched to backup RP $BACKUP_RP" >> "$LOG_FILE"
else
    echo "$(date): Primary RP $PRIMARY_RP is reachable" >> "$LOG_FILE"
fi
```

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

### RFC Documents

- **RFC 4601** - Protocol Independent Multicast - Sparse Mode (PIM-SM): Protocol Specification
- **RFC 7761** - Protocol Independent Multicast - Sparse Mode (PIM-SM): Protocol Specification (обновление)
- **RFC 3810** - Multicast Listener Discovery Version 2 (MLDv2) for IPv6
- **RFC 2710** - Multicast Listener Discovery (MLD) for IPv6
- **RFC 3956** - Embedding the Rendezvous Point (RP) Address in an IPv6 Multicast Address
- **RFC 4607** - Source-Specific Multicast for IP
- **RFC 5059** - Bootstrap Router (BSR) Mechanism for Protocol Independent Multicast (PIM)
- **RFC 4291** - IP Version 6 Addressing Architecture

### VyOS Documentation

- [VyOS PIM6 Documentation](https://docs.vyos.io/en/latest/configuration/protocols/pim6.html)
- [VyOS PIM Documentation](https://docs.vyos.io/en/latest/configuration/protocols/pim.html)
- [VyOS IPv6 Configuration](https://docs.vyos.io/en/latest/configuration/interfaces/index.html)

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

- **FRRouting (FRR)** - Routing suite используемый VyOS для PIM6
- **smcroute** - Static multicast routing tool
- **iperf3** - Network performance testing (multicast режим)
- **tcpdump** - Packet capture
- **Wireshark** - Packet analyzer
- **VLC** - Media player с multicast поддержкой

### Community

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

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

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

- **[PIM (IPv4)](/docs/vyos/routing/vyos-pim)** - для IPv4 multicast
- **[IGMP Proxy](/docs/vyos/routing/vyos-igmp)** - для простых IPv4 multicast сценариев
- **[OSPFv3](/docs/vyos/routing/vyos-ospf/)** - для IPv6 unicast routing
- **[BGP](/docs/vyos/routing/vyos-bgp/)** - для IPv6 BGP routing
- **[Firewall](/docs/vyos/firewall/vyos-firewall/)** - для защиты multicast сетей
- **[QoS](/docs/vyos/qos/)** - для приоритизации multicast трафика

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

PIM6 обеспечивает эффективную multicast маршрутизацию в IPv6 сетях. Правильная конфигурация RP, использование SSM для известных источников и интеграция с MLD обеспечивают стабильную работу современных multicast приложений в Yandex Cloud и VK Cloud.

**Ключевые моменты**:
- PIM6 работает с MLD вместо IGMP
- RP требуется для PIM6-SM, но не для SSM
- SSM (ff3x::/32) рекомендуется для большинства сценариев
- Embedded RP упрощает конфигурацию
- BSR обеспечивает динамическое распространение RP
- Firewall и security критичны для production
- Мониторинг neighbors, RP и multicast routes обязателен

