client udp che invia "porta non raggiungibile" ICMP quando riceve messaggi dal server


3

(Nota: ho spostato questa domanda da StackOverflow, perché è da considerarsi off-topic lì, si adatta meglio qui, e ancora non risolto)

Ho un client udp che usa luasocket, fondamentalmente facendo questo (con pochi strati di astrazione, ma questo è quello che sta succedendo 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)

vedendo tutto va bene nell'output di debug del server (ssh all'host remoto), ottengo un errore di "timeout" nel client.

quando ispeziono tutto con wireshark lato client, vedo il pacchetto inviato dal mio client e un pacchetto di risposta dal server (porta corretta e tutto), e un pacchetto "porta irraggiungibile" ICMP inviato dal mio host client al server in risposta a è (corretta) risposta.

cosa succede lì? Ho provato di tutto, incluso resettare il mio iptables per "accettare tutto", ma il mio client invia ancora la "porta irraggiungibile".

i pacchetti rilevanti sono:

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, nel caso sia importante (cosa che non penso, perché iptables non incrementa alcun contatore di pacchetti INPUT mentre questo accade):

$ 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

sia il client che il server usano esattamente lo stesso codice, quindi qualcosa sul mio host client sembra interferire con il pacchetto di risposta in entrata.

TL: timeline DR:

  • l'applicazione client apre il socket UDP, "connettendosi" al server
  • l'applicazione client invia il pacchetto di richiesta
  • l'applicazione server riceve il pacchetto di richiesta
  • l'applicazione server invia il pacchetto di risposta
  • l'host client riceve il pacchetto di risposta (verificato da wireshark sul client)
  • l'host client invia ICMP Port Unreachable (notato in wireshark sul client)
  • l'applicazione client riceve il timeout di lettura dopo 10 secondi
  • (appena provato :) inviare più pacchetti dal client al server funziona, quindi il socket non si è chiuso.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.