2. Architecture réseau étudiée et filtrage existant

Les manipulations sur le système de filtrage réseau présentées ici s'appuient sur la topologie Hub and Spoke étudiée dans le support précédent de la série : Topologie Hub & Spoke avec le protocole PPPoE.

La topologie étudiée associe trois routeurs qui ont deux rôles distincts.

Hub

Traduit mot à mot, le rôle Hub correspond à un concentrateur. Il concentre tous les flux réseau des routeurs qui ont le rôle Spoke. En effet, les échanges entre deux routeurs Spoke doivent passer par le routeur Hub.

On lui attribue aussi la fonction de Broadband Remote Access Server ou BRAS. Dans notre contexte, cette fonction se caractérise par le fait que ce routeur détient le plan d'adressage. C'est lui qui a la responsabilité de délivrer les adresses IP lors de l'initiation de la session PPP.

Spoke

Le rôle Spoke correspond à un réseau d'extrémité au delà duquel on ne trouve aucune interconnexion. Le routeur Spoke doit s'adresser au routeur Hub dès qu'il veut acheminer un flux réseau. Il s'agit bien d'un routeur d'extrémité qui ne dispose d'aucun chemin alternatif pour joindre l'Internet.

Dans les réseaux domestiques, la «box» correspond bien au rôle Spoke dans la mesure où elle se voit attribuer des adresses IPv4 et IPv6 publiques par le fournisseur d'accès Internet. Les seules informations qu'elle détient sont les authentifiants du client de l'opérateur.

Pour commencer, on s'intéresse à l'installation des outils et à la lecture des informations sur le filtrage déjà en place sur le routeur Hub.

2.1. Routage et traduction d'adresses sources (situation de départ)

La situation de départ des manipulations suppose que la topologie Hub & Spoke est en place et fonctionnelle. On s'appuie sur le support précédent de la série : la Topologie Hub & Spoke avec le protocole PPPoE qui comprend déjà un premier niveau de filtrage avec la traduction d'adresses sources de tous les paquets qui sortent vers le réseau d'infrastructure (VLAN rouge).

Q1.

Quel est le nom de l'outil de gestion des règles de filtrage réseau ? À quel paquet appartient-il ?

Reprendre la section sur la configuration du routeur Hub dans le document Topologie Hub & Spoke avec le protocole PPPoE.

Il s'agit de la commande nft fournie avec le paquet nftables.

apt show nftables
dpkg -L nftables

Q2.

Quel est l'état du service systemd associé ?

Reprendre la section sur la configuration du routeur Hub dans le document Topologie Hub & Spoke avec le protocole PPPoE dans laquelle le service a été activé.

On affiche l'état du service systemd fourni avec le paquet nftables et on vérifie qu'il est activé (enabled).

systemctl status nftables

Q3.

Dans quel fichier sont enregistrés les jeux de règles à appliquer au lancement du système ?

Rechercher dans les informations affichées à la question précédente, la syntaxe de la commande lancée par le service systemd.

On identifie le fichier /etc/nftables qui sert à stocker les jeux de règles activés lors de l'initialisation du système.

Q4.

Comment afficher la liste des règles de filtrage actives ?

Rechercher dans les pages de manuels de la commande nftables l'option qui permet d'afficher la liste du jeu de règles en cours de traitement.

La lecture des pages de manuels conduit à l'option list suivie de ruleset.

sudo nft list ruleset
table inet nat {
        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                oifname "enp0s1.360" counter packets 89 bytes 7400 masquerade
        }
}

2.2. Lecture des règles de traduction d'adresses sources

Dans cette partie, on s'intéresse à l'identification des éléments qui composent le jeu de règles de traduction d'adresses sources appliqué sur le routeur Hub de la topologie étudiée.

Comme le jeu de règles est déjà présent et actif, il faut comparer les champs des règles du fichier /etc/nftables.conf avec la représentation graphique générale Packet Flow in Netfilter.

Q5.

Quelle est la table utilisée dans les deux jeux de règles de filtrage appliquées sur le routeur Hub ?

Il s'agit de la table nat que l'on repère en couche liaison de la représentation graphique Packet Flow in Netfilter

Q6.

Quelle est la chaîne utilisée dans les deux jeux de règles de filtrage appliquées sur le routeur Hub ?

