Bonjour,
Nous souhaitons mettre en place des règles iptables pour réaliser le schéma suivant :
- IP client : 1.1.1.1
- IP serveur : 2.2.2.2 (ip physique) et 3.3.3.3 (alias IP)
- protocole UDP
Le client essaye d'accéder en UDP à un programme du serveur qui écoute sur 9292
-> client fait une requête UDP à 1.1.1.1:9999/3.3.3.3:9292
-> réception par le serveur et traitement
<- réponse UDP du serveur à 3.3.3.3:9292/1.1.1.1:9999
<- réception par le client
Hors, dans la pratique, le serveur répond 2.2.2.2:9292/1.1.1.1:9999 ce qui fait que le client ne reçoit jamais la réponse.
Avec iptables, il est possible de faire du post routing sur le serveur pour dire : tout ce qui sort par udp, tu dois utiliser 3.3.3.3 comme adresse source :
iptables -t nat -A POSTROUTING -o eth0 -p udp -j SNAT --to-source 3.3.3.3:9292
Mais problème, lorsque nous faisons ça, la réponse ne part pas. Il semblerait que lorsqu'un programme écoute sur un port, les post routage iptables ne fonctionnent pas dessus. Nous avons essayé la même règle en mettant 9393 et la réponse est bien envoyée avec 3.3.3.3:9393/1.1.1.1:9999 ce qui ne résout pas notre problème mais est une première piste.
Première question : connaissez vous la raison pour laquelle la règle iptable ne fonctionne pas sur un port écouté ?
Pour résoudre le problème, nous avons eu l'idée de coupler notre règle de post routing avec une règle de pré routing :
- Le serveur écoute sur le port 9595
- Le client fait sa requête sur le port 9292
- iptables se charge de faire la traduction entre 9292 et 9595 sur le serveur
-> client 1.1.1.1:9999/3.3.3.3:9292
-> serveur reçoit
-> iptable transforme en 1.1.1.1:9999/3.3.3.3:9595
<- le programme du serveur traite et répond à 3.3.3.3:9595/1.1.1.1:9999
<- iptable transforme en 3.3.3.3:9292/1.1.1.1:9999
<- le client reçoit
Les règles iptables :
1 2
| iptables -t nat -A PREROUTING -i eth0 -p udp -j DNAT --to 2.2.2.2:9595
iptables -t nat -A POSTROUTING -o eth0 -p udp -j SNAT --to-source 3.3.3.3:9292 |
Problème ici, nous arrivons bien à nos fins seulement tout le trafic UDP est redirigé vers notre programme qui écoute sur 9595 sur le serveur et nous ne trouvons pas l'option pour spécifier le port pour la règle de pré routing.
Deuxième question : comment spécifier un port pour le pré routing ?
Merci d'avance d'avoir pris le temps de lire tout ça. En espérant que vous soyez inspirés !
Partager