4. Règles de filtrage communes à toutes les configurations

La mise en place du filtrage réseau sur les équipements doit répondre à deux principes.

  • Comme les équipements d'interconnexion mis en œuvre dans ces travaux pratiques délimitent des périmètres de faible dimension, on a une connaissance exhaustive des flux réseaux sur le système. On adopte donc la règle : tout trafic réseau non autorisé est interdit.

  • Pour exploiter au mieux les fonctionnalités offertes par le noyau Linux, on s'appuie sur le suivi de communication (stateful inspection) pour obtenir un filtrage réseau le plus efficace possible. On cherche donc à suivre la règle d'or d'écriture des règles de filtrage qui consiste à décrire le plus précisément possible le premier paquet qui doit être enregistré dans la table de suivi de communication. Cette règle de description du premier paquet doit être placée après celle(s) qui laisse(nt) passer les flux réseau déjà enregistrés dans la machine d'état de suivi de communication.

1.

Quelle est la syntaxe de la commande iptables sur la politique par défaut à appliquer sur les chaînes de la table netfilter pour respecter le premier principe de filtrage énoncé ci-dessus ?

De façon très classique, on consulte les pages de manuels de la commande iptables et on recherche le mot clé policy. La stratégie retenue suppose que l'on implante règles d'autorisation des flux réseaux valides et que tout autre trafic soit éliminé. La politique par défaut à appliquer sur les trois chaînes est donc : DROP.

La section «9.3. Commandes» du Tutoriel iptables donne aussi la syntaxe de configuration de cible par défaut pour les chaînes élémentaires : INPUT, FORWARD et OUTPUT.

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

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

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

2.

Quelle est la syntaxe de la commande iptables qui autorise le trafic réseau déjà enregistré dans la machine d'état de suivi de communication sur les chaînes INPUT et OUTPUT ?

La recherche de la correspondance state dans les pages de manuel de la commande iptables permet de sélectionner les états ESTABLISHED et RELATED à appliquer sur les chaînes.

La section «7.3. États de l'espace utilisateur» du Tutoriel iptables décrit les correspondances entre les états et les flux réseau.

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -vL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target   prot opt in    out   source     destination
    0     0 ACCEPT   0    --  any   any   anywhere   anywhere  state RELATED,ESTABLISHED

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

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target   prot opt in    out   source     destination
    0     0 ACCEPT   0    --  any   any   anywhere   anywhere  state RELATED,ESTABLISHED

À partir de cette étape, on utilise les programmes iptables-save et iptables-restore pour optimiser les manipulations. Ces programmes présentent un grand intérêt dans la mesure où l'affichage des règles de filtrage est plus condensé.

# iptables-save >/var/lib/iptables/active
# vim /var/lib/iptables/active
# iptables-restore </var/lib/iptables/active
# grep -v '^# ' /var/lib/iptables/active
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
#~~~~~~~~~~~~~~~~~~~~~:: INPUT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#~~~~~~~~~~~~~~~~~~~~~:: OUTPUT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
COMMIT

La commande iptables-restore doit être utilisée après chaque édition du fichier /var/lib/iptables/active.

3.

À partir des règles de filtrage précédentes, est-il possible d'émettre ou de recevoir du trafic réseau non enregistré dans la machine d'état de suivi de communication ?

Faire des tests ICMP, DNS et HTTP. Conclure et justifier.

La réponse est non. La politique par défaut sur les chaînes INPUT et OUTPUT étant positionnée à DROP, tout nouveau paquet entrant ou sortant est rejeté. Pour qu'une communication soit possible, il faudrait avoir enregistré un flux réseau dans la machine d'état avant d'appliquer ce jeu de règles de filtrage.

4.

Quelle est la syntaxe de la commande iptables qui autorise le trafic réseau depuis (chaîne OUTPUT) et vers (chaîne INPUT) l'interface de boucle locale de l'équipement ?

Pour que les processus locaux au système puissent communiquer entre eux via la pile de protocole TCP/IP, il est essentiel d'autoriser le trafic sur l'interface de boucle locale lo. La recherche de la correspondance state dans les pages de manuel de la commande iptables permet de sélectionner l'état NEW pour autoriser le premier paquet depuis et vers cette interface. Tous les autres paquets devront correspondre aux règles déjà écrites ci-dessus.

On ajoute deux nouvelles règles sur les chaînes INPUT et OUTPUT qui admettent respectivement tous les paquets entrant et sortant par l'interface de lo dans la table de suivi des communications.

# grep -v '^# ' /var/lib/iptables/active
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
#~~~~~~~~~~~~~~~~~~~~~:: INPUT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -m state --state NEW -j ACCEPT
#~~~~~~~~~~~~~~~~~~~~~:: OUTPUT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -o lo -m state --state NEW -j ACCEPT
COMMIT