Il s'agit de la chaîne postrouting que l'on repère en couche liaison à droite de la représentation graphique Packet Flow in Netfilter

Comme son nom l'indique, cette chaîne traite les paquets après que la décision de routage ait été prise.

Q7.

Comment l'interface réseau sur laquelle les traitements sont appliqués est-elle identifiée ?

Repérer le mot clé placé avant la chaîne de caractère qui contient le nom de l'interface.

La clé placée avant le nom d'interface est oifname. Cette clé correspond à output interface name.

La traduction d'adresses sources a lieu en sortie sur l'interface réseau raccordée au réseau d'infrastructure (VLAN rouge).

Q8.

Quel est le nom de la cible utilisée dans les deux jeux de règles de filtrage appliquées sur le routeur Hub ?

Identifier le mot clé placé à droite en bout de chaîne de traitement après les compteurs.

Le nom utilisé est masquerade. Il caractérise le fait que l'adresse source de tous les paquets sortants par l'interface enp0s1.360 est remplacée par celle de cette interface, aussi bien avec IPv4 qu'avec IPv6.

2.3. Comptage des paquets et enregistrements des transactions

La traduction d'adresse source entre dans la catégorie du filtrage Stateful. Il est nécessaire de conserver un enregistrement de la traduction faite sur un paquet sortant pour réaliser l'opération inverse lors de l'arrivée du paquet retour relatif au paquet sortant.

Dans cette partie, on cherche à afficher la liste des enregistrements en cours dans le routeur Hub pour des flux initiés depuis un conteneur hébergé sur un routeur Spoke.

Q9.

Comment caractériser l'utilisation des jeux de règles de filtrage en l'état actuel de la configuration ?

Rechercher dans les résultats de l'affichage des règles en cours sur le routeur Hub, les informations sur le comptage des flux.

La sortie de la commande d'affichage fait apparaître le compte des paquets traités par la chaîne postrouting avec l'indication counter packets.

sudo nft list ruleset
table inet nat {
        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                oifname "enp0s1.360" counter packets 89 bytes 7400 masquerade
        }
}

Q10.

Est-ce que les valeurs de comptage affichées correspondent au volume de trafic vu sur l'interface ?

Rechercher, dans les options de la commande ip, le moyen d'afficher les statistiques de l'interface de sortie sur le réseau d'infrastructure (VLAN rouge). Comparer les valeurs obtenues avec celles de l'affichage des règles de filtrage.

C'est l'option -s de la commande ip qui donne les informations sur le volume de trafic qui a transité par une interface.

ip -s -h addr ls dev enp0s1.360
4: enp0s1.360@enp0s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether b8:ad:ca:fe:00:05 brd ff:ff:ff:ff:ff:ff
    inet 192.168.104.130/29 brd 192.168.104.135 scope global enp0s1.360
       valid_lft forever preferred_lft forever
    inet6 2001:678:3fc:168:baad:caff:fefe:5/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 2591974sec preferred_lft 604774sec
    inet6 2001:678:3fc:168::82/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::baad:caff:fefe:5/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
    RX:  bytes packets errors dropped  missed   mcast
         227M   38.1k      0       0       0     137
    TX:  bytes packets errors dropped carrier collsns
         5.26M   71.8k      0       0       0       0

On constate que les valeurs ne coïncident pas du tout. En fait, les valeurs annoncées par le système de filtrage correspondent aux nouveaux flux enregistrés dans le système d'enregistrement et de suivi des transactions appelé connection tracking.

Pour que les valeurs affichées avec la commande nft évoluent, il faut que de nouveaux flux réseaux n'ayant pas encore été enregistrés apparaissent.

Q11.

Comment obtenir la liste des enregistrements des transactions traitées par le système de filtrage réseau du routeur Hub ?

Rechercher le paquet qui contient la commande conntrack puis rechercher les options de cette commande qui permettent d'afficher les états des enregistrements.

On ouvre une console sur le routeur Hub de la maquette et on installe le paquet conntrack.

sudo apt -y install conntrack

Ensuite, on utilise l'option -L pour afficher la liste des enregistrements courants. Voici un exemple ponctuel formaté pour les besoins de la copie d'écran.

