Attaques DDoS et trafic malveillant

Quand votre serveur est submergé volontairement

Identifier, bloquer et se protéger des attaques.

C’est une attaque ou une surcharge ?

La frontière est parfois floue. Voici comment différencier :

IndicateurSurcharge légitimeAttaque / Bot agressif
Source du traficIPs variées, géo cohérentePeu d’IPs, ou IPs exotiques
Pages visitéesParcours logiquesURLs aléatoires, répétitives
User-AgentNavigateurs classiquesBots, vide, ou falsifié
TimingProgressif ou lié à un événementBrutal, sans raison apparente
ComportementSessions normalesRequêtes très rapides, pas de JS

Important : La plupart des « attaques » sur les petits sites sont en réalité des bots de scraping ou des crawlers mal configurés, pas des DDoS coordonnés. La solution est souvent plus simple qu’on ne le pense.

Diagnostic : Analyser les logs

Étape 1 : Top des IPs suspectes

# Top 20 IPs par nombre de requêtes (dernières 10000 lignes)
$ tail -10000 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

  15234 185.191.171.44    # ← SemrushBot (SEO crawler)
   8921 114.119.128.45    # ← Suspect : beaucoup trop
   7845 66.249.66.91      # ← Googlebot (normal)
   3421 45.33.32.156      # ← À investiguer
    892 195.154.122.33    # ← Normal

Étape 2 : Identifier qui est derrière une IP

# Reverse DNS
$ host 185.191.171.44
44.171.191.185.in-addr.arpa domain name pointer crawl26.bl.semrush.com.
# → C'est SemrushBot, un crawler SEO connu

# Whois
$ whois 114.119.128.45 | grep -E "(OrgName|Country|NetName)"
OrgName:        Alibaba Cloud
Country:        CN
NetName:        ALICLOUD
# → Serveur cloud chinois, potentiellement suspect

# Géolocalisation
$ curl -s "http://ip-api.com/json/114.119.128.45" | jq
{
  "country": "China",
  "city": "Hangzhou",
  "isp": "Alibaba Cloud"
}

Étape 3 : Analyser le comportement

# Requêtes d'une IP spécifique
$ grep "114.119.128.45" /var/log/nginx/access.log | tail -20

114.119.128.45 - - [26/Dec/2024:14:30:01] "GET /product/1234 HTTP/1.1" 200
114.119.128.45 - - [26/Dec/2024:14:30:01] "GET /product/1235 HTTP/1.1" 200
114.119.128.45 - - [26/Dec/2024:14:30:02] "GET /product/1236 HTTP/1.1" 200
# ← Requêtes très rapides, scraping de produits

# Requêtes par seconde d'une IP
$ grep "114.119.128.45" /var/log/nginx/access.log | awk '{print $4}' | cut -d: -f1-3 | uniq -c
    45 26/Dec/2024:14:30
    52 26/Dec/2024:14:31
# ← 45-52 req/sec = clairement un bot

Étape 4 : Vérifier les User-Agents

# User-Agents les plus fréquents
$ awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

   8234 Mozilla/5.0 (compatible; SemrushBot/7~bl)
   5621 Mozilla/5.0 (Linux; Android 10) Chrome/...  # Normal
   4521 -                                           # ← Vide = suspect
   3892 python-requests/2.28.1                      # ← Bot Python
   2341 Mozilla/5.0 (compatible; AhrefsBot/7.0)    # SEO crawler

Types de menaces et solutions

Type 1 : Crawlers SEO trop agressifs

Coupables fréquents : SemrushBot, AhrefsBot, MJ12bot, DotBot

Solution 1 : robots.txt

robots.txt

# Ralentir les crawlers SEO
User-agent: SemrushBot
Crawl-delay: 10

User-agent: AhrefsBot
Crawl-delay: 10

# Ou bloquer complètement
User-agent: MJ12bot
Disallow: /

User-agent: DotBot
Disallow: /

Solution 2 : Blocage Nginx

/etc/nginx/conf.d/block-bots.conf

# Bloquer par User-Agent
map $http_user_agent $bad_bot {
    default 0;
    ~*semrush 1;
    ~*ahrefs 1;
    ~*mj12bot 1;
    ~*dotbot 1;
    ~*python-requests 1;
}

server {
    if ($bad_bot) {
        return 403;
    }
}

Type 2 : Scraping agressif

Symptômes : Une IP fait des milliers de requêtes sur vos pages produits/contenu.

Solution : Rate limiting Nginx

/etc/nginx/nginx.conf

http {
    # Définir les zones de limitation
    limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
    limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;
    limit_conn_zone $binary_remote_addr zone=addr:10m;
}

Blocage d’urgence

Quand vous avez identifié des IPs malveillantes, bloquez-les immédiatement :

