Utilizzo di iptables per cambiare una porta di destinazione
Domanda
È possibile cambiare la porta di destinazione di un pacchetto UDP usando iptables?
Sto cercando di convincere un agente SNMP a inviare trappole su 1620 invece di 162. Sfortunatamente finora sono riuscito a cambiare solo la porta di origine:
iptables -t nat -A POSTROUTING -p udp --dport 162 -j SNAT --to: 1620
Soluzione
Apparentemente questo utilizzo non è supportato. Tratto da http://www.netfilter.org/documentation/HOWTO/NAT- HOWTO.txt :
6.3.7. Modifica della destinazione delle connessioni generate localmente
Il codice NAT ti consente di inserire Regole DNAT nella catena OUTPUT, ma
questo non è pienamente supportato in 2.4 (esso può essere, ma richiede una nuova
opzione di configurazione, alcuni test, e un bel po 'di codice, quindi a meno che qualcuno contrae Rusty per scriverlo, io non me lo sarei aspettato presto).L'attuale limitazione è che tu può solo cambiare la destinazione in
la macchina locale (ad es. `j DNAT - a 127.0.0.1 '), non a qualsiasi altra macchina, altrimenti le risposte no essere tradotto correttamente.
Altri suggerimenti
Supponendo che tu sappia a quale macchina stai inviando:
iptables -t nat -A OUTPUT -p udp --dport 162 -j DNAT --to-destination <dest-ip>:1620
potresti reindirizzare da 162 a 1620
iptables -t nat -A PREROUTING -p UDP --dport 162 -j REDIRECT --to-port 1620
@PiedPiper aveva ragione. Con DNAT devi specificare un indirizzo IP, ma vogliamo solo eseguire il reindirizzamento delle porte, quindi in questo caso -j REDIRECT potrebbe funzionare.
Vedi http: //www.netfilter .org / documentazione / HOWTO // NAT-HOWTO-6.html # ss6.2
Invece di creare SNAT, prova con DNAT. La porta di origine viene cambiata perché SNAT significa SourceNAT, quindi DNAT funzionerà per te.
È possibile impostare una regola di deviazione e quindi reiniettare il pacchetto con la porta modificata.
L'ho fatto qualche tempo fa su Mac OS X ma è lo stesso principio su Linux: http: //blog.dv8. ro / 2006/08 / usando-deviazione-sockets-on-mac-os-x.html
Fondamentalmente devi creare un proxy trasparente molto semplice.