Le NAT avec iptables

15 septembre 2006

Télécharger en PDF

Sommaire

I.Rappels 1

a)Les différents types de filtrages : les tables 1

b)Fonctionnement de base : les chaînes et les règles 1

II.La table nat : utilisation en passerelle 2

a)Architecture 2

b)Décision de routage 3

c)Etapes de traversée 3

III.Activation du NAT 5

IV.Une configuration de base 5

a)EXEMPLE 7

b)Configuration de l'interface du client 7

c)Configuration de l'interface de la passerelle 7

d)Configuration iptables de la passerelle pour les connexions sortantes 8

e)Configuration iptables de la passerelle pour les connexions entrantes 8

f)Amélioration de la chaîne POSTROUTING 9

I.Bibliographie 9


I.Rappels

a)Les différents types de filtrages : les tables


Une table contient des chaînes relatives au filtrage qu'elle réalise.

Il existe 3 tables distinctes :


Dans la table de filtrage (FILTER) on peut filtrer les paquets avec trois chaînes :


Dans la table de translation (NAT) on peut gérer les paquets (dans le cas d'une passerelle) :


b)Fonctionnement de base : les chaînes et les règles


Iptables est basé sur des chaînes de pare-feu (ou simplement chaîne). Une chaîne est un ensemble ordonné (une liste) de règles. Une règle indique quoi faire d'un paquet quand il a certaines caractéristiques.


Ainsi, un paquet traverse les règles d'une chaîne jusqu'à ce qu'il corresponde à une règle. Dans ce cas, la règle indique si le paquet est transmis à sa destination (ACCEPT) ou supprimer (DROP).

Dès qu'une règle (autre que LOG) capte un paquet, elle prend une action sur le paquet et la parcourt de la chaîne s'arrête.


Si le paquet ne correspond à aucune règle alors on applique la police par défaut de la chaîne. Si elle est à ACCEPT, tout paquet non interdit sera délivré à sa destination. Si elle est à DROP, tout paquet non autorisé sera supprimé (Cette solution est la plus sûr).


II.La table nat : utilisation en passerelle


a)Architecture





Le fonctionnement de la table NAT (et FILTER) dans le cas d'une passerelle est le suivant :


          +----------+                    +-------+     +-----------+
Entrée -->|PREROUTING|-->[Décision  ]---->|FORWARD|---->|POSTROUTING|--> Sortie
          +----------+   [de routage]     +-------+   ^ +-----------+
                              |                       |
	                    +-------+               +--------+
	                    | INPUT |               | OUTPUT |
		              +-------+               +--------+
		                  |                        |
		                  |---->Processus local ---|

La traversée de la passerelle par un paquet est indiquée en rouge.


La requête et la réponse passent, dans l'ordre, par PREROUTING puis FORWARD puis POSTROUTING.







b)Décision de routage


La décision de routage se fait en regardant si l'adresse IP de destination est celle de l'interface par laquelle le paquet est entré :


Dans le cas d'une simple passerelle, on n'utilisera que la chaîne FORWARD.


c)Etapes de traversée





Connexion entrante Connexion sortante






Les étapes de parcourt des chaînes par un paquet sont les suivantes :


iptables -t nat -A PREROUTING -i interface_entrée -d IP_passerelle -p tcp|udp -dport port_n [autres options] -j DNAT --to-destination serveur_interne:port_n



iptables -t nat -A PREROUTING -i interface_entrée -d IP_passerelle [autres options] -j DNAT --to-destination serveur_interne




iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT



iptables -A FORWARD -i interface_entrée -d serveur_interne_LAN -p tcp|udp -dport port_m -m state --state NEW -j ACCEPT



iptables -A FORWARD -i interface_LAN -s adresse(s)_LAN/masque -p tcp/udp -dport port_n -j DROP



iptables -A FORWARD -i interface_LAN -s adresse(s)_LAN/masque -p tcp -dport 80 -j DROP



iptables -t nat -A POSTROUTING -o interface_de_sortie -j SNAT --to-source IP_de_sortie



iptables -t nat -A POSTROUTING -o interface_de_sortie -j MASQUERADE


III.Activation du NAT


Enfin, il faut activer l'IP forwarding par : echo "1" > /proc/sys/net/ipv4/ip_forward



IV.Une configuration de base


On va s'intéresser à la mise en place d'une passerelle/firewall et donc la chaine FORWARD de la table FILTER et la table NAT. Nous allons par exemple nous intéresser à l'architecture suivante :

Machine 1--------------->Passerelle/firewall--------------->Internet
     192.168.0.10               192.168.0.1 - 197.24.19.1           Toutes les IPs


Notre passerelle doit donc autoriser un certain nombre de paquets à passer, mais aussi effectuer ce que l'on appelle une translation d'adresse, c'est à dire remplacer l'adresse IP du client avec la sienne avant d'envoyer le paquet sur internet.

Il faut d'abord activer la fonction "passerelle" dans le noyau, pour cela il faut utiliser la commande suivante :

[root@passerelle ~]# echo "1" > /proc/sys/net/ipv4/ip_forward

Il faut dans un deuxième temps autoriser certaines connections à "traverser" notre passerelle, le plus simple (et le plus dangereux !!!) est d'utiliser la commande suivante :

[root@passerelle ~]# iptables -P FORWARD ACCEPT

Nous allons maitenant nous occuper de la translation d'adresses, pour consulter la table nat, on utilise la commande suivante :

[root@passerelle ~]# iptables -L -t nat
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Il faut donc ajouter la règle de "masquerading" avec la commande suivante :

[root@passerelle ~]# iptables -t nat -A POSTROUTING -j MASQUERADE

