🔧 Rapport d’intervention – Configuration rĂ©seau, pare-feu et sĂ©curitĂ© Fail2Ban

Distribution : Debian 11 Bullseye
Services principaux : Docker, Fail2Ban, nftables
Objectif : Corriger les problĂšmes de connectivitĂ© des conteneurs, assurer une configuration cohĂ©rente et moderne du pare-feu, Ă©liminer les rĂ©sidus d’iptables, et s’assurer du bon fonctionnement de Fail2Ban.


🔍 1. Diagnostic initial

đŸ”č PrĂ©sence d'iptables sans rĂšgles effectives

                sudo iptables -L

              

➀ Les chaĂźnes INPUT, FORWARD et OUTPUT Ă©taient toutes sur ACCEPT, sans rĂšgle — donc iptables n'Ă©tait plus en usage actif.

đŸ”č Fail2Ban installĂ©, configurĂ© pour nftables, mais comportant des erreurs

  • banaction = nftables-multiport Ă©tait bien dĂ©fini.

  • Cependant, au dĂ©marrage :

                        ERROR No section: 'Definition'
    
                      

    causé par certains fichiers dans /etc/fail2ban/action.d/*.conf dépourvus de section [Definition] :

                        helpers-common.conf
    firewallcmd-common.conf
    smtp.py
    nftables.conf
    badips.py
    mail-whois-common.conf
    
                      

Ces fichiers ont été inspectés mais non supprimés, car certains sont appelés en tant que dépendance par d'autres actions, ou hérités de paquets tiers.


đŸ§± 2. Consolidation du pare-feu : nftables

❌ Ancienne situation

  • Aucun ruleset actif autre que celui temporairement injectĂ© par fail2ban.

  • Docker injecte ses propres rĂšgles via iptables, ce qui est non compatible avec un pare-feu nftables actif sans pont avec iptables.

✅ Nouvelle configuration

Un fichier /etc/nftables.conf a été mis en place avec le contenu suivant :

                #!/usr/sbin/nft -f

flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;

    ct state established,related accept
    iifname "lo" accept
    tcp dport 22 ct state new accept
    tcp dport {80, 443} ct state new accept
    ip protocol icmp icmp type echo-request accept

    counter log prefix "[nftables] INPUT DROP: " flags all level warn
    reject
  }

  chain forward {
    type filter hook forward priority 0; policy drop;

    iifname "br-+" oifname "eth0" ct state new,established,related accept
    iifname "eth0" oifname "br-+" ct state established,related accept

    counter log prefix "[nftables] FORWARD DROP: " flags all level warn
    reject
  }

  chain output {
    type filter hook output priority 0; policy accept;
  }
}

table ip nat {
  chain postrouting {
    type nat hook postrouting priority 100; policy accept;

    ip saddr 172.17.0.0/16 oifname "eth0" masquerade
    ip saddr 172.18.0.0/16 oifname "eth0" masquerade
  }
}

              

đŸ›Ąïž Journalisation active

  • Ajout de compteurs counter avec log dans les chaĂźnes input et forward :

    • PrĂ©fixes personnalisĂ©s : [nftables] INPUT DROP: et [nftables] FORWARD DROP:

    • Niveau : warn pour Ă©viter de polluer les logs systĂšme avec trop de bruit tout en conservant une traçabilitĂ© exploitable.

    • But : Permet de repĂ©rer les paquets rejetĂ©s et d’ajuster les rĂšgles si besoin.


🐳 3. Docker et l’accĂšs rĂ©seau

ProblÚme constaté

  • Conteneurs ne pouvaient pas atteindre Internet :

                        curl -I https://google.com → Failed to connect
    ping 8.8.8.8 → Destination Port Unreachable
    
                      
  • Les paquets sortants ne quittaient mĂȘme pas l’interface eth0 (tcpdump confirmĂ©).

Analyse technique

  • Le NAT (masquerade) Ă©tait bien dĂ©fini mais les rĂšgles forward bloquaient le routage des conteneurs vers Internet.

  • La rĂšgle manquante : iifname "br-+" oifname "eth0" ct state new,established,related accept

Une fois corrigĂ© et appliquĂ©, les conteneurs ont regagnĂ© l’accĂšs au rĂ©seau public :

                docker exec erplibre-ERPLibre-1 ping -c 3 8.8.8.8 → OK
docker exec erplibre-ERPLibre-1 curl -I https://google.com → OK

              

🧯 4. Services et dĂ©marrage automatique

  • nftables vĂ©rifiĂ© : activĂ© au dĂ©marrage

                        systemctl enable nftables
    systemctl status nftables
    
                      
  • fail2ban : aussi activĂ©

                        systemctl enable fail2ban
    systemctl status fail2ban
    
                      
  • VĂ©rification de la prĂ©sence de iptables-persistent : non installĂ©
    Aucune trace de résidus ufw, shorewall, firewalld.

  • iptables laissĂ© installĂ© mais non utilisĂ© — aucune rĂšgle ni dĂ©mon actif.


đŸ§Ș 5. Tests de validation

Test Résultat
nft list ruleset ✅ Affiche bien les trois tables (filter, nat, f2b-table)
Connexion SSH, HTTP/HTTPS depuis Internet ✅ Fonctionnel
Ping du serveur vers l’extĂ©rieur ✅ OK (ICMP autorisĂ©)
Ping depuis un conteneur Docker ✅ OK
RĂ©solution DNS dans un conteneur Docker ✅ OK
Rejet et journalisation d’un port non autorisĂ© ✅ ConfirmĂ© dans les logs
fail2ban-client status ✅ 10 prisons actives, aucune erreur

✅ RĂ©sumĂ© des corrections

ProblÚme détecté Correction apportée
Connexions bloquées dans Docker RÚgles forward et nat ajoutées
Pas de journalisation pare-feu RÚgles log + counter insérées
Redondance iptables/nftables Nettoyage logique, vérification des dépendances
Erreurs Fail2Ban au démarrage Audit de action.d, rÚgles banaction corrigées
Docker bridge non pris en compte RĂšgles avec wildcard br-+ dans nftables
AccĂšs sortant NAT manquant Ajout des rĂšgles masquerade ciblant 172.17 et 172.18
Démarrage automatique nftables et fail2ban activés via systemd