Patrice Ferlet
Patrice Ferlet
Créateur de ce blog.
Publié le oct. 3, 2008 Temps de lecture: 7 min

Me suivre sur Mastodon

iptables en passerelle ou gateway

Je vous parlais de iptables dans le ticket http://www.metal3d.org/index.php/blog/ticket/2008/09/18/Iptables-firewall-puissant. Nous avons vu comment filtrer des paquets afin d’autoriser ou non l’accès à certains ports de la machine. Nous n’avons pas parlé de “forwarding”, de “masquerade”… bref, nous n’avons pas encore le “NAT” (Network Address Translation)

Comme son nom l’indique, le NAT permet de modifier les paquets afin de changer l’adresse source et/ou de destination. Cela va permettre de créer une passerelle (gateway) entre deux réseaux par exemple. Mieux encore, nous allons pouvoir dispatcher les appels sur d’autres serveur.

Afin de permettre le noyau linux de traduire les ip, il faut placer le chiffre “1” dans le fichier /proc/sys/net/ipv4/ip_forward. Cela se résume à faire

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

Pour faire cela, vous devez être “root”. sudo ne marchera pas directement, donc les ubunteros devront faire:

sudo -s
echo 1 > /proc/sys/net/ipv4/ip_forward

Voilà qui est fait. Reste à charger les modules au noyau qui vont permettre le NAT de fonctionner:

modprobe iptable_nat

A partir de là vous allez pouvoir faire du NAT. Il existe deux NAT: DNAT et SNAT pour Destination NAT et Source NAT.

Le premier, DNAT, modifie les paquets réseau en changeant la destination du paquet. Par exemple, si un paquet demande d’aller sur la machine 192.168.0.1 on pourra en fait le faire transiter vers 192.168.0.2. Le client n’y verra que du feu et pensera qu’il a vraiment utilisé 192.168.0.1.

Le second, SNAT, change non plus la destination mais la source. Cela permet de faire croire à la machine qui va reçevoir le paquet que son client est quelqu’un d’autre. Par exemple si un client (192.168.0.10) veut aller sur 192.168.0.20. Le routeur change l’adresse source (celle du client) en 192.168.0.11 par exemple. La machine 192.168.0.20 croit recevoir le paquet depuis cette adresse.

Dans les deux cas, SNAT ou DNAT, les réponses arrivent bel et bien sur le client après coup. Le système est quasi transparent.

Comment allons nous faire cela avec iptables ? Pour le moment, nous n’avions utilisé iptables qu’avec la table “filter” (par défaut), iptables peut utiliser une table “NAT” en appelant l’option -t nat: iptables -t nat -A ….

Deux chaînes vont nous servir: POSTROUTING et PREROUTING. Les règles à utiliser seront DNAT et SNAT.

La chaîne PREROUTING servira à modifier les paquets avant de leur donner la route à prendre: parfait pour le DNAT.\\ La chaîne POSTROUTING servira à modifier les paquets après leur avoir donné la route de destination: parfait pour le SNAT.

Reste à voir comment cela se passe:

