Estou com um problema semelhante ao Linux Kernel que não está passando pacotes multicast UDP só transmitem em vez de multicast, e nada do que eu tentei ajudou.
Eu tenho um dispositivo em 192.168.0.1 emitindo pacotes UDP de transmissão, conectado diretamente a eth1 (192.168.0.2). eth0 é minha rede real. ifconfig me informa que o endereço de broadcast, como esperado, é 192.168.255.255
$ sudo ifconfig
eth0 Link encap:Ethernet HWaddr 54:04:a6:64:b5:a6
inet addr:172.16.128.1 Bcast:172.16.255.255 Mask:255.255.0.0
inet6 addr: fe80::5604:a6ff:fe64:b5a6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1526809 errors:0 dropped:0 overruns:0 frame:0
TX packets:986480 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:807179430 (807.1 MB) TX bytes:747692150 (747.6 MB)
eth1 Link encap:Ethernet HWaddr 00:50:b6:15:6e:9a
inet addr:192.168.0.2 Bcast:192.168.255.255 Mask:255.255.0.0
inet6 addr: fe80::250:b6ff:fe15:6e9a/64 Scope:Link
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:544315 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:572619380 (572.6 MB) TX bytes:77544 (77.5 KB)
O tcpdump confirma que tenho dados atingindo a porta.
$ sudo tcpdump -c 4 -l -n -i eth1 'udp and port 61440'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
09:24:51.101619 IP 192.168.0.1.0 > 255.255.255.255.61440: UDP, length 1024
09:24:51.103980 IP 192.168.0.1.0 > 255.255.255.255.61440: UDP, length 1024
09:24:51.106205 IP 192.168.0.1.0 > 255.255.255.255.61440: UDP, length 1024
09:24:51.108584 IP 192.168.0.1.0 > 255.255.255.255.61440: UDP, length 1024
4 packets captured
114 packets received by filter
0 packets dropped by kernel
Mas de qualquer coisa que eu tentei realmente pegar esses pacotes, eu tenho o silêncio do rádio, quer eu os execute como usuário ou root.
$ nc -lu 192.168.255.255 61440
$ socat UDP4-RECV:61440,reuseaddr,bind=192.168.255.255 STDOUT,nonblock=1
Também tentei escrever meu próprio C e meu próprio Python. Nada. Algo em tudo isso está roubando meus pacotes. Alguma idéia sobre o que? Ubuntu 14.04.
Editar para adicionar:
Nenhum firewall em execução. O ufw reporta-se inativo, e o iptables reporta todas as 3 tabelas como um ACCEPT simples.
Também tentei que o netcat e o socat vinculassem o endereço de broadcast geral de 255.255.255.255, ou o endereço local eth1 192.168.0.2. Nenhum pacote foi recebido em nenhuma tentativa.
As tabelas de roteamento não mostram nada fora do comum:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 1 0 0 eth0
192.168.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
Eu sei que a interface de rede está funcionando corretamente. Se eu desconectar esse dispositivo e anexar um tipo diferente (que está tentando DHCP) ele se conecta com êxito à instância do dnsmasq e recebe uma concessão corretamente.
Curiosamente, pedir socat para me dar pacotes IP brutos torna-os muito bem:
$ sudo socat IP4-RECVFROM:17 STDOUT | hexdump
0000000 0000 00f0 0804 4bb1 6463 6665 6867 6a69
0000010 6c6b 6e6d 606f 6261 6463 6665 6867 6a69
*
0000408
EDIÇÃO FINAL:
Entrando e olhando mais profundamente os pacotes, parece que eles têm checksums ruins. Eu acho que eles não estão sendo repassados através da pilha UDP por causa disso. Eu também fiquei sem tempo para soluções elegantes para esse problema, e decidi forçá-lo abrindo um soquete em pacotes IP brutos e filtrando-os eu mesmo. Obrigado a todos pela ajuda.