En effet, les modifications s'effectuent sur les paquets sortants !! (POSTROUTING)
Pour vérifier :

[root@passerelle ~]# iptables -L -t nat
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  anywhere             anywhere

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

A partir de ce moment, le client doit pouvoir se connecter sur internet.

Nous voulons maintenant pouvoir utiliser à partir d'internet, un serveur web qui se trouve sur le client sur le port 800, il faut donc réaliser ce que l'on appelle du "forwarding de port", c'est à dire que toutes les connections entrantes sur le firewall vers le port 80, seront redirigées et translatées vers le client sur le port 800, pour cela on utilisera la commande suivante :

[root@passerelle ~]# iptables -t nat -A PREROUTING -d 197.24.19.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.10:800

En effet, il faut effectuer la transformation en amont du firewall (PREROUTING), à destination du firewall (-d 197.24.19.1) vers le client sur le port 800 (--to-destination 192.168.0.10:800) et effectuer une modification de l'adresse IP (-DNAT : Destination NAT).


a)EXEMPLE


Soit la configuration suivante :


Par exemple :

b)Configuration de l'interface du client



Sur le client ${IP_CLIENT} :

Dans le fichier /etc/sysconfig/network-scripts/ifcfg-eth0 :


DEVICE=interface_client

BOOTPROTO=none

HWADDR=xx:xx:xx:xx:xx:xx

ONBOOT=yes

TYPE=Ethernet

IPADDR=${IP_CLIENT}

NETMASK=${MASQUE_INT}

GATEWAY=${IP_PASS_INT}


c)Configuration de l'interface de la passerelle


Sur la passerelle ${IP_PASS_EXT}/${IP_PASS_INT} :


Dans le fichier /etc/sysconfig/network-scripts/ifcfg-eth0 :


DEVICE=${PASS_EXT_INTERF}

BOOTPROTO=none

HWADDR=xx:xx:xx:xx:xx:xx

ONBOOT=yes

TYPE=Ethernet

IPADDR=${IP_PASS_EXT}

NETMASK=${MASQUE_EXT}


Dans le fichier /etc/sysconfig/network-scripts/ifcfg-eth0:0 :


DEVICE=${PASS_INT_INTERF}

BOOTPROTO=none

HWADDR=xx:xx:xx:xx:xx:xx

ONBOOT=yes

TYPE=Ethernet

IPADDR=${IP_PASS_INT}

NETMASK=${MASQUE_INT}


d)Configuration iptables de la passerelle pour les connexions sortantes


Il faut configurer le firewall de manière "propre", c'est à dire que l'on interdit TOUT par défaut, et l'on n'autorise que ce qui est vraiment nécéssaire, aussi bien dans la chaine FORWARD, que dans la translation d'adresse.


#activer l'ip forwarding

echo "1" > /proc/sys/net/ipv4/ip_forward

# tout interdire par défaut
iptables -P FORWARD DROP

#on autorise les clients à se connecter au web par la passerelle
iptables -A FORWARD -i ${PASS_INT_INTERF} -o ${PASS_EXT_INTERF} -s ${ADR_RES_INT} --protocol tcp --destination-port 80 -j ACCEPT

#on autorise les clients à la résolution de noms par la passerelle
iptables -A FORWARD -i ${PASS_INT_INTERF} -o ${PASS_EXT_INTERF} -s ${ADR_RES_INT} -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i ${PASS_EXT_INTERF} -o ${PASS_INT_INTERF} -d ${ADR_RES_INT} -p udp --sport 53 -j ACCEPT

#on autorise les clients à se connecter en ssh par la passerelle
iptables -A FORWARD -i ${PASS_INT_INTERF} -o ${PASS_EXT_INTERF} -s ${ADR_RES_INT} --protocol tcp --destination-port 22 -j ACCEPT

#on autorise les connexions établies
iptables -A FORWARD -i ${PASS_EXT_INTERF} -o ${PASS_INT_INTERF} -d ${ADR_RES_INT} -m state --state ESTABLISHED,RELATED -j ACCEPT

#active le NAT dynamique entre le réseau local ${ADR_RES_INT} et l'extérieur ${ADR_RES_EXT}
iptables -t nat -A POSTROUTING -o ${PASS_EXT_INTERF} -j MASQUERADE


e)Configuration iptables de la passerelle pour les connexions entrantes


Une connexion sur le port 23 du firewall sera en fait redirigée sur le port 22 (ssh) du client.


#on active le DNAT de firewall:23 sur client:22

iptables -t nat -A PREROUTING -i ${PASS_EXT_INTERF} -d ${IP_PASS_EXT} -p tcp -dport 23 -j DNAT --to-destination ${IP_CLIENT}:22


#on autorise l'extérieur à se connecter sur le port 23 du client
iptables -A FORWARD -i ${PASS_EXT_INTERF} -o ${PASS_INT_INTERF} -d ${IP_PASS_INT} --protocol tcp --destination-port 22 -j ACCEPT


f)Amélioration de la chaîne POSTROUTING


Normalement, la cible MASQUERADE est utilisée uniquement si l'une des adresses IP du firewall est attribué dynamiquement, sinon on utilisera plutôt la cible SNAT de la table NAT, en POSTROUTING, qui permet de spécifier directement l'adresse IP à utiliser en sortie, et donc de "consommer" moins de ressources. Apportez les modifications nécessaires pour utiliser maintenant ce mécanisme à la place du MASQUERADE.


#active le NAT dynamique entre le réseau local et l'extérieur
iptables -t nat -A POSTROUTING -o ${PASS_EXT_INTERF} -j SNAT --to-source ${IP_PASS_EXT}

I.Bibliographie

netfilter/iptables project homepage - The netfilter.org project

sharevb