3. Les outils de filtrage réseau

Sur un système GNU/Linux, les fonctions de filtrage réseau sont réparties entre les espaces mémoire noyau (kernelspace) et utilisateur (userspace).

Que l'on utilise un noyau fourni par la distribution au le noyau construit à l'issue des travaux pratiques Configuration des fonctions réseau & compilation du noyau Linux, les fonctions de filtrage réseau sont disponibles sous forme de modules que l'on (charge|décharge) de la mémoire système en cours d'exécution. Les outils de filtrage réseau du noyau Linux chargent dynamiquement ces modules en fonction de la syntaxe des règles de filtrage saisies.

3.1. Questions sur iptables

1.

Quels paquets contiennent les outils utilisateur principaux de manipulation des fonctions de filtrage réseau ?

Rechercher dans le cache du gestionnaire de paquets de la distribution des mots clés tels que iptables ou firewall à l'aide des commandes apt-cache ou aptitude.

Dans le cadre des travaux pratiques, seuls les outils élémentaires sont utilisés pour faciliter la compréhension des mécanismes de suivi de communication du système de filtrage réseau. On ne s'intéresse donc pas aux paquets qui fournissent des solutions de filtrage «clé en main».

On sait que la partie userspace des fonctions de filtrage réseau s'appelle iptables. On lance donc une recherche avec ce mot clé dans la base de données des paquets Debian et on installe les paquets intéressants.

Une recherche simple dans le catalogue des paquets donne le résultat suivant.

$ aptitude search iptables
p   arno-iptables-firewall       - single- and multi-homed firewall script with DSL/ADSL support
i   iptables                     - Outils d'administration pour le filtrage de paquets et le NAT
p   iptables-dev                 - iptables development files
p   iptables-persistent          - Simple package to set up iptables on boot
p   libiptables-chainmgr-perl    - Perl extension for manipulating iptables policies
p   libiptables-parse-perl       - Perl extension for parsing iptables firewall rulesets

Une recherche plus précise dans les descriptions de paquets donne une liste plus étoffée.

# aptitude search '~diptables' | grep ipt
p   apf-firewall                    - easy iptables based firewall system
p   arno-iptables-firewall          - single- and multi-homed firewall script wi
p   firehol                         - An easy to use but powerful iptables state
p   fwsnort                         - Snort-to-iptables rule translator
p   ipkungfu                        - iptables-based Linux firewall
i   iptables                        - Outils d'administration pour le filtrage d
p   iptables-dev                    - iptables development files
p   iptables-persistent             - Simple package to set up iptables on boot
i   iptstate                        - Top-like state for netfilter/iptables
p   libiptables-chainmgr-perl       - Perl extension for manipulating iptables p
p   libiptables-parse-perl          - Perl extension for parsing iptables firewa
p   mxallowd                        - Anti-Spam-Daemon using nolisting/iptables
p   netscript-2.4                   - Linux 2.4.x (and 2.6.x) router/firewall ne
p   uif                             - Advanced iptables-firewall script
p   uruk                            - Very small firewall script, for configurin
i   xtables-addons-common           - Extensions targets and matches for iptable
p   xtables-addons-source           - Extensions targets and matches for iptable

Comme on doit rester à un faible niveau d'intégration des règles de filtrage de manière à bien illustrer les mécanismes de suivi de communication. Les deux paquets retenus sont iptables et iptstate. On utilise les commandes usuelles d'installation et de consultation des informations sur ces deux paquets.

# aptitude install iptables iptstate
<snipped/>
# apt-cache show iptables
<snipped/>
# apt-cache show iptstate
<snipped/>

2.

Quelles sont les options de la commande iptables qui permettent de visualiser les règles de filtrage réseau actives ainsi que les compteurs correspondants ? Quelle option faut-il préciser pour spécifier la table consultée : netfilter ou nat.

Consulter les pages de manuels via # man iptables.

La consultation des pages de manuels permet de relever le jeu d'options -vL.

# iptables -vL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

La table netfilter est utilisée de façon implicite alors que la table nat de traduction d'adresses doit être appelée explicitement.

# iptables -vL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

3.

Comment visualiser les modules chargés dynamiquement en fonction de l'utilisation des règles de filtrage réseau ?

Utiliser la commande qui sert à lister les modules chargés en mémoire avant et après avoir consulté les tables de filtrage réseau pour la première fois.

La commande lsmod sert à lister les modules chargés en mémoire. En exécutant cette commande avant et après avoir utilisé iptables, on visualise par différence les nouveaux modules chargés par chaque appel. Par exemple, l'exécution des deux commandes de consultation de la question précédente provoque le chargement des modules suivants.

  • Après consultation de la table netfilter :

    # lsmod |less
    Module                  Size  Used by
    iptable_filter          2258  0 
    ip_tables              13899  1 iptable_filter
    x_tables               12845  1 ip_tables
    <snipped/>
    
  • Après consultation de la table nat :

    # lsmod |less
    iptable_nat             4299  0 
    nf_nat                 13388  1 iptable_nat
    nf_conntrack_ipv4       9833  3 iptable_nat,nf_nat
    nf_conntrack           46535  3 iptable_nat,nf_nat,nf_conntrack_ipv4
    nf_defrag_ipv4          1139  1 nf_conntrack_ipv4
    iptable_filter          2258  0 
    ip_tables              13899  2 iptable_nat,iptable_filter
    x_tables               12845  2 iptable_nat,ip_tables
    <snipped/>
    