iptales -t nat -A PREROUTING -d (adresses de destination) --to-destination (ip de destination modifiée) -j DNAT 
iptales -t nat -A POSTROUTING -s (adresses sources d'entrée) -j SNAT --to-source (adresse source à appliquer)

Prenons un exemple:\\ Nous avons un LAN dont les adresses sont en classe A (192.168.0.0/24), notre pc qui va faire office de routeur aura 2 carte réseau.\\ -La carte eth0 est connecté au LAN -La carte eth1 est connecté au net (ip publique que nous noterons xx.xx.xx.xx)

 +----------------+                                     +----------+
 | 192.168.0.0/24 | ------ eth0 [routeur] eth1 -------- | Internet |
 +----------------+                       xx.xx.xx.xx   +----------+

Créer une passerelle entre le LAN et le net avec iptables se résume à faire croire au net que c’est le routeur qui envoi les paquets. Il faut donc changer l’adresse source des paquets sortant pour leur donner l’adresse ip publique du routeur:

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source xx.xx.xx.xx
</code> 

En bref, tout ce qui veut sortir par eth1 devra changer son ip source en "xx.xx.xx.xx"

Reste une chose: autoriser le "forwarding" puisque les paquets vont essayer de transiter directement.\\
Pour faire simple, autorisez le forward en règle par défaut:
<code>
iptables -P FORWARD ACCEPT

Vous pourrez bloquer le forward par la suite et configurer le FORWARD plus proprement. Je vous montrera ça en bas de l’article.

Une autre méthode, peut-être plus simple, est le MASQUERADE, en d’autres termes, tout les paquets vont prendre l’adresse de sortie de routeur automatiquement. Cela reste du SNAT, mais on appelle iptables de cette manière:

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

Notez que le module prévu au “masquerade” n’est pas forcément chargé, regardez avec lsmod | grep masq si vous voyez un module ipt_masquerade. Si ce n’est pas le cas, chargez le:

modprobe ipt_MASQUERADE

Reste le FORWARDING à modifier pour le rendre plus propre. Pour le moment, nous acceptons le forward dans tous les sens… Ce n’est pas très joli mais ça marche. Le mieux reste donc d’autoriser le forward que dans les cas utiles:

iptables -P FORWARD DROP
#[...]
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#[...]

En d’autre terme, je n’ai autorisé les nouveaux forwards que depuis le lan vers internet. Je laisse aussi les retours de paquets (related, established) autorisés dans l’autre sens.

Il est inutile de forwarder les paquets de eth0 sur lui même, et de eth1 sur lui même, la règle par défaut empêchera cela. \\ Le cas échéant, si vous avez une politique plus souple:

iptables -P FORWARD ACCEPT
iptables -A FORWARD -i eth0 -o eth0 -j DROP
iptables -A FORWARD -i eth1 -o eth1 -j DROP

Ces règles ne font que refuser le forward sur une carte en redondance.

Allez, pour la forme, un petit script qui me permet de router les paquet du lan connecté sur ma carte eth0 vers un autre réseau connecté en wifi (carte ath0): ` #!/bin/bash

+—————-+ +—————-+

| 192.168.0.0/24 | —— eth0 [router] ath0 —– | 192.168.2.0/24 |

+—————-+ +—————-+

LAN=“eth0” OUT=“ath0”

#empty known rules iptables -F iptables -t nat -F iptables -X

Default policies:

#DROP input and forward if they are not filtered iptables -P INPUT DROP iptables -P FORWARD DROP

#for now, accept output iptables -P OUTPUT ACCEPT

Basics rules

#Rules to allow connections on loopback (localhost ==> 127.0.0.1) iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT

#allow ping iptables -A INPUT -p icmp -m icmp –icmp-type any -j ACCEPT

Gateway

#allow new or established or related connections iptables -A INPUT -m state –state NEW -j ACCEPT iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

#allow forward from the lan to outside iptables -A FORWARD -i $LAN -o $OUT -j ACCEPT

#allow forward from outside to lan if connection is established or related iptables -A FORWARD -i $OUT -o $LAN -m state –state ESTABLISHED,RELATED -j ACCEPT

#if you don’t know your outside interface ip: #this rule does the “masquerade” ==> changes packets ip iptables -t nat -A POSTROUTING -o $OUT -j MASQUERADE

#if you know your outside interface ip, replace xx.xx.xx.xx by your ip: #and comment the previous rule #iptables -t nat -A POSTROUTING -o $OUT -j SNAT –to xx.xx.xx.xx

#Don’t allow forward from output to output iptables -A FORWARD -i $OUT -o $OUT -j REJECT

System

Turn on IP forwarding

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

Dernière chose: vos pc sur le lan doivent connaître la route pour aller sur le réseau exterieur. N’oubliez pas de leur donner ces routes, ou configurez le DHCP pour les assigner automatiquement.

Voici comment donner la route par défaut vers notre routeur:

route add default gw ip.du.routeur.sur.eth0

Sinon, si le réseau exterieur au lan est un réseau privé, il suffit de noter l’adresse de réseau et de l’ajouter aux routes du client. Par exemple, si le réseau sur eth1 est de type 192.168.1.0/24 alors que sur eth0 nous sommes sur un réseau 192.168.0.0/24:

 +----------------+                        +----------------+
 | 192.168.0.0/24 | ------ [routeur] ----- | 192.168.1.0/24 |
 +----------------+                        +----------------+

La route à donner aux machines sur 192.168.0.0/24 est:

route add 192.168.1.0/24 via ip.du.routeur.sur.eth0

Ce fut donc notre seconde introspection en ce qui concerne iptables. N’oubliez pas de lire les documentations sur le net, ou la page de man.

Ressources: -http://www.metal3d.org/index.php/blog/ticket/2008/09/18/Iptables-firewall-puissant -http://www.linux-france.org/prj/edu/archinet/systeme/ch62s03.html -http://www.netfilter.org/

comments powered by Disqus