Outils de travail réseau informatique : IPTables - La table de filtrage : Filter La Table de translation d’adresse : NAT

Outil du travail : IPTables


1) Qu’est-ce que c’est ?
 
C’est l’interface de configuration de Netfilter. Netfilter c'est l'ensemble des fonctions internes au noyau (version 2.4 et supérieur) qui réalisent les opérations de firewalling
   
2) Que pouvons-nous faire avec iptables?
              
  • monter un firewall filtrant basé sur les paquets mais aussi sur le statut des connexions engendrés par les paquets(le suivi de connexion)
  • utiliser NAT(Network Address Translation) et le masquerading afin de partager un accés Internet à plusieurs machines
  • utiliser NAT pour faire du proxy transparent (évite d'avoir à paramétrer le proxy sur les Clients/navigateurs web)
  • mettre en place (notamment en permettant le marquage des paquets via la table mangle) la possibilité d'utiliser iproute2 dans le but d'obtenir un routeur sophistiqué permettant le QoS (Quality of Service,  privilégié certains services, mettre en place des limites d'utilisation de bande passante sur un utilisateur, sur un groupe…)
  • manipuler des paquets pour par exemple altéré le champ TOS(2) d'un datagramme IP
                      
3) C’est quoi une chaîne ?
        
Nous allons donc nous positionner comme étant sur la machine qui fera office de firewall/routeur pour tenter de la sécuriser.
   
Lorsqu'un paquet arrive, il va être orienté (selon un certain nombre de paramètres) dans l'une des différentes chaînes disponibles.
             

                       
Ainsi que nous le montres le schéma un paquet rentrera toujours dans la machine via la chaîne PREROUTING et sortira toujours de la machine via la chaîne POSTROUTING(chaînes servant notamment à certaines opérations de routage entre les 2 réseaux) raccordés par notre routeur.

Les chaînes INPUT et OUTPUT quand à elle serviront respectivement à placer des règles pour les paquets destinés à la machine et ceux émis par la machine, pour faire simple : si un paquet est destiné à ma machine, « il arrivera dans la chaîne INPUT » .

Par exemple si je demande la visualisation d'une page sur le web depuis la machine, j'émets une requête qui sortira par la chaîne OUTPUT et la réponse arrivera sur ma machine par la chaîne INPUT .
    
La nuance est dans le "destiné", à savoir que l'on peut considérer qu'un paquet à destination du LAN sera, au moins à certain(s) moment(s) et à certain(s) niveau(x) du modèle OSI, destiné à la machine faisant office de routeur mais sera lui orienté dans la chaîne FORWARD et non pas dans la chaîne INPUT.

Au moment où le paquet rentre dans la chaîne, les règles correspondant à cette chaîne sont appliquées dans l'ordre dans lequel elles sont stockées.

4) La table de filtrage : Filter
        
C'est la table qui va permettre de filtrer tous les paquets qui entrent et sortent de notre machine. Il n'y a ici aucune modification de ces paquets, ils seront comparés à des critères définis dans la table Filter. Dans notre cas, il peut se passer deux choses différentes:

Un paquet qui entre est destiné à un processus de l'hôte (serveur HTTP, FTP...).
Un paquet qui entre est destiné à un autre réseau, c'est alors une fonction de routage.

               
     
            
Un paquet entre dans notre machine. Peu importe par quelle interface il entre, il peut venir aussi bien du réseau local que de l'Internet. Il passe d'abord par la fonction de décision de routage. C'est elle qui va déterminer si le paquet est destiné à un processus local de l'hôte ou à un hôte sur un autre réseau.
          
  • Si le paquet est destiné à l'hôte local :
             o    Il traverse la chaîne INPUT
             o    S'il n'est pas rejeté, il est transmis au processus impliqué. Ce processus va donc le traiter et                     éventuellement émettre un nouveau paquet en réponse.
             o    Ce nouveau paquet traverse la chaîne OUTPUT
             o    S'il n'est pas rejeté, il va vers la sortie.
  • Si le paquet est destiné à un hôte d'un autre réseau:
             o    Il traverse la chaîne FORWARD.
             o    S'il n'est pas rejeté, il poursuit alors sa route.
                   
