4. Protection de base des routeurs Hub et Spoke

Le but de cette section est de mettre en place le routage avant de passer aux fonctions de filtrage réseau proprement dites. Elle correspond à la vue Topologie PPP et routage.

Voici une liste de fonctions de protection à mettre en œuvre sur tous les types de routeurs.

Protection contre l'usurpation des adresses sources, rpfilter, BCP38

Ces fonctions de protection comprennent une partie noyau ainsi qu'une partie filtrage avec le module rpfilter à implanter dans la table raw qui assure un filtrage sans état. Voir Network Ingress Filtering: Defeating Denial of Service Attacks which employ IP Source Address Spoofing.

Les tests de validation de ces mécanismes peuvent se faire à l'aide de la commande hping3. Les résultats doivent être visibles aussi bien dans les journaux systèmes que sur les compteurs des règles de la table raw. En avant pour la chasse aux martiens !

Protection contre les dénis de services ICMP, module netfilter limit

Les routeurs doivent s'assurer que le volume de trafic qui est présenté en entrée est compatible avec un fonctionnement nominal des services.

Protection contre les robots de connexion au service SSH, fail2ban

Les routeurs ont besoin d'un accès d'administration à distance via SSH. Pour autant, cet accès doit être protégé contre les tentatives d'intrusion par dictionnaire de couples d'authentifiants.

L'outil fail2ban fourni avec le paquet du même nom introduit une chaîne de filtrage dédiée à ces tentatives d'intrusion.

4.1. Protection contre l'usurpation d'adresse source

Q7.

Comment afficher la liste des règles de filtrage de la table raw dédiée au filtrage sans état (stateless) ?

Rechercher dans les pages de manuels de la commande iptables les options relatives aux listes et aux compteurs.

La visualisation des compteurs de correspondance des règles de filtrage est indispensable pour qualifier le fonctionnement du filtrage

C'est l'option -L qui permet l'affichage des listes.

C'est l'option -v qui permet d'obtenir les valeurs des compteurs de correspondance avec chaque règle.

Voici un exemple dans le contexte de la maquette sur le routeur Spoke1Vert. Une règle a déjà été insérée dans la table raw. Elle permet de visualiser les compteurs de correspondance qui montrent que la règle a bien été utilisée.

etu@Spoke1Vert:~$ sudo iptables -vL -t raw
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain PREROUTING (policy ACCEPT 112K packets, 113M bytes)
 pkts bytes target     prot opt in     out     source       destination
   60  4996 DROP       all  --  any    any     anywhere     anywhere  rpfilter invert /* BCP38 */

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

Q8.

Comment activer la protection contre l'usurpation des adresses sources au niveau du noyau ?

Rechercher les informations relatives à la fonction Reverse Path Forwarding du noyau Linux. Identifier les rôles des 3 valeurs possibles de cette fonction.

La documentation est à cette adresse : Kernel IP sysctl.

Le fichier de configuration principal /etc/sysctl.conf dispose de plusieurs entrées relatives à cette fonction. Voici un extrait dans le contexte de la maquette.

$ grep rp_filter /etc/sysctl.conf
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1

Voici la liste des valeurs actives au moment de l'exécution de la commande.

etu@Spoke1Vert:~$ sudo sysctl -ar '\.rp_filter'
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.asw-host.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.enp0s2.rp_filter = 1
net.ipv4.conf.enp0s2/470.rp_filter = 1
net.ipv4.conf.enp0s2/471.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.ovs-system.rp_filter = 1
net.ipv4.conf.ppp0.rp_filter = 1
net.ipv4.conf.sw-vlan1.rp_filter = 1
net.ipv4.conf.veth52dfe1cc.rp_filter = 1
net.ipv4.conf.veth73d0058f.rp_filter = 1
net.ipv4.conf.vethc394c229.rp_filter = 1

Voici l'extrait de la documentation officielle qui donne les explications sur les 3 valeurs possibles du paramètre rp_filter.

