Libertonia
Portada · Todo · Software Libre · Desarrolladores · Comunidad · Internet · Tecnología · Meta · Diarios
DoS involuntario

luchonidas's Diary
Por luchonidas
departamento nuestro-querido-proxy , Sección Diarios
Puesto a las Fri Oct 15th, 2004 at 03:09:12 PM CET
El jueves de la semana pasada (7/10) fue bastante movido. Tenemos un cliente que nos hizo un ataque DoS involuntario.

La solución, después de la publicidad... perdón, en el cuerpo de la entrada.

 


Antecedentes:
Resulta que donde trabajo hacen un programa, y el día anterior al mencionado se subió a la web una actualización del dichoso programita. Por lo visto se le avisó a algunos clientes, y uno de ellos, ni corto ni perezoso se puso a descargar el programa.

Síntomas:
Viendo que me llamaban cada dos por tres desde el día anterior para decirme que el correo no funcionaba, que si el Outlook les pedía la contraseña, que si les daba timeout (no me lo decían así, pero bueno). Uno, que no es bofh, ni siquiera aprendiz, miraba el servidor a ver que le pasaba, restauraba la contraseña (siempre hay alguno que se le olvida la contraseña), etc, etc. Estaba convencido que era el servidor de correo el problema... más que nada porque miraba los logs del apache y se veía el movimiento normal.

Entonces pensé... vamos a ver que es lo que está pasando por el firewall... ssh... iptraf... bueno, que uno de los servidores, el de la web se estaba comiendo todo el ancho de banda. Primero pensé en un ataque DoS (con la típica duda en mente: ¿quién nos va a atacar a nosotros?), aunque como dije antes, era un solo cliente (cosa que no se sabía a priori)
Mirando más detalladamente (tcpdump -i eth1 -n -no-me-acuerdo-que-mas "port 80 and host 192.168.x.x") en el volcado ascii salía un montón de simbolejos extraños... entonces paré el apache en el servidor y lo volví a iniciar... y en los logs me volvía a salir un tocho de caracteres ascii sin sentido aparente entre los que se veía "GET /soft/****.zip". Voila. PEncontrado el culpable. Pasemos al problema.

Problema:
Resulta que la actualización del dichoso programa ocupa unos 100 Mbytes comprimida. Pero bueno, direis, eso no llega a comerse todo el ancho de banda, siendo que era un solo cliente el que estaba descargando, como descubrí más tarde. Activo el módulo mod_status de apache y miro... había unas 89 peticiones del dichoso fichero desde la misma IP. ¿Y eso?. (Nota: el directorio de descargas está protegido con contraseña.) Por lo visto el personaje se había puesto a descargar el programa con algún gestor de descargas, no se cual ya que simula ser un IE, este programita realiza tropocientas peticiones y me satura la línea... supongo que el hombre tendrá un ADSL, un modem o como mucho un RDSI (por el tipo de empresas a las que va dirigido el programa no pienso que tengan una conexión mucho más grande) y eso no puede saturar la línea de los sarvidores, por muchas peticiones que hagas desde la misma IP. me pongo a mirar la resolución de la IP... recurro a mi querido comando dig, y que me encuentro:
[root@localhost /root]# dig -x 80.58.19.107
;; ANSWER SECTION:
107.19.58.80.in-addr.arpa. 33410 IN PTR 80.58.19.107.proxycache.rima-tde.net.

;; AUTHORITY SECTION:
19.58.80.in-addr.arpa.	33410	IN NS rsdbet1-06.rima-tde.net.
19.58.80.in-addr.arpa.	33410	IN NS rsdmno1-06.rima-tde.net.

;; ADDITIONAL SECTION:
rsdbet1-06.rima-tde.net. 88115	IN A 80.58.32.103
rsdbet1-06.rima-tde.net. 88115	IN A 80.58.32.39
rsdmno1-06.rima-tde.net. 88115	IN A 80.58.0.39
rsdmno1-06.rima-tde.net. 88115	IN A 80.58.0.103

;; Query time: 5 msec
;; SERVER: 192.168.1.4#53(192.168.1.4)
;; WHEN: Fri Oct 15 11:33:26 2004
;; MSG SIZE  rcvd: 207

¡Me está atacando un proxy de Telefónica!. ¿Cómor?
Supongo que el puñetero proxy cogería todas las peticiones del puñetero gestor de descargas y las lanzaría todas a la vez, si a eso le unimos el canuto que tendrán los proxys... pues llegamos al título de la entrada: tenemos un ataque DoS involuntario.