NB : SEULS les paquets destinés à un processus local traversent la chaîne INPUT. SEULS les paquets issus d'un processus local traversent la chaîne OUTPUT. SEULS les paquets destinés au routage traversent la chaîne FORWARD.
                   
Pour faire cela  on doit ajouter des règles de filtrage dans la table filter, on doit d’abord spécifié la table filter par –t FILTER puis , la chaîne sur laquelle on va filtrer  par –A « nom chaîne » et enfin d’autre option pour la sélection des paquets et d’autres pour les opérations à appliquer.  

Quelques Exemples

Voici une suite de quelques exemples pouvant être utiles. Ils seront accompagnés d'une explication sur leurs rôles.

> iptables -t filter -A INPUT --source 207.46.134.190 --jump DROP

Cet exemple permet de jeter tout ce qui vient de l'adresse 207.46.134.190. La spécification de la table filter est facultative car par défaut c'est celle qui est utilisée. On pourrait abréger cette commande en la suivante :

> iptables -A INPUT -s 207.46.134.190 -j DROP
 
Qui produit exactement le même résultat. L'utilisation de -A ajoute cette règle à la fin de la chaîne. Donc si une précédente règle laissait passer des paquets, ils n'arriveront pas jusqu'à celle-ci.

Pour construire un ensemble de règles de filtrage, on commencera généralement par supprimer toutes celles créées précédemment. 
 
> iptables -t filter -F
          
Cette commande vide intégralement la table filter de toutes les règles qui auraient précédemment été définies.
Ensuite on indiquera plutôt en premier tout ce que l'on accepte, pour ensuite refuser tout le reste. On commencera donc par des règles ressemblant à la suivante :

> iptables -t filter -A INPUT --protocol tcp --destination-port 80 --jump ACCEPT
       
Cette règle permet de laisser passer tout le trafic TCP entrant sur le port 80. Ce sera utile par exemple si un serveur web (par défaut sur le port 80) est présent sur la machine. Mais il faut ensuite que les réponses envoyées puissent l'être. Dans ce cas, la règle précédente autorise des personnes extérieures à demander une page. Pour que le serveur puisse la transmettre, il faudra une règle comme suit :

> iptables -t filter -A OUTPUT --protocol tcp --source-port 80 --jump ACCEPT
   
Pour laisser les utilisateurs internes accéder aux sites Internet, on peut définir cette règle :

> iptables -t filter -A OUTPUT --protocol tcp --destination-port 80 --jump ACCEPT
           
Celle-ci permet donc de laisser passer les paquets à destination du port 80 d'une machine extérieure. Et pour que les utilisateurs puissent recevoir les pages envoyées par ces machines, il faudra ajouter :
        
> iptables -t filter -A INPUT --protocol tcp --source-port 80 --jump ACCEPT
       
Pour ne pas confondre ce que font les quatre règles précédentes, voici un résumé de ce qu'elles font : 
       
  • La première laisse entrer ce qui est pour le port 80 de la machine.
  • La deuxième laisse sortir les paquets par le port 80 de la machine.
  • La troisième laisse sortir ce qui est pour le port 80 d'une autre machine.
  • La quatrième laisse entre ce qui vient du port 80 d'une autre machine.
             
Dans le cas où ce sont les seules choses permises sur cette machine, on terminera par indiquer que tout le reste doit être ignoré. Arriveront à ce point seulement les paquets qui n'auront pas répondu aux critères précédents. On peut donc alors les jeter (avec la cible DROP). Une règle toute simple pourrait être la suivante :

> iptables -t filter -A INPUT --jump DROP
> iptables -t filter -A OUTPUT --jump DROP


On a aussi REJECT qui peut être utilisé à la place de DROP lorsqu’on veut envoyer un message à l’émetteur pour le prévenir du refus de ces paquets.


