Je voudrais faire un peu NAT
de iptables
po Ainsi, tous les paquets arrivant sur 192.168.12.87
et le port 80
seront transférés au 192.168.12.77
port 80
.
Comment faire cela avec iptables?
Ou
Y a-t-il d'autres moyens d'atteindre le même objectif?
192.168.12.87
. Donc, je dois transmettre toute la demande à192.168.12.77
.iptables
. Et j'ai vu des exemples. Mais, il semble être besoin de deux ethernet. Lien: revsys.com/writings/quicktips/nat.htmlRéponses:
Ces règles devraient fonctionner, en supposant que cela
iptables
fonctionne sur le serveur192.168.12.87
:Vous devez DNAT le trafic entrant sur le port 80, mais vous devez également renvoyer le trafic par SNAT.
Alternative (et meilleure approche IMHO):
En fonction de la nature 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 source
Une raison apparemment é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, c'est la façon dont les paquets de retour seront acheminés.Vous pouvez configurer des règles pour que les paquets envoyés à 192.168.12.87 soient simplement convertis en NAT en 192.168.12.77, mais 192.168.12.77 enverra ensuite les réponses directement au client. Ces réponses ne passeront pas par l'hôte où votre règle iptables utilise NAT. Par conséquent, les paquets d'une direction sont traduits, mais les paquets de l'autre 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ésentant des inconvénients, vous devez donc examiner attentivement si vous devez réellement effectuer cette transmission particulière.
Je pense que la première est l’une des trois approches qui est la plus susceptible de fonctionner. Donc, si vous n'avez pas besoin de connaître les adresses IP du client, c'est celle que je recommanderais.
Vous pouvez également choisir d'oublier le NAT complètement et de ne pas essayer de résoudre le problème sur la couche MAC ou IP. Vous pouvez aller jusqu'à la couche HTTP et chercher une solution là-bas. Dans ce cas, la solution que vous trouverez est un proxy HTTP. Si vous installez un proxy HTTP sur 192.168.12.87 et le configurez correctement, vous pouvez le faire transférer les demandes vers 192.168.12.77 et renvoyer les réponses. De plus, il peut insérer un en-tête X-Forwarded-For préservant l'adresse IP du 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.
la source
-j MASQUERADE
n'est pas mentionné ici; N'est-ce pas l'approche habituelle avec DNAT?SNAT
au lieu deMASQUERADE
, parce que c'est ce que dit la documentation. La formulation exacte dans la documentation est la suivante:It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.