Solución:
  • Primera solución: lo sentí mucho por el hombre que le hacía falta el programa, pero el correo tenía que seguir saliendo y entrando, y ya me empezaba a llamar algún que otro cliente que no podía acceder a su máquina... así que saqué mi lado mini-bofh y bloqueé la IP esa para el directorio soft: (configuración del httpd.conf)
    <Directory "/home/httpd/html/datagruas/soft">
      Order allow,deny
      Deny from 80.58.19.107
    </Directory>
    
    Reinicié apache y problema resuelto... nadie que pase por ese proxy podría acceder al programa, y la línea dejó de estar saturada... pero esta solución no me convencía, así que pasemos a la segunda y por el momento definitiva solución.

  • Segunda Solución: Hace tiempo que vengo pensando en que la red de los servidores necesita una configuración de QOS decente y no la chapuza que tengo ahora, así que me fui al firewall y me puse a trastear con el QOS (tc por aquí, tc por allí, mientras intentaba entender el capítulo nueve del howto del lartc). Tras un rato de pruebas llegué a la conclusión que esto no era lo que me resolvía este problema, así que recordando un artículo que había leído en la Linux Magazine nº32 (edición en castellano, en papel, aquí el enlace al artículo en inglés), me puese a trastear con mod_throttle, módulo para regular la carga y el ancho de banda en apache. Tuve que pasar del apache 2.0.47 (lo se, es antigüillo) al apache 1.3.31, compilar apache, compilar módulo, configurar apache con todos los dominios y demás cosas, y ponerme a hacer pruebas... Después de un par de días de pruebas me encuentro con la situación que el módulo hace lo que le da la gana. Las diferentes políticas permiten o deniegan el acceso al contenido según la configuración, pero después pasaba un buen tiempo hasta que desbloqueban el acceso, por ejemplo: si ponía un límite de cinco accesos simultaneos a un directorio, mientras no se cumplia la condición no había problemas, pero si se intentaba un sexto acceso lo bloqueaba (lo que yo quería), aunque no desbloqueba el acceso si los accesos anteriores terminaban (lo que yo no quería). Con todo este jaleo estuve dos días, hasta que...
    Al final, me decanté por otro módulo que había encontrado mod_bandwidth y que fue más fácil de configurar, aparte de que permite mezclar diferentes tipos de directivas, pero pasemos al ajo.

    Compilar:
    Primero descargamos mod_bandwidth de la página indicada anteriormente, solo es un fichero, mod_bandwidth.c, y lo compilamos. Yo personamente me decanté por compilarlo como un módulo dinámico, así que siguiendo la documentación hice lo siguiente: /path_to_apache/bin/apxs -c /path/mod_bandwidth.c -o /path_to_apache/libexec/mod_bandwidth.so, y añadí las siguiente dos líneas a la configuración de apache:
    LoadModule bandwidth_module libexec/mod_bandwidth.so
    AddModule mod_bandwidth.c
    
    Nota: El autor recomienda que estas líneas se añadan al inicio de las líneas que cargan los módulos de apache, para que tengan la menor prioridad y se ejecuten después de otros módulos.

    Después de instalado el módulo se crean una estructura de directorios que usará el módulo para controlar la descarga. Estos directorios deben tener permisos rwx para el usuario del apache:
    mkdir /tmp/apache-bandwidth
    mkdir /tmp/apache-bandwidth/link
    mkdir /tmp/apache-bandwidth/master
    chown -R nobody /tmp/apache-bandwidth
    chmod -R 750 /tmp/apache-bandwidth

    Configurar: En la configuración del apache añado:
    <IfModule mod_bandwidth.c>
      BandWidthDataDir "/tmp/apache-bandwidth"
      BandWidthModule On
      BandWidthPulse 1000000
    </IfModule>
    
    No me entretendré explicando las directivas de configuración porque vienen claramente explicadas en la documentación (por una vez encuentro una documentación clara).
    También en la configuración del apache, pero en el directorio que quiero limitar añado:
    <Directory "/home/httpd/****/*****/soft">
        BandWidth 192.168 0
        BandWidth all 30000
        MinBandWidth all 4096
        MaxConnection 6
    </Directory>
    
    Aquí si que explico un poco. BandWidth permite limitar el ancho de banda. Con Bandwidth 192.168 0 digo que todo el rango 192.168.0.0/16 no tenga límite de ancho de banda. Con Bandwidth all 30000 limito el resto de las redes a unos 30000 bytes por segundo compartidos, es decir, si se conecta uno y quiere descargar un archivo, irá a 30000 bytes/seg, si se conectan dos, irán a 15000 bytes/seg cada uno, y así.
    Con MinBandWidth all 4096 especifico que el límite inferior para el ancho de banda son 4096 bytes por segundo, es decir que si siguen entrando personas para descargarse los ficheros, la velocidad mínima a la que irán será de 4096 bytes por segundo.
    Por último, MaxConnection 6 limita el número de conexiones simultáneas.

    Aunque aquí no lo he puesto, en la documentación pone que si uno pone límites de ancho de banda dentro de un VirtualHost, hay que añadir un "BandWidthModule On" a la configuración del VirtualHost para que se controle el ancho de banda para el dominio.

    Ahora reiniciamos apache y ¡Tachán! tenemos control de ancho de banda.