5) La Table de translation d’adresse : NAT


La table NAT (Network Address Translation) est la table qui va nous permettre de faire la translation des adresses IP des paquets, aussi de faire la translation des ports ou un mélange des deux.
Le principe :

Dans un datagramme, en plus des données, on trouve également quelques informations concernant le protocole utilisé et des identificateurs de l'émetteur et du destinataire du datagramme. Ce sont ces identificateurs qui nous intéressent:     
   
L'adresse IP du destinataire.
Le port du service utilisé sur le destinataire.

Ces informations constituent une "socket"(port), elles sont indispensables pour arriver à joindre le bon service sur le bon serveur, par exemple le service HTTP du serveur.
L'adresse IP de l'émetteur.
Le port de réponse.
 
Ces informations constituent un autre "socket", elles sont indispensables pour que l'émetteur d'un paquet puisse espérer recevoir une réponse.
   
Avec les fonctions NATage, lorsqu'un paquet transite par notre passerelle, nous allons pouvoir manipuler ces sockets comme on veut. Par exemple, nous pourrons changer l'adresse de l'émetteur ou le port de l'émetteur ou les deux. Nous pouvons aussi changer l'adresse du destinataire, ou le port du destinataire, ou les deux.

A quoi sert la NAT ?
    
La NAT nous permet de faire une multitude de choses dont les plus intéressantes:
     
Le masquage d'adresse
     
C'est une fonction fondamentale lorsque l'on souhaite connecter un réseau privé à l'Internet lorsque l'on ne dispose que d'une seule IP valide sur le Net, même si celle-ci est dynamique, ce qui est le cas qui nous intéresse le plus (Les clients sont sur le réseau privé et les serveurs sont sur le Net). C'est une forme particulière de SNAT (Source NAT)

C'est ce que sont capables de faire tous les routeurs SOHO (Small Office, Home Office) qui permettent de relier un petit réseau local à l'Internet, lorsque l'on ne dispose que d'un accès RTC, NUMERIS, Câble, ADSL... Un simple PC  équipé d'un Linux 2.4.x permet de le faire aussi bien sinon mieux.

Le NAT de destination
       
Ici, c'est pour résoudre les problèmes qui apparaissent dans l'autre sens. Les clients sont sur le Net et les serveurs sont sur le réseau privé.
     
Imaginons que nous n'ayons qu'une seule IP valide sur le Net et que nous voulions tout de même offrir des services tels que HTTP, FTP, SMTP, POP et peut-être d'autres encore.

Comment faire ? La plus simple des solutions  consiste à placer tous ces serveurs sur la même machine, celle qui a la seule adresse IP valide sur le Net à laquelle j'ai droit."
  
Mais comment assurer un minimum de sécurité sur une machine ouverte de tous les côtés ?
Comment faire pour assurer une disponibilité suffisante à chaque service dans les montées en charge ?
   