rp_filter - INTEGER
        0 - No source validation.
        1 - Strict mode as defined in RFC3704 Strict Reverse Path
            Each incoming packet is tested against the FIB and if the interface
            is not the best reverse path the packet check will fail.
            By default failed packets are discarded.
        2 - Loose mode as defined in RFC3704 Loose Reverse Path
            Each incoming packet's source address is also tested against the FIB
            and if the source address is not reachable via any interface
            the packet check will fail.

        Current recommended practice in RFC3704 is to enable strict mode
        to prevent IP spoofing from DDos attacks. If using asymmetric routing
        or other complicated routing, then loose mode is recommended.

        The max value from conf/{all,interface}/rp_filter is used
        when doing source validation on the {interface}.

        Default value is 0. Note that some distributions enable it
        in startup scripts.

Q9.

Comment enregistrer les tentatives d'usurpation d'adresses dans les journaux système ?

Rechercher les entrées de l'arborescence /proc relatives aux paquets “martiens“.

Rechercher aussi le paramètre relatifs aux “martiens“ dans le fichier /etc/sysctl.conf.

On a activé la “journalisation des martiens“ en éditant le fichier /etc/sysctl.conf.

$ grep martians /etc/sysctl.conf
net.ipv4.conf.all.log_martians = 1

On vérifie que le paramètre est bien actif sur le système.

$ sudo sysctl -ar 'all.*martians'
net.ipv4.conf.all.log_martians = 1

Si ce n'est pas le cas, il ne faut pas oublier de parcourir à nouveau les fichiers de paramètres à l'aide de la commande sysctl.

$ sudo sysctl --system

Q10.

Comment valider la fonction de blocage des tentatives d'usurpation d'adresses entre le routeur Hub et les routeurs Spoke ?

Installer le paquet hping3 sur le routeur Hub.

Rechercher dans les pages de manuels de la commande hping3 les options qui permettent de générer du trafic ICMP avec des adresses source aléatoires à destination d'un conteneur hébergé sur un routeur Spoke.

Voici un premier exemple de test effectué sur le routeur Hub dans le contexte de la maquette.

L'option -a désigne l'adresse IPv4 source usurpée tandis que l'adresse en bout de ligne désigne la destination. Ici, on cherche à contacter un conteneur avec l'adresse source d'un conteneur voisin en étant placé “à l'extérieur“ du VLAN vert.

etu@HubBleu:~$ sudo hping3 -1 -a 10.0.2.12 --fast -c 10 10.0.2.11
HPING 10.0.2.11 (ppp0 10.0.2.11): icmp mode set, 28 headers + 0 data bytes

--- 10.0.2.11 hping statistic ---
10 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

Côté routeur Spoke, on peut consulter les traces des tentatives d'usurpation d'adresses à l'aide de la commande suivante.

etu@Spoke2Vert:~$ grep martian /var/log/kern.log

Il est aussi possible de lancer un test avec une série d'adresses IP source aléatoires. Voici un exemple de commande qui provoquera un nombre de blocages aléatoire en fonction des correspondances.

etu@HubBleu:~$ sudo hping3 -1 --rand-source --fast -c 100 10.0.1.11

Q11.

Comment filtrer les tentatives d'usurpation d'adresses source au plus tôt de façon à limiter le coût de traitement de ces paquets falsifiés sur le système ?

Identifier le nom de la table de filtrage sans état et rechercher la fonction associée au filtrage des adresses sources usurpées. Rechercher dans les pages de manuels iptables-extensions les informations relatives au module rpfilter.

Ajouter une règle spécifique dans la table de traitement sans état pour les protocoles IPv4 et IPv6.

La table de filtrage sans état est appelée : raw. Après consultation des exemples donnés dans les pages de manuels, on aboutit aux deux règles suivantes que l'on applique sur les routeurs Spoke.

$ sudo iptables -t raw -A PREROUTING -m rpfilter --invert -m comment --comment "BCP38" -j DROP
$ sudo ip6tables -t raw -A PREROUTING -m rpfilter --invert -m comment --comment "BCP38" -j DROP

On peut ensuite sauvegarder ces règles dans les fichiers systèmes utilisés par le service iptables-persistent.

$ sudo sh -c "iptables-save >/etc/iptables/rules.v4"
$ sudo sh -c "ip6tables-save >/etc/iptables/rules.v6"

Q12.

Comment caractériser les nouvelles règles de filtrage entre le routeur Hub et les routeurs Spoke ?

Pour les tests IPv4, il suffit de reprendre les mêmes tests que ceux effectués plus haut avec la commande hping3.

