Image

Base de connaissances → Protection contre les inondations (exploration régulière et fréquente des pages) du serveur nginx

[Serveurs virtuels]
Date de publication: 10.09.2025

Tout serveur est, tôt ou tard, soumis à des inondations (flooding), ce qui entraîne une augmentation de la charge sur les services et une utilisation accrue des ressources. De nombreux bots sur internet scannent les sites web à la recherche de vulnérabilités et pour la collecte de données.

Ces bots ont un comportement malveillant et, afin de ne pas gaspiller les ressources du serveur sur eux, ils doivent être bloqués.

Dans cet article, nous examinons spécifiquement l'une des méthodes de lutte contre le flooding. D'autres services et méthodes sont utilisés pour lutter contre les attaques DDoS.

Exemple de telles requêtes :

100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /aa.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /file.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /file.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /wp-file.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /wp-file.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /k.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /k.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /al.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /al.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:57:59 +0000] "GET /wp- HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /wp- HTTP/1.1" 404 48273 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /admin.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /admin.php HTTP/1.1" 404 27 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /file2.php HTTP/1.1" 301 162 "-" "-"
100.xx.188.xx - - [10/Sep/2025:00:58:00 +0000] "GET /file2.php HTTP/1.1" 404 27 "-" "-"

Comme le montre le journal, le bot effectue environ 9 requêtes par seconde vers le serveur, ce qui est considérable, surtout si l'on considère qu'il pourrait y avoir plusieurs bots avec des adresses IP différentes. Cela peut créer une charge significative sur un serveur virtuel.

Notre tâche est de bloquer les adresses IP qui effectuent un trop grand nombre de requêtes régulières, tout en excluant les fichiers statiques – nous ne compterons que les requêtes dynamiques, car ce sont elles qui créent la charge.

1. Installation de Fail2ban

apt install fail2ban

2. Configuration

nano /etc/fail2ban/jail.local
[DEFAULT]
# Paramètres principaux
ignoreip = 127.0.0.1/8 ::1
bantime = 3600
findtime = 600
maxretry = 200

# Paramètres de courriel
destemail = corp@domain.tld
sender = fail2ban@domain.tld
sendername = Fail2Ban
mta = sendmail

# Action par défaut (avec envoi de courriel)
action = %(action_mwl)s

[nginx-flood]
enabled = true
port = http,https
filter = nginx-flood
logpath = /var/log/nginx/*access*.log
maxretry = 200
findtime = 60
bantime = 3600
# l'action est héritée de DEFAULT, il n'est donc pas nécessaire de la dupliquer

2.1 Le Filtre lui-même

nano /etc/fail2ban/filter.d/nginx-flood.conf
[Definition]
# Exclure les fichiers statiques du comptage
failregex = ^<HOST> -.*"(GET|POST|HEAD) (?!.*\.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|eot|svg|pdf|txt|xml)(\?.*)?$).* HTTP/\d\.\d".*
ignoreregex = 
datepattern = ^[^\[]*\[({DATE})\s+({TIME})\s+[^\]]*\]

2.2 Modifications

N'oubliez pas de changer l'adresse email par la vôtre :

destemail = corp@domain.tld
sender = fail2ban@domain.tld

2.3 Seuil de Déclenchement

Si nécessaire, ajustez les paramètres selon vos besoins pour éviter les faux positifs :

maxretry = 200
findtime = 60
bantime = 3600

3. Démarrage des Services

systemctl restart fail2ban
systemctl enable fail2ban

4. Visualisation et Gestion

4.1 Visualisation des IPs Bloquées

Pour iptables

iptables -L -n

Pour fail2ban

fail2ban-client status nginx-flood

4.2 Test

Ajouter temporairement une IP de test à la liste de bannissement

fail2ban-client set nginx-flood banip 1.2.3.4

Vérifier le blocage, ainsi que si l'e-mail a été reçu

fail2ban-client set nginx-flood unbanip 1.2.3.4




Aucun commentaire pour l'instant