6. Règles de filtrage sur le routeur Hub

Dans cette section, on doit compléter les règles de filtrage pour répondre à deux objectifs :

  • Le routeur Hub doit autoriser le trafic issu des routeurs Spoke vers l'Internet.

  • Les demandes de connexion aux services Web hébergés sur les conteneurs desservis par les routeurs Spoke doivent être redirigées via la traduction des adresses destination.

    Voici un exemple de correspondances de numéros de ports pour l'accès aux différents services web.

    Tableau 1. Correspondance entre numéro de port et service Web

    numéros de port Hub : http,https conteneur
    8010,8453 10.0.1.10
    fda0:7a62:1:0:216:3eff:feda:e1a
    8011,8454 10.0.1.11
    fda0:7a62:1:0:216:3eff:fec4:d325
    8012,8455 10.0.1.12
    fda0:7a62:1:0:216:3eff:fe66:86fb
    8020,8463 10.0.2.10
    fda0:7a62:2:0:216:3eff:feda:e1a
    8021,8464 10.0.2.11
    fda0:7a62:2:0:216:3eff:fec4:d325
    8022,8465 10.0.2.12
    fda0:7a62:2:0:216:3eff:fe66:86fb

Avant d'aborder les questions, on commence par afficher le contenu des deux fichiers /etc/iptables/rules.v4 et /etc/iptables/rules.v6 qui correspondent à la situation initiale avant de répondre aux objectifs 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
    #~~~~~~~~~~~~ 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 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 FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -p icmp -m limit --limit 2/sec -m conntrack --ctstate NEW -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
    #~~~~~~~~~~~~ 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 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 FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -p ipv6-icmp -m limit --limit 2/sec -j ACCEPT
    COMMIT

Q24.

Comment autoriser et enregistrer dans le mécanisme de suivi des états les flux entrants par les interfaces WAN du routeur Hub ?

Rechercher dans les pages de manuels de la commande iptables le moyen de désigner plusieurs interfaces en une seule règle.

C'est le symbole + qui permet de regrouper les interfaces ppp0 et ppp1 dans une même règle de filtrage.

On ajoute donc les deux règles suivantes sur le routeur Hub.

etu@HubBleu:~$ sudo iptables -A FORWARD -i ppp+ -m conntrack --ctstate NEW -j ACCEPT
etu@HubBleu:~$ sudo ip6tables -A FORWARD -i ppp+ -m conntrack --ctstate NEW -j ACCEPT

Q25.

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 routeur Spoke en utilisant successivement les protocoles IPv4 et IPv6. Ensuite, on relève les enregistrements sur le routeur Hub à 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 Hub.

etu@Spoke2Vert:~$ wget -4 -O /dev/null https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
etu@HubBleu:~$ sudo conntrack -f ipv4 -L
tcp      6 300 ESTABLISHED src=10.47.3.2 dst=151.101.121.176 sport=60962 dport=443 \
                        src=151.101.121.176 dst=10.141.0.162 sport=443 dport=60962 [ASSURED] mark=0 use=2
etu@Spoke2Vert:~$ wget -6 -O /dev/null https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
etu@HubBleu:~$ sudo conntrack -f ipv6 -L
tcp      6 300 ESTABLISHED src=fda0:7a62:2::1 dst=2a04:4e42:1d::432 sport=49156 dport=443 \
                        src=2a04:4e42:1d::432 dst=2001:678:3fc:12c::2 sport=443 dport=49156 [ASSURED] mark=0 use=2

Q26.

Comment implanter les règles de traduction d'adresses IPv4 et IPv6 destination de façon à rendre accessibles les services Web configurés dans les conteneurs situés dans les réseaux desservis par les routeurs Spoke ?

Il faut rechercher la syntaxe des règles de la cible DNAT à appliquer dans la table des règles de traduction d'adresses (nat) ainsi que la syntaxe des règles à ajouter dans la chaîne FORWARD de la table netfilter.

Ces nouvelles règles doivent être conformes au tableau de correspondance donné en début de section. Bien sûr, les adresses doivent être modifiées en fonction du plan d'adressage du document Topologie Hub & Spoke avec le protocole PPPoE.

Comme indiqué dans l'énoncé de la question, l'ajout des règles comprend deux parties : les règles de la table nat et les règles de la table netfilter.

