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

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

  • On considère que les équipements d'interconnexion mis en œuvre dans ces travaux pratiques délimitent des périmètres de dimension moyenne. Par conséquent, 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.

  • On fait le choix d'un filtrage basé sur le suivi de communication (stateful inspection). On cherche donc à écrire des règles qui décrivent le plus précisément possible le premier paquet qui doit être enregistré dans la table de suivi de communication. Ces règles de description du premier paquet doivent être placées après celle qui laisse passer le trafic qui correspond ou qui est relatif à une communication déjà enregistrée dans les tables.

  • Dans le but de simplifier l'étude du filtrage, on fait le choix d'autoriser tous les flux sortants émis par les routeurs Hub et Spoke. On laisse donc la politique par défaut à ACCEPT pour les chaînes OUTPUT des routeurs.

On commence par afficher les règles actives sur les différents routeurs à l'issue des questions de la section précédente : Section 4, « Protection de base des routeurs Hub et Spoke ».

Attention ! Les noms d'interfaces correspondent à la maquette de test.

  • Régles de filtrage IPv4 côté Hub : fichier /etc/iptables/rules.v4.

    #~~~~~~~~~~~~ R A W
    *raw
    :PREROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -m rpfilter --invert -m comment --comment BCP38 -j DROP
    COMMIT
    #~~~~~~~~~~~~ N A T
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A POSTROUTING -o enp0s2.300 -j MASQUERADE
    COMMIT
    #~~~~~~~~~~~~ F I L T E R
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -m limit --limit 2/sec -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -p icmp -m limit --limit 2/sec -m conntrack --ctstate NEW -j ACCEPT
    COMMIT
  • Régles de filtrage IPv6 côté Hub : fichier /etc/iptables/rules.v6.

    #~~~~~~~~~~~~ R A W
    *raw
    :PREROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -m rpfilter --invert -m comment --comment BCP38 -j DROP
    COMMIT
    #~~~~~~~~~~~~ N A T
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A POSTROUTING -o enp0s2.300 -j MASQUERADE
    COMMIT
    #~~~~~~~~~~~~ F I L T E R
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -s fe80::/10 -j ACCEPT
    -A INPUT -p ipv6-icmp -m limit --limit 2/sec -j ACCEPT
    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -p ipv6-icmp -m limit --limit 2/sec -j ACCEPT
    COMMIT
  • Régles de filtrage IPv4 côté Spoke : fichier /etc/iptables/rules.v4.

    #~~~~~~~~~~~~ R A W
    *raw
    :PREROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -m rpfilter --invert -m comment --comment BCP38 -j DROP
    COMMIT
    #~~~~~~~~~~~~ F I L T E R
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -m limit --limit 2/sec -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -p icmp -m limit --limit 2/sec -m conntrack --ctstate NEW -j ACCEPT
    COMMIT
  • Régles de filtrage IPv6 côté Spoke : fichier /etc/iptables/rules.v6.

    #~~~~~~~~~~~~ R A W
    *raw
    :PREROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -m rpfilter --invert -m comment --comment BCP38 -j DROP
    COMMIT
    #~~~~~~~~~~~~ F I L T E R
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -s fe80::/10 -j ACCEPT
    -A INPUT -p ipv6-icmp -m limit --limit 2/sec -j ACCEPT
    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -p ipv6-icmp -m limit --limit 2/sec -j ACCEPT
    COMMIT

Q20.

Dans les jeux de règles déjà en place, comment identifier les règles qui traitent les flux réseau dèjà enregistrés dans le suivi de communication ?

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

Le tableau de la section «7.3. États de l'espace utilisateur» permet de sélectionner les états ESTABLISHED et RELATED que l'on retrouve en première position dans les chaînes INPUT et FORWARD.

Voici un exemple qui illustre l'utilisation de ces règles dans le contexte de la maquette. L'évolution des compteurs, montre qu'une règle est effectivement utilisée dans le traitement du trafic réseau.

etu@Spoke2Vert:~$ sudo ip6tables -vL
# Warning: ip6tables-legacy tables present, use ip6tables-legacy to see them
Chain INPUT (policy ACCEPT 26 packets, 2192 bytes)
 pkts bytes target     prot opt in     out     source     destination
  591 54216 ACCEPT     all      any    any     anywhere   anywhere     ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     icmp     any    any     anywhere   anywhere     limit: avg 2/sec burst 5

Chain FORWARD (policy ACCEPT 6 packets, 480 bytes)
 pkts bytes target     prot opt in     out     source     destination
    6   360 ACCEPT     all      any    any     anywhere   anywhere     ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     icmp     any    any     anywhere   anywhere     limit: avg 2/sec burst 5

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

Q21.

Quelles règles faut-il ajouter pour autoriser les nouveaux flux réseau depuis et vers l'interface de boucle locale (chaîne INPUT) ?

Pour que les processus locaux au système puissent communiquer entre eux, il est essentiel d'autoriser le trafic sur l'interface de boucle locale lo.

On insère une nouvelle règle sur la chaîne INPUT qui admet tous les nouveaux paquets entrant sur l'interface de lo sans tenir compte de la table de suivi des communications.