sudo conntrack -L | fmt -w80
conntrack v1.4.8 (conntrack-tools): 1 flow entries have been shown.
tcp      6 299 ESTABLISHED src=172.16.0.6 dst=192.168.104.130 sport=50376
dport=22 src=192.168.104.130 dst=172.16.0.6 sport=22 dport=50376 [ASSURED]

On identifie les paramètres suivants :

tcp

L'identification du protocole permet de savoir si on a affaire à un service orienté connexion ou pas.

Dans le cas d'un service orienté connexion, on utilise les trois phases d'établissement, de maintien et de libération pour savoir si l'enregistrement d'un flux doit être conservé.

À l'inverse, si le service n'est pas orienté connexion, on utilise des temporisations prédéfinies pour savoir si un enregistrement est périmé.

ESTABLISHED, ASSURED

Ces indicateurs d'état nous informent sur le fait que la communication est dans la phase de maintien et que les échangent sont en cours.

sport, dport

Les couples de numéros de ports source et destination en couche transport ainsi que les couples d'adresses IPv4 en couche réseau nous informent sur les permutations réalisées si le trafic réseau est sortant ou entrant.

Q12.

Comment provoquer de nouveaux enregistrements IPv4 et IPv4 dans le système de suivi des transactions réseau ?

Pour que me scénario soit plus réaliste, on initie de nouvelles transactions depuis les conteneurs hébergés sur un routeur Spoke et on observe les résultats sur le routeur Hub.

On commence par installer le paquet qui contient la commande wget sur chaque conteneur du routeur Spoke utilisé pour les tests.

for i in {0..2}
do
   echo ">>>>>>>>>>>>>>>>> c$i"
   incus exec c$i -- apt -y install wget
done

Toujours sur le même routeur Spoke, on lance une boucle de génération de trafic web. Dans l'exemple ci-dessous, on lance cinq consultations de page web dans chacun des trois conteneurs hébergés.

for i in {0..2}
do
   echo ">>>>>>>>>>>>>>>>> c$i"
   for j in {0..4}
   do
      incus exec c$i -- wget -4 -O /dev/null https://www.iana.org
      sleep 1
   done
done

Sur le routeur Hub, on affiche la liste des enregistrements du système de suivi des transactions. Voici un extrait IPv4 ponctuel non formaté pour afficher correctement les débuts de lignes.

sudo conntrack -f ipv4 -L
tcp      6 16 TIME_WAIT src=10.0.10.10 dst=192.0.46.8 sport=37766 dport=443 src=192.0.46.8 dst=192.168.104.130 sport=443 dport=37766 [ASSURED] mark=0 use=1
tcp      6 21 TIME_WAIT src=10.0.10.10 dst=192.0.46.8 sport=49580 dport=443 src=192.0.46.8 dst=192.168.104.130 sport=443 dport=49580 [ASSURED] mark=0 use=1
udp      17 24 src=10.0.10.10 dst=172.16.0.2 sport=35685 dport=53 src=172.16.0.2 dst=192.168.104.130 sport=53 dport=35685 mark=0 use=1
tcp      6 34 TIME_WAIT src=10.0.10.11 dst=192.0.46.8 sport=56480 dport=443 src=192.0.46.8 dst=192.168.104.130 sport=443 dport=56480 [ASSURED] mark=0 use=1
tcp      6 55 TIME_WAIT src=10.0.10.12 dst=192.0.46.8 sport=41652 dport=443 src=192.0.46.8 dst=192.168.104.130 sport=443 dport=41652 [ASSURED] mark=0 use=1
tcp      6 45 TIME_WAIT src=10.0.10.12 dst=192.0.46.8 sport=55804 dport=443 src=192.0.46.8 dst=192.168.104.130 sport=443 dport=55804 [ASSURED] mark=0 use=1
tcp      6 48 TIME_WAIT src=10.0.10.12 dst=192.0.46.8 sport=55820 dport=443 src=192.0.46.8 dst=192.168.104.130 sport=443 dport=55820 [ASSURED] mark=0 use=1

Dans l'extrait ci-dessus on retrouve :

  • Les adresses IPv4 des trois conteneurs : 10.0.10.10, 10.0.10.11 et 10.0.10.12.

  • L'adresse du site web sur l'Internet : 192.0.46.8

  • L'adresse du routeur Hub sur le réseau d'infrastructure : 192.168.104.130

