Je voudrais faire un peu de NAT
dans iptables
. Pour que tous les paquets arrivant à 192.168.12.87
et port 80
sera transmis à 192.168.12.77
Port 80
.
Comment faire cela avec iptables?
Ou
Y a-t-il d'autres façons d'y parvenir?
Ces règles devraient fonctionner, en supposant que iptables
s'exécute 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 trafic entrant sur le port 80, mais vous devrez également SNAT le trafic retour.
Alternative (et meilleure approche à mon humble avis):
En fonction de votre serveur Web (Apache, NGinx), vous devez envisager un proxy HTTP sur votre serveur frontal (192.168.12.87):
mod_proxy (Apache)
proxy_pass (NGinx)
La raison pour laquelle un iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
Apparemment évident ne fonctionnera pas est la façon dont les paquets de retour seront routés.
Vous pouvez configurer des règles qui feront que les paquets envoyés à 192.168.12.87 seront simplement NATtés à 192.168.12.77, mais 192.168.12.77 enverra ensuite des réponses directement au client. Ces réponses ne passeront pas par l'hôte où votre règle iptables fait NAT, donc les paquets dans un sens sont traduits, mais les paquets dans l'autre sens ne le sont pas.
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, vous devez donc examiner attentivement si vous avez vraiment besoin de faire ce transfert particulier.
Des trois approches, je pense que la première est celle qui est la plus susceptible de fonctionner. Donc, si vous n'avez pas besoin de connaître les adresses IP des clients, c'est celle que je recommanderais.
Vous pouvez également choisir d'oublier complètement NAT et ne pas essayer de résoudre le problème sur la couche MAC ou IP. Vous pouvez aller 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 de manière appropriée, 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 en préservant l'IP client d'origine. Le serveur sur 192.168.12.77 doit ensuite être configuré pour faire confiance à l'en-tête X-Forwarded-For de 192.168.12.87.