À partir de ce jeu de règles, on peut lancer un test ICMP : # ping -c 4 127.0.0.1.

5.

Quelle est la syntaxe de la commande iptables qui autorise le trafic sortant sur l'interface LAN en sortie du système ?

Comme pour la question précédente, les processus locaux au système doivent pouvoir émettre du trafic via la pile de protocole TCP/IP. Il est donc préférable d'autoriser le trafic sortant sur l'interface LAN. On utilise à nouveau l'état NEW pour autoriser le premier paquet depuis l'interface. Tous les autres paquets devront correspondre aux communications déjà enregistrées dans les tables de suivi.

On ajoute une règle sur la chaîne OUTPUT qui admet, dans la table de suivi des communications, les paquets sortant par l'interface eth0.

# grep -v '^# ' /var/lib/iptables/active
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
#~~~~~~~~~~~~~~~~~~~~~:: INPUT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -m state --state NEW -j ACCEPT
#~~~~~~~~~~~~~~~~~~~~~:: OUTPUT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -o lo -m state --state NEW -j ACCEPT
-A OUTPUT -o eth0 -m state --state NEW -j ACCEPT
COMMIT

6.

Quelle est la syntaxe de la commande iptables qui autorise le trafic ICMP en entrée du système en limitant le nombre des nouvelles requêtes à 5 par minute ?

Interdire tout trafic ICMP est une très mauvaise idée du point de vue administration réseau. Pour autant, il est très facile de se prémunir contre les tentatives de saturation du trafic sur les interfaces en limitant le nombre de requêtes simultanées en entrée sur toutes les interfaces. Dans un premier temps on se contente de cette règle unique très simple même s'il est judicieux de valider les types et les codes des messages ICMP. Dans un deuxième temps, on distinguera les types de messages ; voir Section 7.1, « Protocole ICMP ».

On peut qualifier le fonctionnement de la limitation de trafic à l'aide des commandes ping et hping3 à partir d'un hôte distant.

La recherche de la correspondance limit dans les pages de manuel de la commande iptables permet de compléter la syntaxe de la règle d'autorisation du trafic ICMP avec l'état NEW pour le suivi de communication.

# grep -v '^# ' /var/lib/iptables/active
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
#~~~~~~~~~~~~~~~~~~~~~:: INPUT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -m limit --limit 5/min -m state --state NEW -j ACCEPT
-A INPUT -i lo -m state --state NEW -j ACCEPT
#~~~~~~~~~~~~~~~~~~~~~:: OUTPUT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -o lo -m state --state NEW -j ACCEPT
-A OUTPUT -o eth0 -m state --state NEW -j ACCEPT
COMMIT

Les tests de qualification de la nouvelle règle utilisent la commande usuelle ping puis un outil beaucoup moins classique qui offre de nombreuses «possibilités», hping3.

# ping -n -c 3 192.0.2.3
PING 192.0.2.3 (192.0.2.3) 56(84) bytes of data.
64 bytes from 192.0.2.3: icmp_req=1 ttl=64 time=0.958 ms
64 bytes from 192.0.2.3: icmp_req=2 ttl=64 time=0.746 ms
64 bytes from 192.0.2.3: icmp_req=3 ttl=64 time=0.803 ms

--- 192.0.2.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.746/0.835/0.958/0.095 ms

# hping3 -1 --rand-source --fast -c 10 192.0.2.3
HPING 192.0.2.3 (tap0 192.0.2.3): icmp mode set, 28 headers + 0 data bytes
len=28 ip=192.0.2.3 ttl=64 xml:id=5204 icmp_seq=0 rtt=1.0 ms
len=28 ip=192.0.2.3 ttl=64 xml:id=9948 icmp_seq=1 rtt=0.5 ms
len=28 ip=192.0.2.3 ttl=64 xml:id=31892 icmp_seq=2 rtt=0.6 ms
len=28 ip=192.0.2.3 ttl=64 xml:id=48870 icmp_seq=3 rtt=0.6 ms
len=28 ip=192.0.2.3 ttl=64 xml:id=40501 icmp_seq=4 rtt=0.7 ms

--- 192.0.2.3 hping statistic ---
10 packets transmitted, 5 packets received, 50% packet loss

On constate que le premier test ne produit aucune erreur alors que la tentative de spoofing rapide des adresses IP source entraîne des pertes de paquets ICMP dès que la limite fixée dans la règle de filtrage est atteinte.

Une fois ces règles basiques en place, on peut aborder les filtrages réseau spécifiques à la topologie de travaux pratiques.