Iptables ip/port vers ip/port en local puis externe

Bonjour !

Je bosse sur un projet ou je dois rediriger des messages udp vers une nouvelle adresse, voila la structure hard :

carte1 -> carte2 linux -> carte3

1 et 2 sont sur un réseau, 2 et 3 sont sur un autre réseau

le but est de rediriger les messages de 1 vers 3 en passant par 2.

Pour le moment je bosse sur un linux pour le dev et donc pas sur les cartes. Je me suis codé un petit client/serveur udp pour faire des tests.

Je voudrais qu’un message envoyé par le client vers 127.0.0.1:12345 soir reçu par le serveur en 127.0.0.2:12346, tout ça en local donc, et ensuite je changerais les ip/ports pour que ça marche sur ma carte :slight_smile:

J’ai essayé ça qui ne fonctionne pas :

sudo iptables -t nat -A PREROUTING -d 127.0.0.1 -p udp --dport 12345 -j DNAT --to 127.0.0.2:12346

Est ce que vous avez des idées ? :slight_smile:

Quand tu parles de “carte”, s’agit-il d’une carte réseau faisant partie d’une machine ou d’une machine complète ?

Sur quelle machine ?
Où est le client ? Où est le serveur ?
Pas possible avec iptables si ce sont des machines différentes car les paquets avec des addresses de la plage 127.0.0.0/8 ne peuvent pas être reçus par une interface non loopback (même après DNAT). Il faut utiliser d’autres adresses ou un relais de port UDP (je n’ai pas ma liste sous la main actuellement).

Normal, les règles de NAT dans la chaîne PREROUTING sont inopérantes sur l’interface de loopback pour des raisons qu’il serait un peu long d’expliquer. Tu peux utiliser la table OUTPUT à la place, mais ça reste local à la machine et ne répond pas à ton besoin si le client et le serveur sont sur des machines différentes.

Merci pour ces réponses qui répondent déja en partie à mon probleme !

Pour clarifier :

la carte 1 envoie des infos en continu à la carte 2 (celle qui contient le linux).

La carte 3 est branchée à la carte 2.

Les données envoyée par la 1 sont en fait destinées à la 3. La carte 1 ne peut pas envoyer directement les infos à la 3 car elles ne sont pas branchées entre elles, elles le sont par l’intermédiaire de la 2.

Enfin le but que je recherche c’est que la carte 3 vient dire à la 2 “voila sur quelle ip et quel port je veux recevoir les données de la 1”

La 2 (avec le linux, c’est celle sur laquelle je travaille) va rediriger l’ip et le port sur lesquel elle reçoit les données de la carte 1 vers l’ip et le port donnés par la carte 3.

Actuellement je voulais voir si la commande pour rediriger fonctionnait, j’ai donc lancé un serveur qui écoute en 127.0.0.2:12346 et un client qui a envoyé un message sur 127.0.0.1:12345 sur ma machine de dev, l’équivalent de la carte 2, et je voulais voir si le serveur recevait le message. Mais du coup vu tes explications ça semble impossible de tester ce comportement sur une meme machine!

C’est plus clair ?

Du coup petite question, si j’utilise ma commande donnée plus haut ça devrait fonctionner quand j’éxecuterais sur ma cible avec les bonnes ip et pas les loopback ?

Oui, à condition d’activer la fonction routeur IPv4 (ip_forward) sur la carte 2.
En revanche je ne connais aucun mécanisme permettant de faire ceci :

Remarque :

Et alors ? Le protocole IP est justement conçu pour faire communiquer des machines qui ne sont pas directement connectées les unes aux autres, sans devoir faire du NAT dans tous les sens.
La carte 1 ne permet pas une configuration IP avec une adresse de passerelle ou des routes additionnelles ?

Non justement, la carte 1 est vraiment bas niveau, carte fpga avec interface udp simpliste.

Pour le premier point mon programme principal sur la carte 2 va recevoir IP/port de la carte 3 et ensuite je vais construire ma commande et l’envoyer avec un appel system(cmd). Et pour supprimer la redirection une fois que je n’en aurais plus besoin je vais recupérer la liste et supprimer la regle toujours avec des commandes system().

Il peut y avoir N carte 1 donc je peux pas me permettre d’avoir des thread dans des serveur qui redirigent les messages sur la carte 2 :slight_smile: