mirroring delle porte di iptables


8

Devo essere in grado di ottenere una copia dei pacchetti ricevuti sulla porta 8001 sulla porta 8002. Ho provato quanto segue ma viene visualizzato un errore che --tee non è definito.

sudo iptables -t nat -A PREROUTING -p TCP -s 127.0.0.1 --sport 8001 -j DNAT --to-destination 127.0.0.1:8002 --tee


Risposte:


6

La --teebandiera non fa parte della catena DNAT, fa parte di ROUTE. Puoi usarlo solo dopo una dichiarazione di -j ROUTE. Puoi ottenere un aiuto specifico da iptables sull'argomento in questo modo:

 $ iptables -j ROUTE help

Stavo guardando il tuo comando iptables e per me non ha alcun senso. Perché stai provando a confrontarti con la porta sorgente e sorgente di un pacchetto quando nella tua domanda hai detto "pacchetti ricevuti sulla porta"? Stai cercando di dividere il traffico in entrata per colpire due porte o prendere l'output di una porta e collegarlo all'input di un'altra?

Se il primo, ci sono davvero due passaggi. Non è possibile utilizzare tee per ottenere una copia del pacchetto E manipolare il pacchetto per modificare contemporaneamente i numeri di porta. Puoi provare questo in due passaggi, prima inviandoti una copia duplicata del pacchetto, quindi abbinando solo la copia e alterando la porta di destinazione. ATTENZIONE: non testato, considera questo pseudo-codice:

$ sudo iptables -A PREROUTING -t mangle -p tcp -s !127.0.0.1/32 --dport 8001 -j ROUTE --gw 127.0.0.1 --tee
$ sudo iptables -A POSTROUTING -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002

1
Attenzione ... un altro visitatore del sito ha notato che una versione simile di questo si traduce in realtà in un ciclo infinito! Probabilmente devi capire come taggare il pacchetto duplicato nella stessa azione, quindi abbinare il tag.
Caleb,

ROUTE sembra obsoleto, giusto?
margherita,

È solo un refuso, 172.0.0.1 -> 127.0.0.1.
Aki,

1
NB ai lettori SE: l' ROUTEobiettivo utilizzato nella risposta sopra è obsoleto al momento della stesura di questo documento e non è disponibile in iptables sulle distribuzioni più recenti. Vedi serverfault.com/questions/333155/…
Jonathan Ben-Avraham il

6

Oltre alla risposta di Caleb , se stai lavorando con una versione più recente iptables(v1.4.14) che non ha più l' ROUTEobiettivo, avrai bisogno di qualcosa di simile al seguente, testato su Debian Wheezy *:

iptables -A PREROUTING -t mangle -p tcp ! -s 127.0.0.1 --dport 8001 -j TEE --gateway 127.0.0.1
iptables -A OUTPUT -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002

Prova usando "netcat" ( man nc). Nella finestra di un terminale digitare quanto segue e premere il Entertasto:

nc -l 8002

Il comando attenderà l'input da digitare in una seconda finestra del terminale.

Nella seconda finestra del terminale digitare quanto segue e premere il Entertasto:

nc 127.0.0.1 8001

Il comando attenderà ulteriori input. Digita qualsiasi cosa e premi il Entertasto. Dopo aver premuto il Entertasto nella seconda finestra del terminale, il testo digitato nella seconda finestra del terminale dovrebbe apparire nella prima finestra del terminale. Premere Ctrl-c nella seconda finestra per terminare la sessione.


* Questa sintassi non è supportata in RHEL / Centos (6.5 o precedente) :-( quindi è necessario utilizzare socatper collegare e inoltrare i pacchetti in entrata sulla porta originale a due nuove porte. Se si avessero processi in ascolto sulla porta di ricezione originale, allora si è necessario riconfigurarli per l'ascolto su una delle porte a T come socatè ora l'ascoltatore sulla porta originale. Vedere questo post SE, ad esempio, la socatsintassi per la clonazione delle porte.


Per qualche motivo su debian è necessario specificare esplicitamente la porta con netcatnc -l -p 8002
Marcelo Lacerda,

Ho provato a replicare questa soluzione sul mio Mint 19 Tessa senza alcun risultato. Ho scoperto che alcuni pacchetti rimbalzano solo all'interno e solo una delle due porte riceve il pacchetto. Se commetto l'errore di aggiungere la registrazione per provare a risolvere una regola, i registri (kernel, syslog, journal) consumano rapidamente la mia memoria.
hanzo2001

Inoltre non capisco perché il DNAT sia impostato sulla catena OUTPUT. Il pacchetto non sta già lasciando il mio processo al mondo esterno? o gli indirizzi di loopback si comportano diversamente?
hanzo2001
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.