Soucis iptables PAT

Bonsoir,

Je tente de mettre en place une translation de port, qui fonctionne très bien depuis Internet vers le réseau LAN, mais entre une machine LAN et le serveur sur le même réseau ce ne fonctionne pas.

Je m’explique, j’ai une machine du nom de domaine machin.com avec comme résolve IP une IP Internet (style 80.x.x.x).

Si je ping machin.com, ca me donne une réponse de 80.x.x.x, une interface de ma machine routeur.

Si une personne viens d’internet pour la destination port 80, il y a une translation de port vers la bonne machine sur le réseau. Or si c’est une machine cliente en local qui fait une requêtte http par le nom de domaine, ca vas en direction de l’ip Internet, soit la machine routeur qui dispose de l’interface Internet, et non pas sur la véritable machine supportant le serveur Web.

Sur la machine routeur, il y a deux interface réseau, une eth0 et une eth1, la eth0 possède l’ip Internet et l’interface eth1 possède une ip privé du réseau local 192.168.1.254. Le serveur web porte l’ip 192.168.1.252, donc toutes les reqûettes venant d’Internet sont translaté vers la bonne machine.

eth0 > 80 > 192.168.1.252
eth0 > 22 > 192.168.1.254

Ce que je n’arrive pas à faire, c’est ceci :

eth1 > 80.x.x.x:80 > 192.168.1.252

Merci d’avance.

C’est normal, le serveur répond directement à ta machine qui reçoit une réponse venant d’une autre adresse que celle qu’elle attend, il te faut donc mettre une règle SNAT pour les requêtes venant du LAN:

iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -s 192.168.1.0/24 -j MASQUERADE

Merci beaucoup pour votre réponse, mais ca ne fonctionne toujours pas.

Lorsque je vais consulter par http le domaine machin.com, il m’affiche le serveur web du routeur et non pas le serveur web de la véritable machine web.

Pour corriger ça, je suis obligée de spécifier dans mon fichier /etc/hosts (machine cliente) chaques virtualhost de mon serveur web avec l’adresse IP privée.

J’utilise le script firewall-jay pour générer mes règles iptables, mais j’ai la possibilité d’ajouter des règles perso.

Pourriez-vous s’il vous plait me donner la règle pour que toute requettes en provenance de eth1 en destination de mon ip Internet 80.x.x.x avec en port 80, soit redirigée vers l’ip du serveur réel 192.168.1.252.

Merci d’avance.

Attention, la règle que j’ai donné est à mettre sur le routeur pas sur la machine cliente ni sur le serveur. En clair il faut que les requêtes venant du LAN et rediriger vers le serveur Web soit NATée par le routeur. Si le routeur est une machine Debian il faut rajouter la règle que j’ai indiquée. Je l’utilise avec succès sur 3 routeurs pour de multiples ports…

Les règlespour le routeur seraient

 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT   --to 192.168.1.252:80
 iptables -t nat -A POSTROUTING -o eth0 -p tcp  --dport 80 -s 192.168.1.0/24 -j MASQUERADE

Oui, je la dépose bien sur la machine routeur.

En fait, il me semble qu’il faut deux règles :

iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -s 192.168.1.0/24 -j MASQUERADE
Cette régle, voir si j’ai bien compris, permet de masquer la provenance de la requettes http par une requettes du routeur, puis, donne le résultat à la machine cliente.

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.1.252:80
Et celle ci, permet de faire du translation de port venant de l’interface Internet vers la bonne IP servant de serveur web.

Mais ca ne foncitonne pas, même après ces deux règles sur la machine routeur.

Il n’y aurrai pas une règle genre celle ci de possible ?
iptables -t nat -A PREROUTING -p tcp --to-destination 80.x.x.x --dport 80 -i eth1 -j DNAT --to 192.168.1.252:80 (je précise qu’elle ne fonctionne pas)

Merci.

Oups, je n’avais pas vue la suite de ton post,

iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 80 -s 192.168.1.0/24 -j MASQUERADE

fais que je ne peut plus naviguer, car tout ce qui est en sortie par output eth0 vers Internet en destination d’un site web en protocole 80 me reviens et PAF :slightly_smiling:

On peut la rendre moin agressive cette ligne ? hihi

Mici, presque bon :slightly_smiling:

J’ai modifié la ligne, ce qui donne ceci :

iptables -t nat -A PREROUTING -p tcp --destination 8O.x.x.x(mon adresse ip) --dport 80 -j DNAT --to 192.168.1.252:80

Et cette fois ci, les requêttes http vers machin.com cherchent, cherchent mais n’aboutissent pas.

[quote=“lapitchoune”]Oui, je la dépose bien sur la machine routeur.

En fait, il me semble qu’il faut deux règles :

iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -s 192.168.1.0/24 -j MASQUERADE
Cette régle, voir si j’ai bien compris, permet de masquer la provenance de la requettes http par une requettes du routeur, puis, donne le résultat à la machine cliente.
[/quote]
Toutes les requêtes sortant du routeur par eth1 = réseau local, d’origine locale 192.168.1.0/24 ont une translation SNAT, la réponse retournera vers le routeur qui retransmettra à l’émetteur.

Toutes les requêtes venant de l’extérieur (=eth0) vers le port 80 sont redirigées vers le serveur. J’ai oublié les requêtes de l’intérieur. Il suffit d’enlever le -i eth0 ou de mettre

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to 192.168.1.252:80

Idem avec les requêtes venant de l’intérieur = eth1

Tel que, les requêtes extérieures devaient aboutir, pas les intérieures.

Ces trois règles fonctionnent impeccablement chez moi.[/code]