Cette solution ne parait finalement pas très acceptable, mais comment faire autrement? Tout simplement avec NAT. La machine frontale sera un simple routeur NAT. Côté Internet, elle possède la seule IP valide disponible, elle va faire croire que tous les services sont dessus, mais en réalité, lorsqu'elle va recevoir un paquet dont le socket de destination est 62.161.96.47:80, elle va remplacer ce socket par 192.168.0.1:80 et router le paquet vers le serveur HTTP. Lorsque la réponse du serveur va lui parvenir, elle remplacera le socket de l'émetteur (192.168.0.1:80) par 62.161.96.47:80 et enverra ça sur le Net.
        

           
Bien entendu, le routeur NAT est capable de faire ça pour chacun des autres serveurs:
Ce qui lui arrivera sur les ports 20 et 21 sera redirigé sur le serveur FTP (en réalité, le cas du FTP est bien plus difficile à résoudre que ça.

Ce qui lui arrivera sur le port 25 sera redirigé sur le serveur SMTP/POP3 service SMTP
Ce qui lui arrivera sur le port 110 sera redirigé sur le serveur SMTP/POP3 service POP3.

Le fonctionnement de NAT Et comment ça marche ?
        

         
La table NAT est organisée comme l’indique le schéma ci-dessus:

La chaîne PREROUTING va exécuter un traitement sur les "sockets" avant les décisions de routage. Nous nous en servirons pour faire du DNAT (Destination NAT), autrement dit, pour modifier la "socket" du destinataire.

La chaîne POSTROUTING intervient à la sortie du routeur. Elle servira à faire du SNAT (Source NAT) dont par exemple, le masquage d'adresse.

La chaîne OUTPUT, quant à elle, permet de modifier le socket de destination d'un paquet issu d'un processus local.  « L'utilité de cette chaîne n'est pas évidente, dans la mesure où, normalement, les paquets sortant d'un processus local devraient aussi passer par POSTROUTING ».

La seule possibilité supplémentaire est de pouvoir rediriger les paquets qui sortent d'un processus local à destination d'une cible extérieure, vers un autre processus local (127.0.0.1).

Les possibilités offertes par le NAT sont quasiment infinies. Nous avons vu les plus fréquentes :
Masquage d'adresse, pour permettre à tout un réseau privé d'accéder au Net lorsque l'on ne dispose que d'une seule adresse IP valide sur le Net, redirection d'un service serveur adressé sur la passerelle vers un serveur situé dans le réseau privé, ça peut être utile pour les joueurs en réseau, mais aussi pour des applications plus professionnelles.

Pour que tout ça fonctionne correctement, le système s'appuie sur le suivi de connexion. Nous pouvons donc nous attendre à trouver des modules spécialisés pour certains protocoles, dont le FTP. Ainsi, le module ip_nat_ftp sera nécessaire si vous voulez travailler proprement en FTP.


Quelques Exemples
                     
Le DNAT ou NAT Destination   
    
On substitue à l'adresse de destination des paquets provenant du réseau public, une adresse du réseau local privé. Dans l'exemple, les paquets à destination de la machine 195.x sont redirigés vers la machine 172.y. On ne tient pas compte du port.
    
Dans cet exemple nous allons d’abord effacer toutes les règles (-F) de la table part défaut (Filter) ensuite on accepte tous les paquets. Puis on efface (-F) aussi toutes les règle de la table NAT (-t  nat) pour les paquets qui ne sont pas encore routés. Enfin on défini une nouvelle regle dans laquelle les paquets à destination de la machine 195.115.19.35 sont redirigés vers la machine 172.16.0.1.
         
iptables -F INPUT  ; iptables -P INPUT ACCEPT
iptables -F OUTPUT  ; iptables -P OUTPUT ACCEPT
iptables -F FORWARD ; iptables -P FORWARD ACCEPT


iptables -t nat -F PREROUTING

iptables -t nat -A PREROUTING -d  195.115.19.35/32 \
         -j  DNAT --to-destination  172.16.0.1/32
  
 Le SNAT ou NAT Source

Le SNAT consiste à substituer une adresse source dans un paquet sortant à son adresse source d'origine. On substitue ici, aux requêtes provenant du réseau 192.168.0.0/24, une des 10 adresses publiques.
Dans cet exemples

iptables -t nat -F POSTROUTING

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
         -j  SNAT --to-source   195.115.90.1-195.115.90.10
             L'IP Masquerade
      
Dans ce cas, les adresses privées, utilisent toutes la même adresse publique. C'est le procédé qui est utilisé avec ipchains. Il s'agit en fait de translation de port avec ipchains ou de SNAT (Nat Source) avec iptables.
iptables -t nat -F POSTROUTING

iptables -t nat -A POSTROUTING -s 10.10.10.0/8 \
         -j  SNAT --to-source 139.63.83.120
Une autre option consiste à utiliser l'option "MASQUERADE"
iptables -t nat -F POSTROUTING

iptables -t nat -A POSTROUTING -s 10.10.10.0/8 -j  MASQUERADE 

                                 

Article plus récent Article plus ancien

Leave a Reply