Estou tentando ingressar em um fluxo multicast IGMP de uma máquina Centos 8, mas depois de enviar um JOIN, não há tráfego vindo do switch.
Conexão simples:
MUX <-----------> cisco3850 <--------> Centos8
192.168.117.13 192.168.117.21
O switch upstream (cisco catalisador 3850) é alimentado com um MPEG-TS para 239.1.1.1:4000 do MUX.
Eu tentei socat
meu próprio programa para abrir um soquete, ingressar no stream e manter o soquete aberto. Ambos enviam a mesma mensagem de junção IGMP confirmada pelo 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
Usando ip route add
criei rotas para grupos multicast para a interface:
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
e cat /proc/net/igmp
mostra que o grupo se juntou:
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
EUsuspeitoeste é um problema do switch e não do Linux, mas o cliente (que possui o switch) diz que está tudo bem.
O que mais posso fazer no lado do Linux para investigar/corrigir esse problema?
Se for um problema no switch, o que acontecerá? O que precisa ser configurado lá? (precisa explicar ao cliente)
Para referência, meu programa que une e mantém o soquete aberto se parece com:
// 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);
Responder1
No final, o switch do cliente não pôde/não quis ativar o IGMPv3, então configuramos nossa máquina para usar o IGMP v2 criando um arquivo em /etc/sysctl.d
.
O JOIN funcionou, mas o Linux não respondeu às consultas de associação multicast, então o switch interrompeu o fluxo após 1-2 minutos (mesmo que tivéssemos net.ipv4.conf.default.rp_filter
definido como zero).
Acontece que para desabilitar totalmente a validação do caminho de retorno, precisávamos definir todas as rp_filter
configurações como zero (incluindo listar explicitamente a interface)
# 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