2 votes

Comment puis-je supprimer les paquets HTTP "vides" en utilisant iptables?

Je possède un site hébergé sur un VPS de 1 Go sous Ubuntu 10.04 LTS. J'utilise nginx comme serveur web. Le site fonctionne dans une configuration relativement stable depuis trois ans, et gère environ 4 millions de pages vues par mois.

Depuis les 16 dernières heures, je pense être victime d'une attaque DDoS "modérée". Le trafic sortant a été multiplié par 5, et l'utilisation du CPU a à peu près triplé. Dans les logs de nginx, je vois une ou deux adresses IP chaque seconde envoyant plusieurs requêtes simultanément (1-10 chacune). Ces requêtes semblent ne pas être dirigées vers mon URL, mais directement vers mon adresse IP. Comme je suis assez à l'aise avec le fichier nginx.conf, j'ai configuré un bloc serveur "par défaut" pour intercepter ce trafic et le journaliser. Je l'ai configuré pour enregistrer ce trafic et lui renvoyer le code d'erreur 444. J'ai également mis en place les directives limit_req_zone et limit_conn_zone pour ce trafic, même si ce sont différentes adresses IP qui envoient les requêtes, ce qui a peu d'impact. Voici la section pertinente du fichier nginx.conf:

limit_req_zone  $binary_remote_addr  zone=ddos:25m   rate=1r/m;
limit_conn_zone $binary_remote_addr zone=blockedfuckers:20m;    
server {
    listen 80 default_server;
    server_name _;
    access_log /var/log/nginx/a2.log hackers;
    limit_req zone=ddos nodelay;
    limit_conn blockedfrakers 1;
    return 444;
}

Cela a réduit l'utilisation du CPU d'environ 30%, mais le trafic sortant est toujours élevé, et le CPU est toujours plus de deux fois supérieur à la normale. Pour une raison quelconque, le journal montre que les requêtes renvoient une réponse 400, et non le 444 que j'essaie d'envoyer. Par exemple:

109.198.195.28 [12/Mar/2013:22:49:24 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -

Ces requêtes me semblent "vides", donc j'essaie de configurer iptables pour simplement les bloquer, mais les quelques essais que j'ai faits n'ont pas fonctionné. Des idées sur comment cibler et bloquer ce trafic?

1voto

Chris Simmons Points 1460

Si vous êtes sûr que la charge utile TCP est 0, vous pouvez essayer avec les options --length d'iptables. Ces options correspondent à la charge utile de la couche 3. Cette règle devrait fonctionner:

iptables -I INPUT -p tcp --dport 80 -m length --length 20 -j DROP

La taille de l'en-tête TCP est généralement de 20 (peut être plus grande, mais essayez avec 20 et voyez les résultats). Ainsi, cette règle va supprimer les paquets qui contiennent uniquement un paquet avec un en-tête TCP et aucune charge utile.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X