Проблемы приема мультикаста

Как принять мультикаст

Проверить возможность приема мультикаст-потока на компьютере можно следующими способами:

  1. Попытаться запустить зонд и поставить ему задачу анализировать нужный мультикаст-поток.

  2. Попробовать проиграть поток в сетевом плеере (например, в VLC плеере). Если поток начинает проигрываться, это означает, что вещание доходит до вашего компьютера и может быть принято Boro зондом. Если поток плеером не проигрывается, это еще не означает, что вы не получаете мультикаст. Возможно, у вас неправильно (иначе) настроена таблица маршрутизации. Для обхода правил маршрутизации Boro использует прямое указание сетевого интерфейса: заполните правильно поле “IP сетевого интерфейса” и проверьте, принимает ли Boro зонд данные. Если поле “IP сетевого интерфейса” оставлено пустым, зонд будет принимать данные согласно таблице маршрутизации.

  3. Попробовать сдампить поток утилитой socat. Подробнее об утилите и пример команды читайте в разделе Дамп мультикаст-потоков. Если дамп создается успешно, это означает, что вы принимаете поток. Если файл дампа создается, но в него ничего не записывается (размер файла равен 0), это означает, что вы по каким-либо причинам не получаете указанный поток в пользовательское пространство (user space). Т.к. socat использует прямое указание сетевого интерфейса, таблица маршрутизации не влияет на возможность получения потока.

Если другие программы (плеер) принимают мультикаст, обратитесь к разделу Компьютер принимает мультикаст, но зонд его не видит.
Если же никакое ПО не может принять поток, требуются дополнительные исследования и настройки, обратитесь к разделу Компьютер не принимает мультикаст.

Компьютер принимает мультикаст, но зонд его не видит

Если ваш компьютер получает указанный мультикаст-поток, то проблема может быть в настройке зонда:

  1. Наиболее популярной проблемой является невнимательная постановка задачи анализатору. Т.е. проблема банально кроется в ошибках написания мультикаст-группы.

    Пример правильного указания URI: udp://235.0.0.5:1234.
    Примеры адреса с ошибкой: udp://235.0.0:5:1234 или udp://235.0.0.0.5:1234.

    На первый взгляд досадную ошибку сложно обнаружить, пожалуйста, проверяйте внимательно задаваемые URI.

  2. Второй типичной ошибкой является указание неправильного IP-адреса интерфейса. Проверьте правильность указания IP-адреса, убедитесь, что данный интерфейс все еще присутствует в системе и что именно данный интерфейс используется для приема мультикаста. В качестве адреса могут выступать IP сетевых карт, виртуальных интерфейсов и адрес 127.0.0.1 (localhost). Если адрес не задан, потоки будут приниматься согласно системной таблице маршрутизации.

    Подобная ошибка часто возникает при ручном копировании конфигурации анализаторов с одного компьютера на другой. Мы рекомендуем для данных целей использовать удобный инструмент сохранения/применения конфигурации на сервере.

  3. Если во время работы зонда пользователь изменял сетевые настройки (например получил другой IP-адрес или добавил VLAN) перезапуск зонда может решить проблему приема мультикаста.

Компьютер не принимает мультикаст

Проверка наличия трафика до компьютера

Чтобы определить, принимает ли компьютер мультикаст-вещание необходимо использовать захват трафика. Данный способ позволяет исключить влияние системных фильтров и фаервола на прием мультикаста. Необходимо выполнить два шага:

  1. Подписаться на мультикаст-группу;

  2. Исследовать трафик на необходимом сетевом интерфейсе.

Linux

Подписаться на мультикаст-группу можно следующей командой:

socat -u UDP4-RECV:7777,ip-add-membership=<MULTICAST_IP>:<NIC_IP>,reuseaddr CREATE:/dev/null

Проследить трафик можно несколькими способами, все они связаны с захватом трафика (т. н. packet capture) в обход всевозможных системных фильтров. Кроме этого, можно использовать режим Promiscuous mode, в котором сетевая карта позволяет принимать все пакеты независимо от того, кому они адресованы:

  1. Утилита iftop в promiscuous mode (см. Инструкцию):

    sudo iftop -p -i <INTERFACE_NAME> -F <MULTICAST_IP>/32
    

    В таблице должна отобразиться строка с указанной группой.

  2. Утилита tcpdump (см. Руководство):

    tcpdump -i <INTERFACE_NAME> dst <MULTICAST_IP> and udp dst port <MULTICAST_PORT>
    

    Должен отобразиться список принимаемых пакетов по указанному MULTICAST IP (необходимо подождать 10-20с).

Windows

Подписаться на мультикаст-группу можно, запустив поток в плеере VLC или начав дампить поток с помощью утилиты socat.

Для отслеживания трафика рекомендуется использовать следующие утилиты:

  1. Утилита WinDump (см. Руководство). Требует установки драйвера WinPcap или NPcap. Команда идентична команде, описанной для ОС Linux:

    WinDump.exe -i <INTERFACE_INDEX> dst <MULTICAST_IP> and udp dst port <MULTICAST_PORT>
    

    Единственным отличием является указание имени адаптера - для версии Windows используются индексы, которые можно получить командой:

    WinDump.exe -D
    
  2. Программа WireShark (загрузить программу и прочитать руководство по использованию вы можете на официальном сайте Wireshark). Отфильтровать трафик можно по правилу: dst <MULTICAST_IP> and udp dst port <MULTICAST_PORT>.

