SNAT versus Masquerade

Certains d’entre vous ont sans doute utilisé la règle « MASQUERADE » d’iptables dans toutes leurs mises en places de passerelles réseau, pour faire du NAT (Network Address Translation). C’est mon cas, étant donné que j’ai vu cette règle depuis maintenant plusieurs années un peu partout, que ce soit dans les blogs, les forums, ou tout simplement par défaut dans les distributions Linux. Cependant, dans bien des cas, le SNAT fonctionne aussi, et même mieux… Mais quelle est la différence ?

Tout d’abord, détrompez-vous (si vous vous trompiez), le SNAT ne fait pas QUE modifier l’adresse source. Le numéro de port est également modifié dans le cas où une autre connexion déjà existante utilise le même port : la translation de port fonctionne donc très bien. Ce qui ne fonctionne pas, et c’est ce qui fait sa différence avec le Masquerade, c’est lorsque l’adresse IP de la passerelle (l’adresse NATée donc) est susceptible de changer, par exemple en IP dynamique (ADSL, 56K, GPRS, DHCP…). La cible MASQUERADE détermine pour chaque paquet l’adresse IP de l’interface de sortie, ce qui est évidemment une perte de temps si vous êtes en IP fixe (exemple, derrière une box, avec une IP manuelle ou bien en ADSL avec une IP fixe). Pire encore, si vous avez le malheur de désactiver la carte réseau même temporairement (exemple, le DHCP qui met l’interface down puis up pour réinitialiser la carte), MASQUERADE considèrera toutes les connexions actives comme perdues, et refusera donc de faire la translation des anciens paquets. Résultat, toutes vos connexions TCP seront coupées. Le SNAT ne pose pas ce genre de problème, car il ne vérifie pas l’interface de sortie.

Seule chose à savoir, le paramétrage du SNAT nécessite un paramètre supplémentaire : –to-source, pour spécifier l’adresse source à utiliser, ce qui est somme toute évident car c’est ce qui le différencie du Masquerade.