7. Règles de filtrage sur le routeur Spoke

Comme pour la section précédente sur le routeur Hub, on doit compléter le jeu de règles de filtrage pour répondre à deux objectifs :

  • Le routeur Spoke doit autoriser et enregistrer dans la table de suivi d'état les flux réseaux sortants issus du réseau des conteneurs.

  • Ce même routeur Spoke doit autoriser et enregistrer dans la table de suivi d'état les flux réseaux entrants à destination des services Web hébergés par les conteneurs.

On commence par afficher le contenu des deux fichiers /etc/iptables/rules.v4 et /etc/iptables/rules.v6 d'un routeur Spoke qui correspondent à la situation initiale avant de traiter les questions de cette section.

  • Jeu de règles pour le protocole IPv4.

    #~~~~~~~~~~~~ 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 DROP [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p icmp -m limit --limit 2/sec -m conntrack --ctstate NEW -j ACCEPT
    -A INPUT -p tcp --syn --dport 2222 -m conntrack --ctstate NEW -m comment --comment SSH -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
    -A FORWARD -p tcp --syn --dport 2222 -m conntrack --ctstate NEW -m comment --comment SSH -j ACCEPT
    COMMIT
  • Jeu de règles pour le protocole IPv6.

    #~~~~~~~~~~~~ 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 DROP [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -s fe80::/10 -j ACCEPT
    -A INPUT -p ipv6-icmp -m limit --limit 2/sec -j ACCEPT
    -A INPUT -p tcp --syn --dport 2222 -m conntrack --ctstate NEW -m comment --comment SSH -j ACCEPT
    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -p ipv6-icmp -m limit --limit 2/sec -j ACCEPT
    -A FORWARD -p tcp --syn --dport 2222 -m conntrack --ctstate NEW -m comment --comment SSH -j ACCEPT
    COMMIT

Q27.

Comment autoriser et enregistrer dans le mécanisme de suivi des états les flux sortants par l'interface WAN du routeur Spoke ?

Rechercher dans les pages de manuels de la commande iptables le moyen de désigner une interface ainsi que le sens des flux qui transitent par cette interface.

C'est la directive -o qui permet de désigner les flux sortants par l'intreface ppp0.

On ajoute donc les deux règles suivantes sur les routeurs Spoke.

etu@Spoke2Vert:~$ sudo iptables -A FORWARD -o ppp0 -m conntrack --ctstate NEW -j ACCEPT
etu@Spoke2Vert:~$ sudo ip6tables -A FORWARD -o ppp0 -m conntrack --ctstate NEW -j ACCEPT

Q28.

Comment valider l'utilisation de ces deux nouvelles règles à partir d'un routeur Spoke ?

Il suffit de lancer un téléchargement depuis un conteneur desservi par le routeur Spoke en utilisant successivement les protocoles IPv4 et IPv6. Ensuite, on relève les enregistrements sur le même routeur Spoke à l'aide de la commande conntrack.

Voici un exemple de relevé avec un téléchargement suffisamment volumineux pour collecter la liste des entrées de suivi d'état sur le routeur Spoke.

On commence par s'assurer que le paquet wget est bien installé sur le conteneur depuis lequel on effectue le test.

etu@Spoke2Vert:~$ lxc exec container0 -- apt install wget

On passe ensuite au téléchargement et au relevé de la table de suivi d'état.

etu@Spoke2Vert:~$ lxc exec container0 -- \
                wget -4 -O /dev/null https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
etu@Spoke2Vert:~$ sudo conntrack -f ipv4 -L
tcp      6 2 CLOSE src=10.0.2.10 dst=151.101.113.176 sport=59888 dport=443 \
                                src=151.101.113.176 dst=10.0.2.10 sport=443 dport=59888 [ASSURED] mark=0 use=1
etu@Spoke2Vert:~$ lxc exec container0 -- \
                wget -6 -O /dev/null https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
etu@Spoke2Vert:~$ sudo conntrack -f ipv6 -L
tcp      6 300 ESTABLISHED src=fda0:7a62:2:0:216:3eff:feda:e1a dst=2a04:4e42:3::432 sport=38384 dport=443 \
                                src=2a04:4e42:3::432 dst=fda0:7a62:2:0:216:3eff:feda:e1a sport=443 dport=38384 [ASSURED] mark=0 use=1

Q29.

Comment autoriser les flux Web entrants par l'interface WAN vers les conteneurs ?

Rechercher dans les options de la commande iptables celles qui permettent de désigner les interfaces d'entrée et de sortie ainsi que les numéros de ports associés au service Web.

Les options utiles pour les interfaces sont -i pour l'entrée et -o pour la sortie. Les numéros de ports 80 et 443 sont regroupés avec le module multiport.

Voici un exemple des deux règles à ajouter.

etu@Spoke2Vert:~$ sudo iptables -A FORWARD -i ppp0 -o sw-vlan2 \
                -p tcp --syn -m multiport --dports 80,443 -m conntrack --ctstate NEW -j ACCEPT
etu@Spoke2Vert:~$ sudo ip6tables -A FORWARD -i ppp0 -o sw-vlan2 \
                -p tcp --syn -m multiport --dports 80,443 -m conntrack --ctstate NEW -j ACCEPT

Q30.

Comment valider l'utilisation des deux règles ajoutées dans la question précédente ?

Reprendre, depuis le routeur Hub, l'utilsation de la commande wget telle qu'elle a été présentée dans la section Routeurs Spoke du support Topologie Hub & Spoke avec le protocole PPPoE.

Voici un exemple des résultats obtenus sur le routeur Hub de la maquette. Le code HTTP 200 montre que la requête a bien été traitée par le serveur Web de chaque conteneur.

etu@HubBleu:~$ for addr in 10.0.2.10 10.0.2.11 10.0.2.12;\
                do sh -c "wget -O /dev/null http://$addr 2>&1 | grep \"HTTP\" "; done
requête HTTP transmise, en attente de la réponse… 200 OK
requête HTTP transmise, en attente de la réponse… 200 OK
requête HTTP transmise, en attente de la réponse… 200 OK
etu@HubBleu:~$ for addr in fda0:7a62:2:0:216:3eff:feda:e1a \
                fda0:7a62:2:0:216:3eff:fec4:d325 \
                fda0:7a62:2:0:216:3eff:fe66:86fb; \
                do sh -c "wget -O /dev/null http://[$addr] 2>&1 | grep \"HTTP\" "; done
requête HTTP transmise, en attente de la réponse… 200 OK
requête HTTP transmise, en attente de la réponse… 200 OK
requête HTTP transmise, en attente de la réponse… 200 OK

On se place ensuite sur le routeur Spoke pour relever les compteurs des règles de filtrage.

etu@Spoke2Vert:~$ sudo iptables -vL FORWARD | grep http
    6   360 ACCEPT     tcp  --  ppp0   sw-vlan2  anywhere  anywhere \
                                tcp flags:FIN,SYN,RST,ACK/SYN multiport dports http,https ctstate NEW
etu@Spoke2Vert:~$ sudo ip6tables -vL FORWARD | grep http
    3   240 ACCEPT     tcp      ppp0   sw-vlan2  anywhere  anywhere \
                                tcp flags:FIN,SYN,RST,ACK/SYN multiport dports http,https ctstate NEW