4.

Quels sont les outils de sauvegarde et de restauration des jeux de règles de filtrage réseau fournis avec le paquet iptables ?

Consulter la liste des fichiers du paquet iptables.

La liste des fichiers du paquet contient les outils recherchés : # dpkg -L iptables |grep bin. Les deux programmes iptables-save et iptables-restore permettent respectivement de sauvegarder et de restaurer l'ensemble des règles des tables netfilter et nat.

Ces programmes sont indispensables pour éditer, insérer ou retirer des règles sans avoir à se préoccuper de l'ordre de saisie. De plus, le programme de restauration se charge de l'effacement des règles précédentes.

3.2. Questions sur netfilter

1.

Comment identifier la version du noyau utilisée et la disponibilité des fonctions de filtrage réseau de cette version ?

Après avoir utilisé la commande «historique» d'identification de la version du noyau, faire une recherche dans l'arborescence des modules de ce noyau avec la commande find. Trouver les fichiers dont le nom comprend la chaîne netfilter.

On utilise la commande uname que l'on associe à une recherche dans l'arborescence des modules du noyau en cours d'exécution.

$ uname -r
2.6.32-5-amd64
$ find /lib/modules/`uname -r` -type d -name netfilter
/lib/modules/2.6.32-5-amd64/kernel/net/bridge/netfilter 1
/lib/modules/2.6.32-5-amd64/kernel/net/ipv4/netfilter   2
/lib/modules/2.6.32-5-amd64/kernel/net/decnet/netfilter
/lib/modules/2.6.32-5-amd64/kernel/net/ipv6/netfilter   3
/lib/modules/2.6.32-5-amd64/kernel/net/netfilter        4

1

Fonctions de filtrage au niveau liaison. Ces fonctions ne sont pas utilisées ici.

2

Fonctions de filtrage au niveau réseau utilisant le protocole IPv4. C'est dans ce répertoire que se trouvent les modules utilisés dans ces travaux pratiques.

3

Fonctions de filtrage au niveau réseau utilisant le protocole IPv6. Ces fonctions ne sont pas utilisées ici.

4

Fonctions communes de filtrage réseau indépendantes des niveaux et des protocoles utilisés. C'est notamment à ce niveau que l'on trouve les modules de la machine d'état de suivi de communications.

2.

Quels sont les objets du système de fichiers virtuel /proc relatifs aux fonctions de filtrage réseau du noyau Linux ?

Avec le chargement des modules en mémoire système, de nouvelles entrées apparaissent dans l'arborescence /proc. Même si l'arborescence /proc n'est pas un véritable système de fichiers, il est possible d'effectuer des recherches toujours à l'aide de la commande find.

Le chargement des trois premiers modules entraîne la création des entrées relatives aux noms chaînes, aux correspondances et aux prises de décisions.

# find /proc/net/ -name "*tables*"
/proc/net/ip_tables_targets
/proc/net/ip_tables_matches
/proc/net/ip_tables_names

La consultation des règles de la table nat entraîne la création de toutes les entrées nécessaires à la machine d'état de suivi de communication.

# find /proc/net/ -name "*conntrack*"
/proc/net/ip_conntrack_expect
/proc/net/ip_conntrack
/proc/net/nf_conntrack
/proc/net/nf_conntrack_expect
/proc/net/stat/ip_conntrack
/proc/net/stat/nf_conntrack

3.

Comment visualiser les informations de la machine d'état de suivi de communication ?

Rechercher les entrées de l'arborescence /proc dont le nom comprend la chaîne conntrack.

La section «7.2 Les entrées de conntrack» du Tutoriel iptables décrit précisément les différents champs du suivi de communication.

Le programme iptstate affiche les entrées de la table de suivi de communication sur le même mode que la commande top.

Les états sont directement consultables à partir du fichier virtuel /proc/net/ip_conntrack. Par exemple :

# cat /proc/net/ip_conntrack
<snipped/>
udp 17 27 src=192.0.2.3 dst=192.0.2.1 sport=54932 dport=53 \
      packets=1 bytes=59 src=192.0.2.1 dst=192.0.2.3 sport=53 dport=54932 \
      packets=1 bytes=259 mark=0 secmark=0 use=2

L'exemple ci-dessus donne l'état du suivi de communication d'une requête DNS entre un poste client avec l'adresse 192.0.2.3 et le port source 54932 et un serveur avec l'adresse 192.0.2.1.