IGMP v3 JOIN отправлен, но нет трафика от коммутатора

IGMP v3 JOIN отправлен, но нет трафика от коммутатора

Я пытаюсь присоединиться к многоадресному потоку IGMP с машины Centos 8, но после отправки JOIN с коммутатора не поступает трафик.

Простое подключение:

MUX <-----------> cisco3850 <--------> Centos8
192.168.117.13                         192.168.117.21

На коммутатор верхнего уровня (Cisco Catalyst 3850) подается MPEG-TS на 239.1.1.1:4000 от MUX.

Я пробовал оба socatи свою собственную программу для открытия сокета, присоединения к потоку и удержания сокета открытым. Оба отправляют одно и то же сообщение о присоединении IGMP, что подтверждается wireshark:

Internet Group Management Protocol
    [IGMP Version: 3]
    Type: Membership Report (0x22)
    Reserved: 00
    Checksum: 0xe9fb [correct]
    [Checksum Status: Good]
    Reserved: 0000
    Num Group Records: 1
    Group Record : 239.1.1.1  Change To Exclude Mode
        Record Type: Change To Exclude Mode (4)
        Aux Data Len: 0
        Num Src: 0
        Multicast Address: 239.1.1.1

Используя ip route addя создал маршруты для групп многоадресной рассылки к интерфейсу:

224.0.0.0/4 dev eth1 scope link
225.0.0.0/8 dev eth1 scope link
239.0.0.0/8 dev eth1 scope link

и cat /proc/net/igmpпоказывает, что к группе присоединились:

cat /proc/net/igmp
Idx     Device    : Count Querier       Group    Users Timer    Reporter
3       eth1      :     2      V3
                                030101E1     1 0:00000000               0
                                010000E0     1 0:00000000               0

яподозреватьЭто проблема коммутатора, а не Linux, но клиент (владелец коммутатора) утверждает, что все в порядке.

Что еще я могу сделать на стороне Linux, чтобы исследовать/исправить эту проблему?

Если проблема в коммутаторе, то в чем? Что там нужно настроить? (нужно объяснить клиенту)


Для справки, моя программа, которая присоединяется и удерживает сокет открытым, выглядит так:

// Error checking omitted for brevity
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes);

memset(&saddr, 0, sizeof(saddr));
saddr.sin_family      = PF_INET;
saddr.sin_addr.s_addr = mcastAddr;
saddr.sin_port        = htons(port);

bind(fd, (struct sockaddr *)&saddr, sizeof(saddr);

struct ip_mreq mcastReq;
mcastReq.imr_multiaddr.s_addr = mcastAddr;
&mcastReq.imr_interface.s_addr = interfaceAddr;

setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcastReq, sizeof(mcastReq);

решение1

В конце концов, коммутатор клиента не смог/не захотел активировать IGMPv3, поэтому мы настроили нашу машину на использование IGMP v2, создав файл в формате /etc/sysctl.d.

Затем JOIN сработал, но Linux не ответил на запросы на членство в многоадресной рассылке, поэтому коммутатор отключил поток через 1-2 минуты (хотя мы установили net.ipv4.conf.default.rp_filterноль).

Оказывается, чтобы полностью отключить проверку обратного пути, нам нужно было установить все rp_filterнастройки на ноль (включая явное указание интерфейса)

# Set IGMP Version for eth1
# Set to '2' or '3' depending on what is enabled in the switch
net.ipv4.conf.eth1.force_igmp_version = 2

# Disable source route verification
# In addition to 90-torque.conf, also explicitly set eth1 to ignore
# return path validation
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0

Связанный контент