La même règle est insérée pour les protocoles IPv4 et IPv6. On utilise les numéros de lignes pour insérer les nouvelles règles en postion 2.

etu@Spoke2Vert:~$ sudo iptables -I INPUT 2 -i lo -j ACCEPT
etu@Spoke2Vert:~$ sudo ip6tables -I INPUT 2 -i lo -j ACCEPT

On relève un exemple de résultat en affichant la liste des règles actives avec leurs numéros.

etu@Spoke2Vert:~$ sudo iptables -vL --line-numbers
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain INPUT (policy ACCEPT 939 packets, 364K bytes)
num   pkts bytes target     prot opt in     out     source     destination
1      955 1336K ACCEPT     all  --  any    any     anywhere   anywhere     ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     all  --  lo     any     anywhere   anywhere
3        0     0 ACCEPT     icmp --  any    any     anywhere   anywhere     limit: avg 2/sec burst 5

Chain FORWARD (policy ACCEPT 12 packets, 825 bytes)
num   pkts bytes target     prot opt in     out     source     destination
1      864  653K ACCEPT     all  --  any    any     anywhere   anywhere     ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  any    any     anywhere   anywhere     limit: avg 2/sec burst 5

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

À partir de ce jeu de règles, on peut lancer un test ICMP et relever les compteurs d'utilisation de la nouvelle règle.

etu@Spoke2Vert:~$ ping -q -c 4 ::1
PING ::1(::1) 56 data bytes

--- ::1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3074ms
rtt min/avg/max/mdev = 0.116/0.139/0.162/0.022 ms
etu@Spoke2Vert:~$ sudo ip6tables -vL INPUT --line-numbers
# Warning: ip6tables-legacy tables present, use ip6tables-legacy to see them
Chain INPUT (policy ACCEPT 33 packets, 2968 bytes)
num   pkts bytes target     prot opt in     out     source    destination
1     1445  131K ACCEPT     all      any    any     anywhere  anywhere     ctstate RELATED,ESTABLISHED
2        2   208 ACCEPT     all      lo     any     anywhere  anywhere
3        0     0 ACCEPT     ipv6-icmp  any    any     anywhere  anywhere     limit: avg 2/sec burst 5

Q22.

Quelles règles faut-il ajouter pour autoriser les nouvelles connexions SSH et les intégrer dans la table de suivi des communications ?

Le protocole de couche transport utilisé est TCP et le numéro de port utilisé par le service SSH est 2222.

La section «7.3. États de l'espace utilisateur» du Tutoriel iptables décrit les correspondances entre les états et les flux réseau. Rechercher la clé relative aux nouveaux flux entrants.

Le tableau de la section «7.3. États de l'espace utilisateur» permet de sélectionner l'état NEW.

Voici un exemple d'ajout de règles dans le contexte de la maquette.

etu@Spoke2Vert:~$ sudo iptables -A INPUT -p tcp --syn --dport 2222 \
  -m conntrack --ctstate NEW -m comment --comment SSH -j ACCEPT
etu@Spoke2Vert:~$ sudo ip6tables -A INPUT -p tcp --syn --dport 2222 \
  -m conntrack --ctstate NEW -m comment --comment SSH -j ACCEPT

Comme précédemment, on peut relever les compteurs suite à une nouvelle connexion SSH.

etu@Spoke2Vert:~$ sudo ip6tables -vL INPUT
# Warning: ip6tables-legacy tables present, use ip6tables-legacy to see them
Chain INPUT (policy ACCEPT 41 packets, 3608 bytes)
 pkts bytes target     prot opt in     out     source    destination
 2227  206K ACCEPT     all      any    any     anywhere  anywhere     ctstate RELATED,ESTABLISHED
    2   208 ACCEPT     all      lo     any     anywhere  anywhere
    0     0 ACCEPT     ipv6-icmp  any    any     anywhere  anywhere     limit: avg 2/sec burst 5
    1    80 ACCEPT     tcp      any    any     anywhere  anywhere     tcp dpt:2222 flags:FIN,SYN,RST,ACK/SYN ctstate NEW /* SSH */

Q23.

Quelle est l'instruction qui définit la politique par défaut à appliquer sur les chaînes de la table netfilter ?

Il s'agit d'appliquer le principe de filtrage énoncé en début de section qui veut que tout trafic non autorisé soit interdit.

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

On consulte la documentation et on relève la commande -P. Ensuite, on sélectionne la politique par défaut adaptée au contexte : DROP.

Voici un exemple sur un routeur Spoke.

etu@Spoke2Vert:~$ sudo iptables -P INPUT DROP
etu@Spoke2Vert:~$ sudo ip6tables -P INPUT DROP
etu@Spoke2Vert:~$ sudo iptables -P FORWARD DROP
etu@Spoke2Vert:~$ sudo ip6tables -P FORWARD DROP
etu@Spoke2Vert:~$ sudo iptables -P OUTPUT ACCEPT
etu@Spoke2Vert:~$ sudo ip6tables -P OUTPUT ACCEPT

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