Soluzione 1:
Quindi, iptables fondamentalmente ricorda il numero di porta utilizzato per il pacchetto in uscita (cos'altro potrebbe ricordare per un pacchetto UDP?),
Sono abbastanza sicuro che per UDP le porte e gli indirizzi di origine e destinazione siano memorizzati.
Se vuoi ispezionare le tabelle di stato, installa conntrack e/o netstat-nat.
(Cosa accadrebbe se provassi accidentalmente ad avviare un servizio su quella porta entro il periodo di tempo - il tentativo verrebbe negato/bloccato?)
Dal momento che stai usando OUTPUT e INPUT stai parlando di servizi locali. La porta è già utilizzata Non credo che il tuo sistema ti consentirà di avviare un altro servizio poiché qualcosa è già in ascolto su quella porta. Immagino che potresti interrompere il primo servizio e avviarne un altro se lo desideri davvero, in tal caso la risposta probabilmente arriverà al tuo servizio. Ciò che il servizio fa con il pacchetto dipende dal contenuto del pacchetto e da quale servizio è.
Soluzione 2:
NB:questa risposta è stata modificata.
Nonostante quello che dicono le pagine man, ESTABLISHED
sembra significare "stateful". Per UDP ciò significa semplicemente (come suggerisci) ricordare per un po' ogni pacchetto UDP in uscita (la tupla "src ip, src port dst ip, dst port") e riconoscerne le risposte.
FWIW, le mie normali regole per il traffico DNS sarebbero qualcosa del genere:
# permit any outbound DNS request (NB: TCP required too)
iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 --dport 53 -j ACCEPT
# accept any packet that's a response to anything we sent
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
cioè controllare il traffico sul OUTPUT
catena, e poi lascia che il iptables
i moduli state gestiscono tutto il resto sul INPUT
catena.
Vedi anche questa domanda correlata.