Installer le paquet thc-ipv6 sur le routeur Hub pour disposer des outils de tests spécifiques au protocole IPv6.

Rechercher dans les pages de manuels de la commande atk6-thcping6 les options qui permettent de générer du trafic ICMP avec une adresse source falsifiée à destination d'un conteneur hébergé sur un routeur Spoke.

Dans le contexte de la maquette, les requêtes falsifiées sont émises depuis le routeur HubBleu à destination du routeur Spoke1Vert sur lequel les règles de filtrage IPv4 et IPv6 ont été implantées.

  • Pour le protocole IPv4, on reprend la commande hping3 avec les mêmes paramètres de dans la question sur la protection au niveau du noyau Linux et on relève le compteur des paquets “jetés“ sur le routeur Spoke.

    etu@HubBleu:~$ sudo hping3 -1 -a 10.0.2.12 --fast -c 100 10.0.2.11
    HPING 10.0.2.11 (ppp1 10.0.2.11): icmp mode set, 28 headers + 0 data bytes
    
    --- 10.0.2.11 hping statistic ---
    100 packets transmitted, 0 packets received, 100% packet loss
    round-trip min/avg/max = 0.0/0.0/0.0 ms
    etu@Spoke1Vert:~$ sudo iptables -vL -t raw
    # Warning: iptables-legacy tables present, use iptables-legacy to see them
    Chain PREROUTING (policy ACCEPT 393K packets, 457M bytes)
     pkts bytes target     prot opt in     out     source    destination
       71  5304 DROP       all  --  any    any     anywhere  anywhere   rpfilter invert /* BCP38 */
    
    Chain OUTPUT (policy ACCEPT 94964 packets, 5522K bytes)
     pkts bytes target     prot opt in     out     source    destination
  • Pour le protocole IPv6, on utilise la commande atk6-thcping6 avec l'adresse d'un conteneur comme source et l'adresse du routeur Spoke dans le VLAN supervision (violet) comme destination.

    etu@HubBleu:~$ sudo atk6-thcping6 -n 10 enp0s2.470 fda0:7a62:1:0:216:3eff:feda:e1a fe80:1d6::2
    0000.000        ping packet sent to fe80:1d6::2
    0000.000        ping packet sent to fe80:1d6::2
    0000.000        ping packet sent to fe80:1d6::2
    0000.000        ping packet sent to fe80:1d6::2
    0000.000        ping packet sent to fe80:1d6::2
    0000.000        ping packet sent to fe80:1d6::2
    0000.000        ping packet sent to fe80:1d6::2
    *** buffer overflow detected ***: terminated
    Abandon
    etu@Spoke1Vert:~$ sudo ip6tables -vL -t raw
    # Warning: ip6tables-legacy tables present, use ip6tables-legacy to see them
    Chain PREROUTING (policy ACCEPT 37580 packets, 6219K bytes)
     pkts bytes target     prot opt in     out     source     destination
       14   784 DROP       all      any    any     anywhere   anywhere     rpfilter invert /* BCP38 */
    
    Chain OUTPUT (policy ACCEPT 7599 packets, 1505K bytes)
     pkts bytes target     prot opt in     out     source     destination

4.2. Protection contre les dénis de service ICMP

Q13.

Comment peut-on se protéger contre un nombre de sollicitations ICMP trop important ?

Rechercher dans le guide Tutoriel iptables la correspondance Limit qui permet de définir un seuil au delà duquel les nouveaux flux réseau ne sont plus acceptés.

Il faut ajouter une règle spécifique au protocole ICMP après celle qui assure le traitement des flux déjà enregistrés dans les tables de suivi d'état (Stateful).

Dans le contexte de la maquette, les nouvelles règles de filtrage sont appliquées sur le routeur Spoke2Vert et le trafic “malveillant“ est généré sur le routeur HubBleu à destination des conteneurs du réseau local du site distant.

On commence par afficher la liste des règles de la table par défaut appelée netfilter de façon à vérifier si la règle générale de suivi des enregistrements est présente ou non dans les chaînes INPUT et FORWARD.

Dans la copie d'écran ci-dessous, on constate qu'aucune règle de filtrage n'a été appliquée au moment du test.

etu@Spoke2Vert:~$ sudo iptables -vL
# Warning: iptables-legacy tables present, use iptables-legacy to see them
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