Resultados:
En las pruebas que realizé, descargando el dichoso fichero desde otras máquinas, tanto con el navegador como con el comando wget y el ab, el módulo se comportó correctamente, tanto en el control de la velocidad como con las conexiones simultáneas, aunque tiene unas peculiaridades:
  • El programa usa el directorio link para mantener información sobre las conexiones actuales y así calcular la velocidad. Lo hace creando un fichero por conexión. Si uno detiene el apache, estos ficheros no se eliminan, con lo que al iniciarlos de nuevo el módulo considerará que hay una conexión y lo restará del ancho de banda a usar. El autor recomuienda usar un script cleanlink.pl que elimina las conexiones falsas.
  • El número de MaxConnection espécifica el número de conexiones desde la que se bloquea el acceso al fichero, no el número de conexiones permitidas. Me explico, en mi configuración MaxConnection 6 me permitirá 5 conexiones simultáneas y a partir de la sexta me bloqueará.
  • El módulo no trae nada para mostrar estadísticas (bueno, no se puede pedir todo en esta vida).
En mi búsqueda de la solución me encontré con un par más de posibles soluciones: usar un proxy inverso, otro módulo que realiza lo mísmo bwshare y que podría estar mejor que los otros dos (mod_throttle y mod_bandwidth), ya que funciona en apache 1.3.x y 2.0.44 (y supongo que superior), y los otros dos no.

Se aceptan y se agradecen los diversos consejos, recomendaciones, etc, etc, etc.
Para la semana que viene, a seguir peleándome para instalar SpamAssassin en el servidor de correo.

Buen fin de semana
< Sun y el software libre (47 comments) | Conoce Portugal de la mano del Software Libre (0 comments) >
Enlaces Relacionados
· en inglés
· mod_throttle
· mod_bandwidth
· cleanlink.pl
· bwshare
· More on luchonidas's Diary
· Also by luchonidas

Menu
· crear cuenta
· FAQ
· búsqueda
· Fuentes de Noticias

Login
Nueva cuenta
Usuario:
Contraseña:

