miroir de port iptables

8

J'ai besoin de pouvoir obtenir une copie des paquets reçus sur le port 8001 vers le port 8002. J'ai essayé ce qui suit mais j'obtiens une erreur indiquant que --tee n'est pas défini.

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
Parikshit
la source
Votre noyau ou iptablespeut être trop vieux; voir Envoyer des paquets en double sur deux connexions Internet.
Gilles 'SO- arrête d'être méchant'
On répond à cette question ici: superuser.com/questions/753294/mirror-port-via-iptables/…
Pat

Réponses:

6

Le --teedrapeau ne fait pas partie de la chaîne DNAT, il fait partie de ROUTE. Vous ne pouvez l'utiliser qu'à la suite d'une déclaration de -j ROUTE. Vous pouvez obtenir une aide spécifique d'iptables sur le sujet comme ceci:

 $ iptables -j ROUTE help

Je regardais votre commande iptables, et cela n'a aucun sens pour moi. Pourquoi essayez-vous de faire la correspondance avec la source et le port source d'un paquet alors que dans votre question vous avez dit "paquets reçus sur le port"? Essayez-vous de diviser le trafic entrant pour atteindre deux ports ou de prendre la sortie d'un port et de le lier à l'entrée d'un autre?

Si le premier, il y a vraiment deux étapes. Vous ne pouvez pas utiliser tee pour obtenir une copie du paquet ET manipuler le paquet pour changer les numéros de port en même temps. Vous pouvez essayer ceci en deux étapes, en vous envoyant d'abord une copie en double du paquet, puis en faisant correspondre la copie uniquement et en modifiant le port de destination. AVERTISSEMENT: non testé, considérez ce pseudo-code:

$ 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
Caleb
la source
1
Attention ... un autre visiteur du site a remarqué qu'une version similaire de cela se traduit en fait par une boucle infinie! Vous devrez probablement comprendre comment étiqueter le paquet dupliqué dans la même action, puis faire correspondre sur l'étiquette.
Caleb
ROUTE semble obsolète, non?
marguerite
C'est juste une faute de frappe, 172.0.0.1 -> 127.0.0.1.
Aki
1
NB aux lecteurs SE: la ROUTEcible utilisée dans la réponse ci-dessus est obsolète au moment de la rédaction de cet article et n'est pas disponible dans iptables sur les distributions les plus récentes. Voir serverfault.com/questions/333155/…
Jonathan Ben-Avraham
6

Suite à la réponse de Caleb , si vous travaillez avec une version plus récente iptables(v1.4.14) qui n'a plus la ROUTEcible, vous aurez besoin de quelque chose comme ce qui suit, testé sur 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

Testez avec "netcat" ( man nc). Dans une fenêtre de terminal, saisissez suivant et appuyez sur la Entertouche:

nc -l 8002

La commande attendra l'entrée que vous taperez dans une deuxième fenêtre de terminal.

Dans la deuxième fenêtre du terminal, saisissez ce qui suit et appuyez sur la Entertouche:

nc 127.0.0.1 8001

La commande attendra une entrée supplémentaire. Tapez n'importe quoi et appuyez sur la Entertouche. Après avoir appuyé sur la Entertouche dans la deuxième fenêtre de terminal, le texte que vous avez tapé dans la deuxième fenêtre de terminal doit apparaître dans la première fenêtre de terminal. Appuyez sur Ctrl-c dans la deuxième fenêtre pour terminer la session.


* Cette syntaxe n'est pas prise en charge dans RHEL / Centos (6.5 ou version antérieure) :-( vous devez donc utiliser socatpour té et transférer les paquets entrants sur le port d'origine vers deux nouveaux ports. Si vous aviez des processus d'écoute sur le port de réception d'origine, alors vous besoin de les reconfigurer pour écouter sur l'un des ports tee comme socatc'est maintenant l'écouteur sur le port d'origine. Voir ce post SE pour un exemple de socatsyntaxe pour le clonage de port.

Jonathan Ben-Avraham
la source
Pour une raison quelconque sur Debian, vous devez spécifier explicitement le port avec netcatnc -l -p 8002
Marcelo Lacerda
J'ai essayé de reproduire cette solution sur mon Mint 19 Tessa en vain. J'ai découvert que certains paquets rebondissaient à l'intérieur et qu'un seul des deux ports recevait le paquet. Si je fais l'erreur d'ajouter la journalisation pour essayer de dépanner une règle, les journaux (noyau, syslog, journal) mangent rapidement mon stockage.
hanzo2001
Je ne comprends pas non plus pourquoi le DNAT est défini sur la chaîne OUTPUT. Le package ne quitte-t-il pas déjà mon processus vers le monde extérieur? ou les adresses de bouclage se comportent-elles différemment?
hanzo2001