Le résultat de la commande sudo ip6tables -vL doit être identique à la copie d'écran ci-dessus.

On ajoute les deux règles générales de suivi des conversations en premier dans les chaînes INPUT et FORWARD pour le protocole IPv4.

etu@Spoke2Vert:~$ sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
etu@Spoke2Vert:~$ sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
etu@Spoke2Vert:~$ sudo iptables -vL
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source      destination
    0     0 ACCEPT     all  --  any    any     anywhere    anywhere     ctstate RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source      destination
    0     0 ACCEPT     all  --  any    any     anywhere    anywhere     ctstate RELATED,ESTABLISHED

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

On ajoute aussi deux règles identiques pour le protocole IPv6.

etu@Spoke2Vert:~$ sudo ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
etu@Spoke2Vert:~$ sudo ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Maintenant que le trafic relatif ou appartenant à un flux enregistré dans la table de suivi d'état est accepté, nous pouvons définir les conditions dans lesquelles un nouveau flux entre de le système de suivi d'état. Ici, on s'intéresse au protocole ICMP et au module Limit. Voici un exemple de règle qui restreint le trafic ICMP à 2 nouvelles entrées par seconde sur les chaînes INPUT et FORWARD.

  • Pour le protocole IPv4.

    etu@Spoke2Vert:~$ sudo iptables -A INPUT -p icmp -m limit --limit 2/sec -m conntrack --ctstate NEW -j ACCEPT
    etu@Spoke2Vert:~$ sudo iptables -A FORWARD -p icmp -m limit --limit 2/sec -m conntrack --ctstate NEW -j ACCEPT
  • Pour le protocole IPv6.

    etu@Spoke2Vert:~$ sudo ip6tables -A INPUT -p ipv6-icmp -m limit --limit 2/sec -j ACCEPT
    etu@Spoke2Vert:~$ sudo ip6tables -A FORWARD -p ipv6-icmp -m limit --limit 2/sec -j ACCEPT

Q14.

Comment qualifier le fonctionnement des règles de limitation du nombre de nouvelles requêtes ICMP ?

Rechercher les options de la commande hping3 qui permettent de générer des flux ICMP en utilisant des adresses IPv4 source aléatoires.

Attention ! Il faut positionner la politique par défaut en mode "tout ce qui n'est pas autorisé est interdit“ sur le routeur cible le temps du test de qualification.

On rappelle que dans le contexte de la maquette, les règles de filtrage sont appliquées sur le routeur Spoke2Vert et le trafic “malveillant“ est généré sur le routeur HubBleu à destination des conteneurs du réseau local du site distant.

  • On commence par modifier la politique par défaut dans la chaîne FORWARD sur le routeur Spoke2Vert.

    $ sudo iptables -P FORWARD DROP
    $ sudo ip6tables -P FORWARD DROP
  • On lance la génération de trafic ICMP à partir du routeur HubBleu. Dans l'exemple ci-dessous, ce sont 100 paquets ICMP echo-request qui sont envoyés avec une adresse IPv4 source aléatoire à destination du conteneur 10.0.2.11.

    etu@HubBleu:~$ sudo hping3 -1 --rand-source --fast -c 100 10.0.2.11

    À la fin de l'émission, les résultats montrent que 76% des 100 requêtes ont été rejetées.

    --- 10.0.2.11 hping statistic ---
    100 packets transmitted, 24 packets received, 76% packet loss
    round-trip min/avg/max = 1.1/5.0/9.3 ms
  • On se place sur le routeur Spoke2Vert et on affiche la liste des règles de la chaîne FORWARD avec les compteurs de paquets.

    etu@Spoke2Vert:~$ sudo iptables -vL FORWARD
    # Warning: iptables-legacy tables present, use iptables-legacy to see them
    Chain FORWARD (policy DROP 127 packets, 3556 bytes)
     pkts bytes target     prot opt in     out     source     destination
      143  4004 ACCEPT     all  --  any    any     anywhere   anywhere     ctstate RELATED,ESTABLISHED
       72  2016 ACCEPT     icmp --  any    any     anywhere   anywhere     limit: avg 2/sec burst 5 ctstate NEW

    Cet échantillon montre que 127 paquets ont été mis à la poubelle et non routés jusqu'au conteneur.

  • Comme le jeu de règles sur le routeur Spoke2Vert est trop restreint pour être acceptable par les conteneurs, on replace la politique par défaut à ACCEPT sur la chaîne FORWARD.

    $ sudo iptables -P FORWARD ACCEPT
    $ sudo ip6tables -P FORWARD ACCEPT