Ver: Modo: Orden:
DoS involuntario | 7 comentarios (7 temáticos, editoriales, 0 ocultos)
iptables (4.00 / 1) (#1)
por atordo a las Fri Oct 15th, 2004 at 06:47:57 PM CET
(Información Usuario)

Yo uso una cadena de iptables para aceptar un máximo de 100 paquetes por segundo:
$IPTABLES -N FLOOD
$IPTABLES -A FLOOD -s $LAN -j ACCEPT
$IPTABLES -A FLOOD -i lo -j ACCEPT
$IPTABLES -A FLOOD -i $DEV -m limit --limit 100/second -j ACCEPT
$IPTABLES -A FLOOD -i $DEV -m limit --limit 10/minute -j LOG --log-prefix "Flood: "
$IPTABLES -A FLOOD -i $DEV -j DROP
Luego se trata de usar FLOOD en vez de ACCEPT para los servicios que quieras limitar, p. ej:
$IPTABLES -A INPUT -i $DEV -p tcp --dport 80 -j FLOOD
Aunque desde luego tu solución es mucho más elaborada.



qdisc (4.00 / 1) (#2)
por man ls a las Sat Oct 16th, 2004 at 02:43:44 AM CET
(Información Usuario)

El mod_throttle es bastante malo, sí. Yo uso el script de lartc, sección 15.8.3 (HTB), y me va como una moto. Priorizas los paquetes ACK, el tráfico SSH y ralentizas los otros. Me costó un montón entenderlo, eso sí.

Claro que yo lo uso para un redes ADSL, no sé en tu caso si resolverá el problema. Creo que puedes priorizar puertos también.

[ Padre ]


Gracias (none / 0) (#6)
por luchonidas (luchonidas [arroba] yahoo com) a las Mon Oct 18th, 2004 at 03:05:48 PM CET
(Información Usuario) http://potaje.bitacoras.com/

Gracias por la referencia, bastante interesante. De momento me había centrado en el capítulo 9, para intentar comprender como iba el tema del QoS. Intentaré aplicar algo de lo que pone ahí, aunque no lo tengo tan fácil, ya que tengo varios servidores, cada uno con sus propios servicios.

-----
Jeje, vamos a probar eso de las bitácoras: http://potaje.bitacoras.com/
[ Padre ]


 
iptables (none / 0) (#5)
por luchonidas (luchonidas [arroba] yahoo com) a las Mon Oct 18th, 2004 at 03:01:03 PM CET
(Información Usuario) http://potaje.bitacoras.com/

En su momento probé iptables para rebajar la velocidad, y funcionaba bastante bien, pero para lo que necesitaba ahora no me valía, ya que como le decía a Kabutor, el servidor tiene varias webs alojadas y no me interesa el comenzar a reconfigurar el apache para hacer virtualhost por IP, además de tener que reconfigurar el firewall para que me haga nat de la nueva IP.

Aunque igualmente tendré que pelearme con el QoS para controlar todo el jaleo de tráfico, ya que tengo 10 máquinas detrás del firewall, y los 512 kbits se me están quedando cortos... y el jefe como que no va a pedir que suban la velocidad a los de Uni2 hasta que el cable esté hinchado como las mangueras en Tom y Jerry (aquellos dibujos animados). Y el tráfico de correo no hace más que crecer :(

-----
Jeje, vamos a probar eso de las bitácoras: http://potaje.bitacoras.com/
[ Padre ]


 
jeje (none / 0) (#3)
por kabutor a las Sun Oct 17th, 2004 at 01:29:03 PM CET
(Información Usuario) http://www.lazonaoscura.com

que buena la entrada del diario, si me pasa a mi algo de eso no sabria que hacer (menos mal que no trabajo en eso)

No seria mejor haber bloqueado directamente el trafico de la ip que te hacia el DoS en el firewall? o ese cliente tiene correo? Y si su ip hubiera sido dinamica, cual habria sido la solucion?

Lo peor de esto es que el jefe no te habria dicho ni "buen trabajo" ni similar..



Re: jeje (none / 0) (#4)
por luchonidas (luchonidas [arroba] yahoo com) a las Mon Oct 18th, 2004 at 02:42:35 PM CET
(Información Usuario) http://potaje.bitacoras.com/

No seria mejor haber bloqueado directamente el trafico de la ip que te hacia el DoS en el firewall? o ese cliente tiene correo? Y si su ip hubiera sido dinamica, cual habria sido la solucion?

Es que la IP de la máquina que me bombardeaba a peticiones no era de un ADSL en particular, sino de un proxy de telefónica, así que si bloqueaba la IP en el firewall estaba impidiendo el acceso a la web a todas las personas que pasasen por ese proxy en particular, además que el servidor en cuestión tiene las webs de varios clientes y de las empresas del grupo y no podía bloquear el acceso a todas.
Al final, la solución encontrada es la mejor, ya que no depende de la IP del cliente, sino de lo que se solicita, además permite configurar diferentes velocidades máximas para diferentes directorios en el mismo servidor. El problema es que no permite especificar un máximo de transferencia (como hacen ciertos proveedores de hosting/housing, tantos Gb de transferencia al mes).



-----
Jeje, vamos a probar eso de las bitácoras: http://potaje.bitacoras.com/
[ Padre ]


 
Impresionante (none / 0) (#7)
por Envite a las Wed Oct 20th, 2004 at 11:56:43 PM CET
(Información Usuario)

muy bueno el artículo. Por cierto. ¿Has llamado a Telefónica a quejarte? Porque, por poder, los puedes hasta denunciar...
No estoy de acuerdo con lo que dices, pero defenderé con mi vida tu derecho a decirlo.
Voltaire



 
DoS involuntario | 7 comentarios (7 temáticos, editoriales, 0 ocultos)
Ver: Modo: Orden:

ecol Logo Powered by Scoop
Todas las Marcas Registradas y copyrights de esta página son propiedad de sus respectivos dueños.
Los comentarios son propiedad del que los escribe.
Los iconos de las noticias y el logotipo son propiedad de Javier Malonda.
El Resto © 2002 Escomposlinux.org y aledaños.

Puedes sindicar los contenidos de libertonia en formato RSS 1.0 y RDF 0.9. También se puede sindicar la cola de envíos pendientes de moderación.

El proyecto escomposlinux.org está dedicado a la memoria de tas

crear cuenta | faq | búsqueda