On lance la même boucle en IPv6 pour afficher les enregistrements propres à ce protocole réseau.

for i in {0..2}
do
   echo ">>>>>>>>>>>>>>>>> c$i"
   for j in {0..4}
   do
      incus exec c$i -- wget -6 -O /dev/null https://www.iana.org
      sleep 1
   done
done

Voici un nouvel extrait de la liste des enregistrements qui montre les trois adresses IPv6 des conteneurs, l'adresse IPv6 du serveur et enfin celle du routeur Hub.

sudo conntrack -f ipv6 -L
sudo conntrack -f ipv6 -L
tcp      6 108 TIME_WAIT src=fda0:7a62:a:0:216:3eff:fe6a:395c dst=2620:0:2830:200::b:8 sport=56654 dport=443 src=2620:0:2830:200::b:8 dst=2001:678:3fc:168:baad:caff:fefe:5 sport=443 dport=56654 [ASSURED] mark=0 use=1
tcp      6 113 TIME_WAIT src=fda0:7a62:a:0:216:3eff:fe6a:395c dst=2620:0:2830:200::b:8 sport=56678 dport=443 src=2620:0:2830:200::b:8 dst=2001:678:3fc:168:baad:caff:fefe:5 sport=443 dport=56678 [ASSURED] mark=0 use=1
tcp      6 110 TIME_WAIT src=fda0:7a62:a:0:216:3eff:fe6a:395c dst=2620:0:2830:200::b:8 sport=56660 dport=443 src=2620:0:2830:200::b:8 dst=2001:678:3fc:168:baad:caff:fefe:5 sport=443 dport=56660 [ASSURED] mark=0 use=1
tcp      6 116 TIME_WAIT src=fda0:7a62:a:0:216:3eff:fe37:f12a dst=2620:0:2830:200::b:8 sport=36964 dport=443 src=2620:0:2830:200::b:8 dst=2001:678:3fc:168:baad:caff:fefe:5 sport=443 dport=36964 [ASSURED] mark=0 use=1
tcp      6 111 TIME_WAIT src=fda0:7a62:a:0:216:3eff:fe6a:395c dst=2620:0:2830:200::b:8 sport=56666 dport=443 src=2620:0:2830:200::b:8 dst=2001:678:3fc:168:baad:caff:fefe:5 sport=443 dport=56666 [ASSURED] mark=0 use=1
tcp      6 98 TIME_WAIT src=fda0:7a62:a:0:216:3eff:fed9:a25b dst=2620:0:2d0:200::b:8 sport=50388 dport=443 src=2620:0:2d0:200::b:8 dst=2001:678:3fc:168:baad:caff:fefe:5 sport=443 dport=50388 [ASSURED] mark=0 use=1
tcp      6 115 TIME_WAIT src=fda0:7a62:a:0:216:3eff:fe6a:395c dst=2620:0:2830:200::b:8 sport=56684 dport=443 src=2620:0:2830:200::b:8 dst=2001:678:3fc:168:baad:caff:fefe:5 sport=443 dport=56684 [ASSURED] mark=0 use=1
tcp      6 96 TIME_WAIT src=fda0:7a62:a:0:216:3eff:fed9:a25b dst=2620:0:2d0:200::b:8 sport=50384 dport=443 src=2620:0:2d0:200::b:8 dst=2001:678:3fc:168:baad:caff:fefe:5 sport=443 dport=50384 [ASSURED] mark=0 use=1
tcp      6 119 FIN_WAIT src=fda0:7a62:a:0:216:3eff:fe37:f12a dst=2620:0:2830:200::b:8 sport=36986 dport=443 src=2620:0:2830:200::b:8 dst=2001:678:3fc:168:baad:caff:fefe:5 sport=443 dport=36986 [ASSURED] mark=0 use=1
tcp      6 118 TIME_WAIT src=fda0:7a62:a:0:216:3eff:fe37:f12a dst=2620:0:2830:200::b:8 sport=36978 dport=443 src=2620:0:2830:200::b:8 dst=2001:678:3fc:168:baad:caff:fefe:5 sport=443 dport=36978 [ASSURED] mark=0 use=1