4.3. Protection contre les robots de connexion au service SSH

Q15.

Quel est la fonction du paquet fail2ban ?

Afficher la description du paquet fail2ban après l'avoir installé.

apt install fail2ban
aptitude show fail2ban | grep -A2 Desc | fmt -t -w80
Description : ban hosts that cause multiple authentication errors Fail2ban
 monitors log files (e.g. /var/log/auth.log, /var/log/apache/access.log)
 and temporarily or persistently bans failure-prone addresses by updating
 existing firewall rules.  Fail2ban allows easy specification of different
 actions to be taken such as to ban an IP using iptables or hostsdeny rules,
 or simply to send a notification email.

Le rôle du service fail2ban est de repérer les erreurs d'authentification dans les journaux des différents services actifs et de créer une chaîne iptables qui bloque les tentatives de connexion suivantes.

Q16.

Quel est le numéro de port utilisé par le service SSH sur les routeurs ?

Il est important de connaître les caractéristiques du service qui doit être surveillé par fail2ban. Rechercher dans la liste des ports réseau ouverts celui qui concerne le service SSH.

Dans le contexte de la maquette, le service SSH a été paramétré pour utiliser le port numéro 2222. On obtient la liste des ports en écoute avec les commandes lsof ou ss.

$ sudo lsof -i tcp:2222 -sTCP:listen
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    43975 root    3u  IPv4 7613072      0t0  TCP *:2222 (LISTEN)
sshd    43975 root    4u  IPv6 7613074      0t0  TCP *:2222 (LISTEN)
$ ss -tapl '( sport = :2222 )' | fmt -t -w80
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:2222      0.0.0.0:*
LISTEN 0      128             [::]:2222         [::]:*

Ce sont donc les tentatives de connexion au service SSH sur le port numéro 2222 que le service fail2ban doit surveiller.

Q17.

Quel est le fichier de configuration du service SSH qui permet de définir le numéro de port en écoute avec le protocole TCP ?

Repérer le répertoire qui contient les éléments de configuration du service SSH.

C'est le fichier /etc/ssh/sshd_config qui contient les paramètres du serveur. Dans le cas de ces manipulations, on a décommenté la ligne avec le mot clé Port.

$ grep ^Port /etc/ssh/sshd_config
Port 2222

Attention ! Si on édite ce fichier de configuration, les modifications ne sont prises en compte qu'au redémarrage du service via la commande sudo systemctl restart ssh.

Q18.

Quels sont les deux fichiers de configuration principaux fournis à l'installation du paquet fail2ban ?

Rechercher dans l'arborescence des fichiers de configuration, les informations relatives aux traitements assurés en cas de détection d'erreurs de connexion à n'importe quel service, puis les informations spécifiques au service SSH.

Dans le répertoire /etc/fail2ban, on identifie les deux fichiers demandés.

  • Le fichier /etc/fail2ban/jail.conf donne la liste des paramètres par défaut en cas de détection de tentatives de connexions en erreur. Voici une extraction des premiers paramètres généraux. Ici, le temps de maintien d'une adresse source en prison (bantime) est de 10 minutes mais ce temps est multiplié par deux en cas de récidive.

    etu@Spoke1Vert:~$ sed -n '/^\[DEF/,/fail2ban_agent/p' /etc/fail2ban/jail.conf | egrep -v '(^#|^$)'
    [DEFAULT]
    bantime.increment = true
    bantime.factor = 2
    ignoreself = true
    ignorecommand =
    bantime  = 10m
    findtime  = 10m
    maxretry = 5
    maxmatches = %(maxretry)s
    backend = systemd
    usedns = warn
    logencoding = auto
    enabled = false
    mode = normal
    filter = %(name)s[mode=%(mode)s]
    destemail = root@localhost
    sender = root@<fq-hostname>
    mta = sendmail
    protocol = tcp
    chain = <known/chain>
    port = 0:65535
    fail2ban_agent = Fail2Ban/%(fail2ban_version)s
  • Le fichier /etc/fail2ban/jail.d/defaults-debian.conf contient les paramètres par défaut pour la distribution avec une section spécifique au service SSH. C'est ce fichier que l'on édite pour l'adapter ua contexte des routeurs de la topologie. On spécifie le numéro de port identifié dans les questions précédentes ainsi qu'un traitement particulier. Voici un exemple de configuration appliqué à la maquette.

    [sshd]
    enabled = true
    filter  = sshd
    action = %(action_)s
    maxretry = 3
    banaction = iptables-new

    Là encore, les modifications effectuées sur la configuration ne sont prises en compte qu'au redémarrage du service : sudo systemctl restart fail2ban.

