Recebendo pacotes UDP de transmissão no Linux

1

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.

    
por Rgaddi 01.06.2016 / 18:32

2 respostas

1

Aqui está um script python para testar conexões UDP que usei no passado:

import socket
#---socket creation
connexion = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

#---Bind
try:
    connexion.bind(('', 10015))
except socket.error:
    print "connexion failed"
    connexion.close()
    sys.exit()

#---testing
while 1:
    data, addr = connexion.recvfrom(1024)
    print "messages : ",addr , data

O seguinte pode ser inserido no prompt do shell para testar o envio de uma mensagem

echo -n "TEST MESSAGE" >/dev/udp/127.0.0.1/10015

Testá-lo de localhost para localhost seria a primeira etapa de solução de problemas e, em seguida, de outro computador para o computador em questão.

    
por 02.06.2016 / 18:13
0

Eu tive problemas semelhantes quando configurei uma interface de rede secundária manualmente e não configurei o roteamento adequadamente para essa interface.

Tente executar: route -n e veja qual é a configuração de roteamento para eth1.

    
por 02.06.2016 / 17:49

Tags