Evitar ataques DoS a apache con mod_evasive

El ataque DoS (Denegación de Servicio / Denial of Service) o DDoS (Distributed Denial of Service, denegación de servicio distribuida), es un ataque a un sistema de servidores o red que causa que un servicio o recurso sea inaccesible a usuarios legítimos. El flujo masivo de peticiones (a través del protocolo TCP/IP) al servidor y los ataques de fuerza bruta provocan el colapso de la red, o la saturación del servidor en cuestión.

En esta entrada vamos a tratar de paliar los ataques DoS centrados en el servicio Apache, que consiste básicamente en lanzar peticiones al servidor web de forma masiva hasta colapsar el mismo. Gracias al módulo de apache mod_evasive conseguiremos redirigir el tráfico de esta peticiones ilegítimas hacia un error 403 (prohibido).

La última versión estable de mod_evasive puede descargarse en este enlace.

Compilación:

cd /root/descargas
wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
tar -zxf mod_evasive_1.10.1.tar.gz
cd mod_evasive

Si usamos apache1, deberemos compilar su módulo correspondiente (adecuad la siguiente línea a vuestra ruta de apache):

/usr/local/apache/bin/apxs -cia mod_evasive.c

Si usamos apache2, deberemos compilar su módulo correspondiente:

/usr/local/apache/bin/apxs -cia mod_evasive20.c

Veremos que tras la compilación, automáticamente ya carga el módulo en nuestro httpd.conf:

LoadModule evasive_module     libexec/mod_evasive.so

Configuración:

El fichero de configuración (muestro los valores por defecto) lo cargaremos en un fichero aparte y lo llamaremos desde el httpd.conf (podéis cargar las opciones directamente en el httpd.conf, yo lo pongo separado para una mejor estructuración) :

Include "/usr/local/apache/conf/mod_evasive.conf"

Y el fichero que incluye las configuraciones del módulo:

<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify correo@dominio.com
DosWhitelist 98.54.48.14 # Ip ficticia
</IfModule>

Vamos a explicar un poco lo que es cada opción:

Podemos ver lo que es cada cosa en:

DOSHashTableSize

Cuanto más grande sea el tamaño de la tabla de Hash, más memoria requerirá, pero el rastreo de Ips será más rápido. Es útil aumentar su tamaño si nuestro servidor recibe una gran cantidad de peticiones, pero así mismo la memoria del servidor deberá ser también mayor.

DOSPageCount

Número de peticiones a una misma página para que una IP sea añadida a la lista de bloqueo, dentro del intervalo de bloqueo en segundos especificado en el parámetro DOSPageInterval

DOSSiteCount

Igual que ‘DOSPageCount’, pero corresponde al número de peticiones al sitio en general, usa el intervalo de segundos especificado en ‘DOSSiteInterval’.

DOSPageInterval
Intervalo en segundos para el parámetro umbral de DOSPageCount.

DOSSiteInterval
Intervalo en segundos para el parámetro umbral DOSSiteCount.

DOSBlockingPeriod
Periodo de bloqueo para una IP si se supera alguno de los umbrales anteriores.El usuario recibirá un error403 (Forbidden) cuando sea bloqueado, si el atacante lo sigue intentando, este contador se reseteará automáticamente, haciendo que siga más tiempo bloqueada la IP.

DOSEmailNotify
Dirección de correo electrónico que recibirá información sobre los ataques.

DosWhitelist
Podemos especificar una IP o rango que será excluido del rastreo por mod_evasive.

Si alguna de estas opciones no os han quedado claras, indicadmelo y trataré de explicarlo de otra forma. Es fácil comprenderlo en inglés, pero su traducción se hace complicada.

Finalmente reiniciamos apache y ejecutamos el script en perl de testeo (test.pl) que viene incluido en el .tar.gz . Si todo ha ido bien, veremos que al cabo de unas cuantas peticiones, bloqueará el acceso al servicio web:

HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden

HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden

Con esto ya tendríamos un protector de ataques DDoS a apache funcionando. No obstante, os puede ser de utilidad el siguiente comando, que nos indicará el nº de peticiones al puerto 80 por cada IP en el momento que lo ejecutemos:

netstat -plan|grep :80 | awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -n

Si solo queremos ver las establecidas:

netstat -plan|grep :80 |  grep ESTABLISHED | awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -n

Esto es muy útil, pues a partir de dichos comandos, podemos averiguar rápidamente si una o varias IPs están haciendo un exceso de peticiones al servicio apache (fuerza bruta), y directamente filtrar la IP que queramos en nuestro firewall, por ejemplo en APF:

 /usr/local/sbin/apf -d <IP conflictiva>

De este modo, junto a la instalación de APF y BFD, nuestro servidor será menos vulnerable a ataques.

