(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.