Dans le contexte de la maquette, on a édité les fichiers /etc/iptables/rules.v4 et /etc/iptables/rules.v6.

  • 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
    #~~~~~~~~~~~~ N A T
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8010 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke1C0 -j DNAT --to 10.0.1.10:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8453 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke1C0 -j DNAT --to 10.0.1.10:443
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8011 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke1C1 -j DNAT --to 10.0.1.11:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8454 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke1C1 -j DNAT --to 10.0.1.11:443
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8012 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke1C2 -j DNAT --to 10.0.1.12:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8455 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke1C2 -j DNAT --to 10.0.1.12:443
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8020 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke2C0 -j DNAT --to 10.0.2.10:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8463 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke2C0 -j DNAT --to 10.0.2.10:443
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8021 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke2C1 -j DNAT --to 10.0.2.11:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8464 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke2C1 -j DNAT --to 10.0.2.11:443
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8022 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke2C2 -j DNAT --to 10.0.2.12:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8465 -m conntrack --ctstate NEW \
                    -m comment --comment Spoke2C2 -j DNAT --to 10.0.2.12:443
    -A POSTROUTING -o enp0s2.300 -j MASQUERADE
    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
    -A FORWARD -i ppp+ -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -d 10.0.1.10/32 -p tcp --syn -m multiport --dports 80,443 \
                    -m comment --comment Spoke1C0 -j ACCEPT
    -A FORWARD -d 10.0.1.11/32 -p tcp --syn -m multiport --dports 80,443 \
                    -m comment --comment Spoke1C1 -j ACCEPT
    -A FORWARD -d 10.0.1.12/32 -p tcp --syn -m multiport --dports 80,443 \
                    -m comment --comment Spoke1C2 -j ACCEPT
    -A FORWARD -d 10.0.2.10/32 -p tcp --syn -m multiport --dports 80,443 \
                    -m comment --comment Spoke2C0 -j ACCEPT
    -A FORWARD -d 10.0.2.11/32 -p tcp --syn -m multiport --dports 80,443 \
                    -m comment --comment Spoke2C1 -j ACCEPT
    -A FORWARD -d 10.0.2.12/32 -p tcp --syn -m multiport --dports 80,443 \
                    -m comment --comment Spoke2C2 -j ACCEPT
    COMMIT
  • 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
    #~~~~~~~~~~~~ N A T
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8010 \
                    -m comment --comment Spoke1C0 -j DNAT --to [fda0:7a62:1:0:216:3eff:feda:e1a]:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8453 \
                    -m comment --comment Spoke1C0 -j DNAT --to [fda0:7a62:1:0:216:3eff:feda:e1a]:443
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8011 \
                    -m comment --comment Spoke1C1 -j DNAT --to [fda0:7a62:1:0:216:3eff:fec4:d325]:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8454 \
                    -m comment --comment Spoke1C1 -j DNAT --to [fda0:7a62:1:0:216:3eff:fec4:d325]:443
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8012 \
                    -m comment --comment Spoke1C2 -j DNAT --to [fda0:7a62:1:0:216:3eff:fe66:86fb]:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8455 \
                    -m comment --comment Spoke1C2 -j DNAT --to [fda0:7a62:1:0:216:3eff:fe66:86fb]:443
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8020 \
                    -m comment --comment Spoke2C0 -j DNAT --to [fda0:7a62:2:0:216:3eff:feda:e1a]:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8463 \
                    -m comment --comment Spoke2C0 -j DNAT --to [fda0:7a62:2:0:216:3eff:feda:e1a]:443
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8021 \
                    -m comment --comment Spoke2C1 -j DNAT --to [fda0:7a62:2:0:216:3eff:fec4:d325]:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8464 \
                    -m comment --comment Spoke2C1 -j DNAT --to [fda0:7a62:2:0:216:3eff:fec4:d325]:443
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8022 \
                    -m comment --comment Spoke2C2 -j DNAT --to [fda0:7a62:2:0:216:3eff:fe66:86fb]:80
    -A PREROUTING -i enp0s2.300 -p tcp --syn --dport 8465 \
                    -m comment --comment Spoke2C2 -j DNAT --to [fda0:7a62:2:0:216:3eff:fe66:86fb]:443
    -A POSTROUTING -o enp0s2.300 -j MASQUERADE
    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 INPUT -m limit --limit 1/sec -m conntrack --ctstate INVALID -j DROP
    -A INPUT -m limit --limit 1/sec -j NFLOG
    -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
    -A FORWARD -i ppp+ -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -d fda0:7a62:1:0:216:3eff:feda:e1a/128 -p tcp --syn -m multiport --dports 80,443 \
                    -m conntrack --ctstate NEW -m comment --comment Spoke1C0 -j ACCEPT
    -A FORWARD -d fda0:7a62:1:0:216:3eff:fec4:d325/128 -p tcp --syn -m multiport --dports 80,443 \
                    -m conntrack --ctstate NEW -m comment --comment Spoke1C1 -j ACCEPT
    -A FORWARD -d fda0:7a62:1:0:216:3eff:fe66:86fb/128 -p tcp --syn -m multiport --dports 80,443 \
                    -m conntrack --ctstate NEW -m comment --comment Spoke1C2 -j ACCEPT
    -A FORWARD -d fda0:7a62:2:0:216:3eff:feda:e1a/128 -p tcp --syn -m multiport --dports 80,443 \
                    -m conntrack --ctstate NEW -m comment --comment Spoke2C0 -j ACCEPT
    -A FORWARD -d fda0:7a62:2:0:216:3eff:fec4:d325/128 -p tcp --syn -m multiport --dports 80,443 \
                    -m conntrack --ctstate NEW -m comment --comment Spoke2C1 -j ACCEPT
    -A FORWARD -d fda0:7a62:2:0:216:3eff:fe66:86fb/128 -p tcp --syn -m multiport --dports 80,443 \
                    -m conntrack --ctstate NEW -m comment --comment Spoke2C2 -j ACCEPT
    -A FORWARD -m limit --limit 1/sec -m conntrack --ctstate INVALID -j DROP
    -A FORWARD -m limit --limit 1/sec -j NFLOG
    COMMIT

Pour rétablir les lignes des copies d'écran ci-dessus, il est possible d'utiliser la commande ci-dessous avec laquelle le fichier rules.txt contient les lignes coupées avec le caractère \.

$ sudo sed '/^[ \-].*\\$/N;s/\\\n *//' rules.txt

Comme pour toutes les autres sections, on n'oublie pas de sauvegarder le jeu des règles qui ont été validées.

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