J'aimerais faire NAT
en iptables
. Ainsi, tous les paquets arrivant à 192.168.12.87
et le port 80
sera transmise à 192.168.12.77
port 80
.
Comment faire cela avec iptables ?
Ou
Y a-t-il d'autres moyens de parvenir au même résultat ?
J'aimerais faire NAT
en iptables
. Ainsi, tous les paquets arrivant à 192.168.12.87
et le port 80
sera transmise à 192.168.12.77
port 80
.
Comment faire cela avec iptables ?
Ou
Y a-t-il d'autres moyens de parvenir au même résultat ?
Ces règles devraient fonctionner, en supposant que iptables
est exécuté sur le serveur 192.168.12.87
:
#!/bin/sh
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87
Vous devez DNAT le trafic entrant sur le port 80, mais vous devrez également SNAT le trafic en retour.
Alternative (et meilleure approche IMHO) :
Selon le type de votre serveur Web (Apache, NGinx), vous devriez envisager d'installer un proxy HTTP sur votre serveur frontal (192.168.12.87) :
mod_proxy (Apache)
proxy_pass (NGinx)
Cela fonctionne tant que l'ufw est désactivé, même si le port est autorisé par l'ufw, mais si l'ufw est activé, le transfert ne fonctionne pas, une idée ?
Excellente question avec une excellente réponse. Un autre cas d'utilisation pour lequel c'est utile est si vous avez besoin de rediriger temporairement tout le trafic arrivant à un service, disons squid, vers un autre ip/port afin d'effectuer une maintenance sur le service original sans avoir besoin de reconfigurer tous les clients ! Très pratique !
La raison qui semble évidente iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
ne fonctionnera pas est la façon dont les paquets de retour seront acheminés.
Vous pouvez configurer des règles qui feront en sorte que les paquets envoyés à 192.168.12.87 seront simplement NATés vers 192.168.12.77, mais 192.168.12.77 renverra alors les réponses directement au client. Ces réponses ne passeront pas par l'hôte sur lequel votre règle iptables effectue la NAT. Ainsi, les paquets dans une direction sont traduits, mais pas les paquets dans l'autre direction.
Il existe trois approches pour résoudre ce problème.
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87
Chacune de ces trois solutions présente des inconvénients, et vous devez donc vous demander si vous avez vraiment besoin de cette redirection particulière.
De ces trois approches, je pense que la première est celle qui a le plus de chances de fonctionner. Donc si vous n'avez pas besoin de connaître les adresses IP des clients, c'est celle que je recommande.
Vous pouvez également choisir d'oublier complètement la NAT et ne pas essayer de résoudre le problème sur la couche MAC ou IP. Vous pouvez remonter jusqu'à la couche HTTP et y chercher une solution. Dans ce cas, la solution que vous trouverez est un proxy HTTP. Si vous installez un proxy HTTP sur 192.168.12.87 et que vous le configurez correctement, vous pouvez lui demander de transmettre les demandes à 192.168.12.77 et de renvoyer les réponses. De plus, il peut insérer un en-tête X-Forwarded-For préservant l'IP du client original. Le serveur sur 192.168.12.77 doit alors être configuré pour faire confiance à l'en-tête X-Forwarded-For de 192.168.12.87.
Je suis surpris -j MASQUERADE
n'est pas mentionné ici ; n'est-ce pas l'approche habituelle avec le DNAT ?
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.
0 votes
@Matthewlfe, Pour une raison quelconque, je dois transférer toutes les requêtes apache de (192.168.12.87) vers (192.168.12.77).
1 votes
@Matthewlfe, j'ai deux serveurs de production. L'un est connecté avec une adresse IP statique publique. En raison de certains problèmes de connectivité, je ne suis pas en mesure de me connecter à la base de données et aux autres systèmes à partir de l'adresse IP publique.
192.168.12.87
. Donc, je dois transmettre toutes les demandes à192.168.12.77
.0 votes
@lain, je ne suis pas familier avec
iptables
. Et, j'ai vu quelques exemples. Mais, il semble qu'il faille deux ethernet. Lien : revsys.com/writings/quicktips/nat.html0 votes
Vous pouvez également utiliser le mode proxy dans la configuration de votre serveur Web pour envoyer des requêtes à 192.168.12.77 depuis 192.168.12.87 (si votre serveur Web le prend en charge).
0 votes
askapache.com/htaccess/
0 votes
Vous devrez utiliser un double NAT, en changeant à la fois la destination (avant le routage) et la source (après le routage) afin que les paquets de réponse puissent également être NATés. C'est très difficile.