15 comentarios en “Evitar ataques DoS a apache con mod_evasive

  1. Hola necesito vuestra ayuda, he realizado todos los pasis que marcan para la instalación del mod_evasive y al realizar el test.pl me da el siguiente resultado:

    #!/usr/bin/perl

    # test.pl: small script to test mod_dosevasive’s effectiveness

    use IO::Socket;
    use strict;

    for(0..100) {
    my($response);
    my($SOCKET) = new IO::Socket::INET( Proto => “tcp”,
    PeerAddr=> “127.0.0.1:80″);
    if (! defined $SOCKET) { die $!; }
    print $SOCKET “GET /?$_ HTTP/1.0\n\n”;
    $response = ;
    print $response;
    close($SOCKET);
    }

    Espero que me podáis ayudar.

    Muchas gracias.

    • Como estás ejecutando el script perl? Desde la shell, ejecutalo así:

      perl test.pl

      El resultado que muestras es el contenido del propio script, como si no lo interpretara o similar.

  2. Necesito un poco de tú ayuda por favor, yo recién estoy empezando a conocer de estos ataques DDoS y no quiero hacerle algo malo a algún servidor, solo quiero cuidar el mio y para eso necesito tu ayuda por que la verdad he visitado como 5 webs q se tratan de esto pero explican muy enredado y a ti es al q he entendido mejor pero todavía me cuesta aprender como prevenirlos,por favor agregame a tu msn (en caso de que tengas)soy simi-999666@hotmail.com y así pueda explicarte mis dudas.

  3. Hola a todos, tengo un problema con una aplicacion sobre java en la cual uso una libreria httpclient apache, el objectivo de mi aplicacion es escanear y verificar todos los enlaces de cualquier sitio web, pero al hacerle una cierta cantidad de peticiones, este sitio web se cae, es decir me da error, yo uso hilos que me dividen el trabajo y me agilizan un poco mas la aplicacion.
    Quisiera saber si existe una forma de hacer muchas peticiones sin tumbar el sitio web, ?Eso tendra que ver con algun Ataque DoS?, desconosco del tema.

    Saludos

    • Quizás deberías limitar el nº de peticiones por segundo y así evitar que el servidor te penalizara por hacer tantas peticiones simultaneas.

      SAludos

  4. Hola, he intentado hacer los pasos que marcas en esta entrada y me he quedado en el segundo.

    Me explico, he descargado bien el archivo de mod_evasive pero a la hora de poner el tema de apache 1 o apache 2 ya no se como seguir, no se como mirar que tipo de apache utiliza mi servidor, es un linux CentOS y bueno he buscado y no encuentro nada. Al igual que la entrada /usr/local/apache/bin/apxs -cia mod_evasive.c dependiendo de el apache que tenga como lo lanzaría? así directamente o llevaría algo antes del path /usr/local/apache/bin/apxs -cia mod_evasive.c.

    Espero vuestra ayuda, muchas gracias por las ayudas.

    Un saludo.

        • Carlos, deberías intentar buscar la información por tu cuenta antes que preguntar todas estas dudas, más que nada porque si necesitas rapidez o un consultorio este no es el sitio adecuado para preguntarlo.

          Para averiguar la versión de apache…

          # httpd -v
          Server version: Apache/2.2.17 (Unix)

          Lo demás lo tienes en la entrada.

          Un saludo

  5. Alex yo se como ver la versión de apache, lo que no se es donde meter lo que pone en el paso 2: /usr/local/apache/bin/apxs -cia mod_evasive.c Ya que en mi servidor no está apache en esa ruta y por lo cual no se donde meterlo y es la ayuda que estoy pidiendo.
    He buscado por ahí pero no logro encontrar nada.

    Gracias por tu respuesta, un saludo.

  6. Le solicite a soporte la instalacion del mod_evasive, pero ahora ciertas web no se observan todas sus imagenes como por ejemplo, http://www.enfoques365.net supongi que he superado el numero de peticiones, pero ciertamente tengo esto y creo que es bastante, o sera que a soporte le falto un paso, para que estos cambios fueran tomados en cuenta…

    LoadModule evasive20_module modules/mod_evasive20.so

    DOSHashTableSize 3097
    DOSPageCount 300
    DOSSiteCount 900
    DOSPageInterval 2
    DOSSiteInterval 2
    DOSBlockingPeriod 10
    DOSLogDir «/usr/local/apache/logs/»
    # Optional Directives – /usr/share/doc/mod_dosevasive/README for more info
    # DOSEmailNotify cjmfigueroa@hotmail.com
    # DOSSystemCommand «su – root -c ‘/sbin/iptables -A INPUT -s %s -j DROP»

  7. El problema puede ser porque al mostrar una página se cargan muchos css, js e imágenes y ahí se incrementa bastante la cantidad de peticiones instantáneas al servidos.

  8. #/usr/local/apache2/bin/apxs -cia mod_evasive20.c
    /usr/local/apache2/build/libtool –silent –mode=compile gcc -std=gnu99 -prefer-pic -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/include/libxml2 -I/usr/local/apache2/include -I/usr/local/apache2/include -I/usr/local/apache2/include -c -o mod_evasive20.lo mod_evasive20.c && touch mod_evasive20.slo
    mod_evasive20.c: In function ‘access_checker’:
    mod_evasive20.c:142: error: ‘conn_rec’ has no member named ‘remote_ip’
    mod_evasive20.c:146: error: ‘conn_rec’ has no member named ‘remote_ip’
    mod_evasive20.c:158: error: ‘conn_rec’ has no member named ‘remote_ip’
    mod_evasive20.c:165: error: ‘conn_rec’ has no member named ‘remote_ip’
    mod_evasive20.c:180: error: ‘conn_rec’ has no member named ‘remote_ip’
    mod_evasive20.c:187: error: ‘conn_rec’ has no member named ‘remote_ip’
    mod_evasive20.c:208: error: ‘conn_rec’ has no member named ‘remote_ip’
    mod_evasive20.c:212: warning: implicit declaration of function ‘getpid’
    mod_evasive20.c:215: error: ‘conn_rec’ has no member named ‘remote_ip’
    mod_evasive20.c:221: error: ‘conn_rec’ has no member named ‘remote_ip’
    mod_evasive20.c:222: error: ‘conn_rec’ has no member named ‘remote_ip’
    mod_evasive20.c:228: error: ‘conn_rec’ has no member named ‘remote_ip’
    apxs:Error: Command failed with rc=65536

    «solucion»
    abrir mod_evasive20.c y remplazar:
    remote_ip con client_ip
    problema?

Comments are closed.