cliente udp enviando "porta inacessível" ao receber mensagens do servidor

2

(Nota: eu mudei esta questão do StackOverflow, porque é para ser considerado off-topic lá, melhor se encaixa aqui, e ainda não resolvido)

Eu tenho um cliente udp usando o luasocket, basicamente fazendo isso (com algumas camadas de abstração, mas é isso que está acontecendo lá):

s=socket.udp()
s:setsockname("*",0)
s:setpeername(socket.dns.toip("example.com"),64299)
s:settimeout(0)
s:send(...)
s:settimeout(10)
msg,err=s:receive()
s:settimeout(0)
print(msg,err)

ao ver tudo está bem na saída de depuração do servidor (ssh para o host remoto), recebo um erro de "timeout" no cliente.

ao inspecionar tudo com wireshark do lado do cliente, vejo o pacote enviado pelo cliente e um pacote de resposta do servidor (porta correta e tudo) E um pacote "porta inacessível" do ICMP enviado do host do cliente para o servidor em resposta a sua resposta (correta).

o que está acontecendo lá? Eu tentei de tudo, incluindo a redefinição do meu iptables para "aceitar tudo", mas meu cliente ainda envia a "porta inacessível".

os pacotes relevantes são:

From            To                  Len Description
192.168.2.100   95.143.172.171  UDP 61  Source port: 45025  Destination port: 64299
  000e8f11e7000025229835a908004500002f4008400040112b6fc0a802645f8facabafe1fb2b001b28d794d2000ec8360100aa81a477616e74a3756964
95.143.172.171  192.168.2.100   UDP 60  Source port: 64299  Destination port: 45025
  0025229835a9000e8f11e70008004500002b000040003911727b5f8facabc0a80264fb2bafe100172e8d94d2000e0ea10100a681a3756964ff000000
192.168.2.100   95.143.172.171  ICMP 85 Destination unreachable (Port unreachable)
  000e8f11e7000025229835a9080045c00047061d00004001a492c0a802645f8facab0303cc6c000000004500002b000040003911727b5f8facabc0a80264fb2bafe100172e8d94d2000e0ea10100a681a3756964ff

Firewall, caso seja importante (o que eu não acho, porque o iptables não incrementa nenhum contador de pacotes INPUT enquanto isso acontece):

$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --sport 64299 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth0 -p tcp -m tcp --dport 10001:30000 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o lo -j ACCEPT

tanto o cliente quanto o servidor usam exatamente o mesmo código, então algo no host do meu cliente parece interferir no pacote de resposta recebido.

Cronograma de

TL; DR:

  • aplicativo cliente abre o soquete UDP, "conectando" ao servidor
  • aplicativo cliente envia pacote de solicitação
  • aplicativo do servidor recebe pacote de solicitações
  • aplicativo do servidor envia pacote de resposta
  • host do cliente recebe pacote de resposta (verificado por wireshark no cliente)
  • host do cliente envia Porta ICMP Inacessível (notada no wireshark no cliente)
  • o aplicativo cliente recebe o tempo limite de leitura após 10 segundos
  • (tentei :) enviar mais pacotes do cliente para o servidor funciona, então o soquete não foi fechado.
por nonchip 13.07.2014 / 12:31

0 respostas