Le NAT est une des plus grosses attractions de Linux et Iptables aujourd'hui. Au lieu d'utiliser une troisième solution coûteuse comme Cisco PIX, etc. nombre de petites entreprises et d'utilisateurs privés ont choisi de fonctionner avec ces solutions. Une des principales raisons est qu'elle est bon marché et sûre. Elle peut fonctionner sur un ordinateur ancien, une distribution Linux récente que vous pouvez télécharger gratuitement sur l'Internet, une carte réseau ou deux, et le cablage.
Ce chapitre décrira la théorie de base sur le NAT, comment il peut être utilisé, comment fonctionne-t-il et ce à quoi vous devez réfléchir avant de commencer à travailler sur ces sujets.
À la base, le NAT permet à un ou plusieurs hôtes de partager la même adresse IP. Par exemple, vous avez un réseau local composé de 5-10 clients. Leur adresse de passerelle par défaut pointe vers un serveur NAT. Normalement le paquet sera simplement transmis par la machine passerelle, mais dans le cas d'un serveur NAT c'est un peu différent.
Les serveurs NAT traduisent les adresses source et destination des paquets en adresses différentes. Le serveur NAT reçoit le paquet, réécrit les adresses source et/ou destination et ensuite recalcule la somme de contrôle du paquet. Une des utilisations les plus courantes du NAT est la fonction SNAT (Traduction d'Adresse Réseau Source). De façon basique, il est utilisé dans l'exemple au-dessus si nous n'avons pas les moyens ou ne voyons pas l'intérêt d'avoir une adresse IP publique pour chacun des clients. Dans ce cas, nous utilisons une de nos IP privées du réseau local (par exemple, 192.168.1.0/24). SNAT traduira toutes les adresses 192.168.1.0 en sa propre IP publique (par exemple, 217.115.95.34). De cette façon, il y aura 5-10 clients ou beaucoup plus qui utiliserons la même IP partagée.
Il existe aussi une chose appelée DNAT, qui peut être extrêment utile quand elle est utilisée avec la configuration des serveurs. En premier, vous pouvez en attendre le plus grand bien pour économiser de l'espace IP, ensuite, vous pouvez rendre plus ou moins impénétrable un pare-feu entre votre serveur et le serveur réel de façon aisée, ou simplement partager une IP entre plusieurs serveurs séparés physiquement. Par exemple, nous pouvons faire tourner un serveur web et ftp sur la même machine, tandis qu'il existe une machine physiquement distincte contenant différents services d'IRC que les employés travaillant à domicile ou étant sur la route peuvent utiliser en relation avec le personnel sur le site de l'entreprise. Nous pouvons alors faire fonctionner tous ces services sur la même IP depuis l'extérieur via DNAT.
L'exemple ci-dessus est aussi basé sur des ports séparés, souvent appelé PNAT. Nous ne nous référons pas très souvent à ce terme car il est inclus dans les fonctionnalités DNAT et SNAT de Netfilter.
Dans Linux, il existe actuellement deux types séparés de NAT, Fast-NAT ou Netfilter-NAT. Fast-NAT est implémenté dans le code du routage IP du noyau Linux, tandis que Netfilter-NAT est aussi implémenté dans le noyau, mais à l'intérieur du code netfilter. Dans ce didacticiel nous ne verrons pas en détail le code du routage IP, sauf pour quelques notes. Fast-NAT est généralement appelé par ce nom car il est plus rapide que le code NAT netfilter. Il ne garde pas la trace des connexions. Le traçage de connexion prend de la puissance processeur, et le ralenti, ce qui est une des principales raisons pour laquelle Fast-NAT soit plus rapide que Netfilter-NAT. Comme nous l'avons dit, le mauvais côté de Fast-NAT est qu'il ne trace pas les connexions, ce qui indique qu'il ne sera pas capable de faire du SNAT correctement pour l'ensemble des réseaux, ni capable de faire du NAT sur des protocoles complexes comme FTP, IRC et d'autres que Netfilter-NAT est capable de faire très bien.
Un mot pour finir, un synonyme de SNAT est le terme Masquerade (masquage/usurpation). Dans Netfilter, masquerade est à peu près la même chose que SNAT avec la différence que le masquerading traduira automatiquement la nouvelle IP source en adresse IP par défaut de l'interface réseau externe.