Q19.

Comment caractériser le fonctionnement du service fail2ban ?

Si le service a été installé et configuré sur un routeur Spoke, il est possible de lancer plusieurs tentatives de connexion SSH depuis le routeur Hub en se trompant de mot de passe.

On peut alors afficher les règles de filtrage iptables et consulter l'état de la prison fail2ban.

On commence par lancer plusieurs tentatives (au moins 3) de connexion SSH à partir du routeur Hub.

etu@HubBleu:~$ ssh -p 2222 etu@10.47.1.2
etu@10.47.1.2's password:
Permission denied, please try again.
etu@10.47.1.2's password:
Permission denied, please try again.
etu@10.47.1.2's password:
etu@10.47.1.2: Permission denied (publickey,password).
etu@HubBleu:~$ ssh -p 2222 etu@10.47.1.2
ssh: connect to host 10.47.1.2 port 2222: Connection refused

On relève ensuite les résultats côté routeur Spoke.

La liste des règles de filtrage montre qu'une nouvelle chaîne a été ajoutée. Dans cette chaîne, on reconnaît l'adresse IPv4 du lien PPP côté Hub.

etu@Spoke1Vert:~$ sudo iptables -vL
Chain INPUT (policy ACCEPT 335K packets, 401M bytes)
 pkts bytes target     prot opt in     out     source      destination
    2   120 f2b-sshd   tcp  --  any    any     anywhere    anywhere   state NEW tcp dpt:2222

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

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

Chain f2b-sshd (1 references)
 pkts bytes target     prot opt in     out     source      destination
    2   120 REJECT     all  --  any    any     10.47.1.1   anywhere   reject-with icmp-port-unreachable
    0     0 RETURN     all  --  any    any     anywhere    anywhere

Toujours sur le routeur Spoke, on relève l'état du service fail2ban et plus particulièrement celui de la "prison" spécifique au protocole SSH.

etu@Spoke1Vert:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     3
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   10.47.1.1

Enfin, on répète l'opération avec l'adresse IPv6 du routeur Spoke sur le lien PPP.

etu@HubBleu:~$ ssh -p 2222 fe80::5c93:b536:53e7:f976%ppp0
etu@fe80::5c93:b536:53e7:f976%ppp0's password:
Permission denied, please try again.
etu@fe80::5c93:b536:53e7:f976%ppp0's password:
Permission denied, please try again.
etu@fe80::5c93:b536:53e7:f976%ppp0's password:
etu@fe80::5c93:b536:53e7:f976%ppp0: Permission denied (publickey,password).
etu@HubBleu:~$ ssh -p 2222 fe80::5c93:b536:53e7:f976%ppp0
ssh: connect to host fe80::5c93:b536:53e7:f976%ppp0 port 2222: Connection refused

On voit apparaître une nouvelle adresse dans la liste sur le routeur Spoke.

etu@Spoke1Vert:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     7
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 2
   |- Total banned:     2
   `- Banned IP list:   10.47.1.1 fe80::490a:39d4:1a05:f33d

Les règles de filtrage pour le protocole IPv6 ont aussi été complétées.

etu@Spoke1Vert:~$ sudo ip6tables -vL
# Warning: ip6tables-legacy tables present, use ip6tables-legacy to see them
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source    destination
    3   240 f2b-sshd   tcp      any    any     anywhere  anywhere     state NEW tcp dpt:2222

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

Chain f2b-sshd (1 references)
 pkts bytes target     prot opt in     out     source    destination
    2   160 REJECT     all      any    any     fe80::490a:39d4:1a05:f33d  anywhere   reject-with icmp6-port-unreachable
    1    80 RETURN     all      any    any     anywhere  anywhere