Un petit résumé des différents modes de NAT IPv4 possibles sous Linux avec les commandes iptables kivontbien pour les mettre en pratique.
NAT 1:1 pour une seule IP (on veut mapper une seule adresse IP privée sur une seule adresse IP publique) :
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_ip> -j SNAT --to-source <public_ip>
Pour pouvoir initier des connexions depuis l'extérieur (usage serveur, par exemple) :
iptables -t nat -A PREROUTING -i <public_interface> -d <public_ip> -j DNAT --to-destination <private_ip>
NAT 1:1 pour un réseau entier (on veut mapper une plage d'adresses IP privées sur une plage d'adresses IP publiques. Il faut donc autant d'IP publiques que d'IP privées. ) :
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -j NETMAP --to <public_subnet>
Pour pouvoir initier des connexions depuis l'extérieur :
iptables -t nat -A PREROUTING -i <public_interface> -d <public_subnet> -j NETMAP --to <private_subnet>
Le numéro de machine est conservé, seule la partie réseau est réécrite. Exemple : 198.18.0.1/24 deviendra 198.18.1.1/24. 198.18.0.42/24 deviendra 198.18.1.42/24.
Source :
https://capcorne.wordpress.com/2009/03/24/natting-a-network-range-with-netmapiptables/
NAPT (on veut mapper plusieurs IP privées sur une seule IP publique statique/invariante/connue) :
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -j SNAT --to-source <public_range (exemple : 192.0.2.1-192.0.2.4,192.0.2.10)>
Évidemment, il est possible d'avoir un seul couple IP_publique/protocole de transport(UDP/TCP/SCTP)/port associé à un couple IP_privée/protocole de transport/port en utilisant la cible DNAT (voir ci-dessus). Redirection de port/ouverture de port habituelle.
NAPT dynamiquee (on veut mapper plusieurs IP privées sur une seule IP publique obtenue dynamiquement et pouvant varier dans le temps (ex. : DHCP)) :
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -j MASQUERADE
Évidemment, il est possible d'avoir un couple IP_publique/protocole de transport(UDP/TCP/SCTP)/port associé à un couple IP_privée/protocole de transport/port en utilisant la cible DNAT (voir ci-dessus). Redirection de port/ouverture de port habituelle.
NAPT (on veut mapper plusieurs IP privées sur plusieurs IP publiques mais on n'a pas le même nombre d'IP privées que de publiques) :
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -j SNAT --to-source <public_range (exemple 192.0.>
=> Cette méthode a disparue depuis Linux v2.6.11 -
http://lists.netfilter.org/pipermail/netfilter-devel/2004-November/017468.html
OU
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -j SAME --to <public_range (exemple : 192.0.2.1-192.0.2.4,192.0.2.10)>
=> Le man nous indique « N.B.: The DNAT target's --persistent option replaced the SAME target. » et la cible SAME n'est plus reconnue actuellement (testé avec un noyau 3.2 et noyau 3.16). L'option « persistent » de la cible DNAT ne convient pas à notre besoin.
Source :
http://serverfault.com/questions/647343/load-balancing-iptables-postrouting-rules
OU
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -m statistic --mode nth --every 2 --packet 0 -j SNAT --to-source <public_IP1>
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -j SNAT --to-source <public_IP2>
Même exemple mais avec 4 IP publiques :
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -m statistic --mode nth --every 4 --packet 0 -j SNAT --to-source <public_IP1>
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -m statistic --mode nth --every 3 --packet 0 -j SNAT --to-source <public_IP2>
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -m statistic --mode nth --every 2 --packet 0 -j SNAT --to-source <public_IP3>
iptables -t nat -A POSTROUTING -o <public_interface> -s <private_subnet> -j SNAT --to-source <public_IP4>
Source :
http://serverfault.com/questions/647343/load-balancing-iptables-postrouting-rules
Ainsi, toutes les « -- every » connexions (dans l'exemple précédent : à chaque nouvelle connexion), l'IP de sortie change, round-robin style comme l'ancien comportement de la cible SNAT avec plusieurs IP. Évidemment, il n'y a pas d'associations entre IPs donc une même machine pourra sortir avec deux IP différentes à un même instant T dans deux applications différentes. Encore plus impressionnant : l'IP peut différer au sein d'une même application. Exemple typique : le chargement d'une page web moderne se décompose en : contenu principal sur serveur avec l'IP1, images sur CDN dont un des serveurs à l'IP2, font chez Google donc IP3, ajax chez Google donc IP4,... C'est tout autant de connexions différentes qui sont effectuées par le navigateur web et qui seront réparties sur plusieurs IP par la passerelle NAT.
Cela complique les debug puisqu'un test sur un site externe de type "quelle est mon IP ?" ne reflétera pas l'IP source de toutes les connexions initiées depuis la machine. ;)
Ce comportement ne semble pas perturber les sites web bien codés, même les plus nazis sur l'origine des connexions comme Google dans GMail. Par contre, attention aux sites web qui matchent l'IP source actuelle avec celle contenue dans un cookie pour vérifier que vous êtes bien autorisé à vous connecter à une partie sécurisée du site web et qui vous déconnectent le cas échéant. Pour éviter ce type de problème, on peut aussi écrire un script pour ajouter X règles iptables avec la cible SNAT et un filtre par source (« -s ») qui réparti les IP sources privées sur les IP publiques. Ainsi une même IP source privée aura toujours la même IP source publique. On peut aussi segmenter le réseau interne en plusieurs sous-réseau. Chaque plage d'IP aura sa propre IP publique de sortie.
Malgré ce que dit le man, le module « statistic » réparti bien les connexions, pas les paquets. Le contraire forcerait des retransmissions et donc latence voir perte si UDP + aucun mécanisme de récup' des erreurs au niveau applicatif. Une même connexion aura un état dans la table NAT et l'adresse IP de chacun des paquets qui la compose sera donc réécrit avec la même adresse IP ! Pour visualiser les états du suivi des connexions Netfilter, on peut utiliser l'outil userland « conntrack » : voir
http://shaarli.guiguishow.info/?WI9cXg .
Ci-dessus, je parle d'adresses IPv4 publiques mais les commandes et le principe de fonctionnement reste identiques s'il on n'a pas d'IPv4 publiques mais uniquement plusieurs plages d'IP privées.