Blocage via iptables

# Bloquer une IP
$ iptables -A INPUT -s 114.119.128.45 -j DROP

# Bloquer un range (/24 = 256 IPs)
$ iptables -A INPUT -s 114.119.128.0/24 -j DROP

# Bloquer un pays entier (via ipset)
$ ipset create china hash:net
$ wget -O - https://www.ipdeny.com/ipblocks/data/countries/cn.zone | while read ip; do
    ipset add china $ip
done
$ iptables -A INPUT -m set --match-set china src -j DROP

# Lister les règles
$ iptables -L -n --line-numbers

# Supprimer une règle (par numéro)
$ iptables -D INPUT 3

# Sauvegarder les règles
$ iptables-save > /etc/iptables.rules

Blocage via Nginx

/etc/nginx/conf.d/blocklist.conf

# Liste noire d'IPs
geo $blocked_ip {
    default 0;
    114.119.128.0/24 1;
    185.234.0.0/16 1;
    # Ajouter d'autres IPs/ranges
}

server {
    if ($blocked_ip) {
        return 444;  # Ferme la connexion sans réponse
    }
}

Blocage via .htaccess (Apache)

.htaccess

# Bloquer des IPs
<RequireAll>
    Require all granted
    Require not ip 114.119.128.45
    Require not ip 185.234.0.0/16
</RequireAll>

# Alternative avec mod_rewrite
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^114\\.119\\.128\\. [OR]
RewriteCond %{REMOTE_ADDR} ^185\\.234\\.
RewriteRule .* - [F,L]

Blocage via Fail2ban (automatisé)

/etc/fail2ban/filter.d/nginx-req-limit.conf

[Definition]
failregex = limiting requests, excess: .* by zone .*, client: <HOST>
ignoreregex =

Protection durable avec Cloudflare

Cloudflare est la solution la plus simple et efficace pour se protéger. Le plan gratuit suffit pour la plupart des cas.

Configuration recommandée

Règles de pare-feu recommandées

RègleConditionAction
Bloquer pays à risqueCountry in {CN, RU, KP}Block
Protéger wp-adminURI contains « wp-admin » AND not IP in whitelistChallenge
Protéger xmlrpcURI equals « /xmlrpc.php »Block
Limiter APIURI starts with « /api/ »Rate Limit (100/min)
Challenge bots inconnusKnown Bots = Off AND User Agent = emptyChallenge

Rate Limiting Cloudflare

Règle : Protection checkout e-commerce
Si : URI contains "/checkout" ou "/cart"
Et : Plus de 30 requêtes en 1 minute
Alors : Challenge pendant 1 heure

Checklist post-attaque

Une fois l’attaque mitigée :

Vérifications de sécurité

# Fichiers modifiés récemment (potentielle intrusion)
$ find /var/www -type f -mtime -1 -ls

# Rechercher des backdoors PHP connues
$ grep -r "eval(base64_decode" /var/www/
$ grep -r "shell_exec" /var/www/
$ grep -r "system(" /var/www/

# Vérifier les utilisateurs système
$ cat /etc/passwd | grep -v nologin

# Connexions SSH récentes
$ last -20

Pour un audit de sécurité complet après une attaque, Motsdepasse.org propose des ressources et Foxop des services d’audit.

Protection proactive

Monitoring, détection d’anomalies, alertes instantanées.

Questions fréquentes

Mon hébergeur mutualisé peut-il me protéger d’un DDoS ?

Très peu. Les hébergements mutualisés n’ont généralement pas de protection DDoS dédiée. Ils peuvent couper votre site pour protéger les autres clients. Solution : passez sur Cloudflare (gratuit) qui filtre le trafic avant qu’il n’atteigne votre hébergeur.

Comment différencier Googlebot d’un faux Googlebot ?

Vérifiez l’IP avec un reverse DNS : host . Un vrai Googlebot vient de .googlebot.com ou .google.com. Ensuite, faites un forward DNS sur ce hostname : il doit pointer vers l’IP d’origine. Les faux Googlebot utilisent le User-Agent mais échouent à ce test.

Faut-il porter plainte en cas de DDoS ?

Pour les particuliers et petites entreprises, c’est rarement utile : les attaquants sont souvent à l’étranger et difficiles à identifier. Pour les entreprises avec un préjudice important, une plainte peut être envisagée. Conservez tous les logs comme preuves.

Cloudflare ralentit-il mon site ?

Non, au contraire. Le CDN de Cloudflare rapproche votre contenu des visiteurs. Le challenge JavaScript ajoute ~5 secondes uniquement pour les visiteurs suspects, pas pour les humains normaux. En mode « Under Attack », tous les visiteurs ont un délai de 5s la première fois.