Если вы не видите трафика, то причиной могут быть проблемы в источнике мультикаст-вещания, сетевом оборудовании или подписке по протоколу IGMP. Исследование таких проблем выходит за рамки данного руководства.
Если трафик доходит до компьютера, то, скорее всего, он фильтруется и не попадает в пользовательское пространство. Далее будут описаны возможные причины, по которым трафик может быть отфильтрован.

Проверка влияния Firewall

Linux - CentOS

Для проверки влияния firewall можно его временно отключить:

systemctl stop firewalld

В CentOS 7/8 вместо отключения firewall можно использовать один из способов:

  1. Добавить разрешения для всех входящих IGMP и мультикаст UDP-пакетов на всех интерфейсах:

    firewall-cmd --permanent --add-rich-rule="rule family=ipv4 destination address=224.0.0.0/4 protocol value=udp accept"
    firewall-cmd --permanent --add-rich-rule="rule family=ipv4 protocol value=igmp accept"
    firewall-cmd --reload
    
  2. Переместить интерфейс с мультикастами в доверительную зону (в терминах FirewallD in CentOS):

    firewall-cmd --zone=trusted --change-interface=<INTERFACE_NAME>
    

Linux - Ubuntu

Для проверки влияния firewall можно его временно отключить:

ufw disable

Вместо отключения firewall можно добавить разрешения для всех входящих IGMP и мультикаст UDP-пакетов на всех интерфейсах:

ufw allow proto udp to 224.0.0.0/4
ufw allow proto igmp to any

Windows

Случается, что брандмауэр Windows блокирует доступ к мультикаст-вещанию. Разрешите использовать частные и публичные сети для работы streamMonitor.exe (установите две галочки в Брандмауэре Windows).

Примечание

Способы настройки брандмауэра могут отличаться в различных версиях ОС Windows, воспользуйтесь поиском в вашем браузере.

Reverse Path Filtering

Linux

Reverse Path Filtering - это механизм, проверяющий “маршрутизируемость” до отправителя пакета (подробнее). Чтобы проверить влияние RPF на определенный интерфейс <IFACE>, отключите RPF-фильтр используя следующие команды:

echo 0 >/proc/sys/net/ipv4/conf/<IFACE>/rp_filter
echo 0 >/proc/sys/net/ipv4/conf/all/rp_filter

После отключения фильтра проверьте начал ли зонд принимать данные. В некоторых случаях может потребоваться перезапуск зонда. Если зонд начал принимать данные и влияние RPF-фильтра установлено, то для постоянного отключения фильтра рекомендуется внести следующие правки в sysctl.conf (вместо <IFACE> при этом нужно указать имя интерфейса):

cat >>/etc/sysctl.conf <<EOF
# disable RP filter:
net.ipv4.conf.<IFACE>.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
EOF

Таким образом, после внесения правок и перезагрузки ОС RPF-фильтр останется отключенным для целевого интерфейса.

Повышенные привилегии

Linux

Использование порта меньше 1024 требует повышенных привилегий (root user). Порты из этого диапазона считаются системными во многих ОС, поэтому зонд не сможет получать данные. При запуске от обычного пользователя зонд будет выдавать подобный лог в консоль:

09:08:28 source_udp_start()[258]: Creating UDP/RTP receiver for 224.1.5.172:1001 (bind iface 172.16.67.10)
09:08:28 small_rtp_init_receiver()[254]: ERROR: bind failed, err 0xD
09:08:28 small_rtp_init2()[414]: ERROR: small_rtp_init_receiver: failed
09:08:28 source_udp_start()[279]: ERROR: small_rtp_init failed with code -1

Самое простое решение - запускать зонд от root командой:

sudo ./streamMonitor

Версии IGMP-протокола

Linux

Иногда устаревшее сетевое оборудование может не поддерживать последнюю версию IGMP-протокола. Посмотреть версию IGMP и IP адреса, подписанные на прием мультикаста, можно в файле:

cat /proc/net/igmp

Принудительный выбор версии IGMP для необходимого сетевого интерфейса осуществляется командой:

echo 2 > /proc/sys/net/ipv4/conf/<IFACE>/force_igmp_version

Дамп мультикаст-потоков

Самый простой способ сдампить (сохранить в .ts файл) мультикаст-поток - использовать утилиту socat. Подробная информация по использованию утилиты представлена в Руководстве.

Linux

Пример команды:

MULTICAST=235.0.0.1:1234
INTERFACE=10.10.30.229 # name, ip or id of network interface
socat -u \
    UDP4-RECV:${MULTICAST#*:},ip-add-membership=${MULTICAST%:*}:$INTERFACE,bind=${MULTICAST%:*},reuseaddr \
    CREATE:dump_$(tr ':' '_' <<<"$MULTICAST").$(date +'%F_%H.%M').ts

Создастся файл с указанными именем и датой, в который будет записываться поток, пока утилита не будет остановлена.

Windows

На момент написания статьи была протестирована версия socat 2.0.0 (beta 5) под управлением Windows 8.1. Скачать портированную версию утилиты socat можно на странице загрузки.

Пример команды:

socat -u UDP4-RECV:<PORT>,ip-add-membership=<MULTICAST_IP>:<NIC_IP>,reuseaddr CREATE:dump_name.ts

Создастся файл с указанным именем, в который будет записываться поток, пока утилита не будет остановлена.