Contactos

Protección de Nginx de los ataques de DDOS. Protección DDOS con NGINX creando una lista permitida de direcciones IP

Luchando con los ataques de DDOS: el trabajo no solo es difícil, sino también fascinante. No es sorprendente que cada SysAdmin primero esté tratando de organizar la defensa por sí sola, especialmente porque todavía es posible.

Decidimos ayudarlo con esto difícil y publicar algunos consejos cortos, triviales y universales sobre la protección de su sitio a partir de ataques. Las recetas reducidas no lo ayudarán a hacer frente a ningún ataque, sino de la mayoría de los peligros que se guardarán.

Ingredientes derechos

La dura verdad es que muchos sitios pueden poner a cualquier persona que quiera usar el ataque de Sloorlis, matando firmemente a Apache, o resolviendo la llamada inundación de SYN utilizando una granja de servidores virtuales levantados por minuto en la nube de Amazon EC2. Todos nuestros futuros consejos de protección DDOS se basan en las siguientes condiciones importantes.

1. Rechazar el servidor de Windows

La práctica sugiere que el sitio que trabaja en Windows (2003 o 2008 no importa), en el caso de DDOS está condenado. La razón de la falla se encuentra en la pila de red de Windows: cuando las conexiones se convierten mucho, el servidor ciertamente comienza a responder mal. No sabemos por qué Windows Server funciona en situaciones tan de buena reputación, pero lo han encontrado más de una vez y no dos. Por esta razón, este artículo continuará con los medios de protección contra los ataques de DDOS en el caso de que el servidor está girando en Linux. Si usted es un dueño feliz con un núcleo contemporáneo (a partir de 2.6), entonces las utilidades IPTables y IPSet se utilizarán como kit de herramientas principal (para agregar direcciones IP rápidamente), con las que puede prohibir los bots rápidamente. Otra clave para el éxito es una pila de red correctamente cocinada, que también hablaremos más.

2. Parte con Apache

La segunda condición importante es la negativa de Apache. Si no tiene ni una hora, vale la pena apache, al menos coloque un proxy en caché frente a él: NGINX o Lighttpd. Apache "Es extremadamente difícil dar archivos, y, aún peor, es en el nivel fundamental (es decir, irreviblemente vulnerable para un ataque de solución lenta peligrosa, lo que le permite terminar el servidor casi desde un teléfono móvil. Para combatir varios TIPOS DE SOOTORIS, los usuarios de Apache se les ocurrió el primer parche primero anti-Slowloris.DIFF, luego mod_noloris, luego mod_antiloris, mod_limitipconn, mod_reqtimeut ... pero si desea dormir bien por la noche, es más fácil tomar un servidor HTTP, invulnerable a Sloorloris a nivel de arquitectura de código. Por lo tanto, todas nuestras recetas adicionales se basan en el supuesto, que NGINX se usa en la parte delantera.

Lucha de DDOS.

¿Y si se vino DDOS? La técnica tradicional de autodefensa es leer el archivo de registro del servidor HTTP, escriba un patrón para GREP (hacer bots de bots) y prohibir a todos los que caen bajo él. Esta técnica funcionará ... Si tienes suerte. Los batnetts son dos tipos, ambos son peligrosos, sino de diferentes maneras. Uno enteramente viene al sitio al instante, el otro es gradualmente. El primero lo mata todo e inmediatamente, pero los registros aparecen en los troncos completamente, y si las prohíben y sorprenden todas las direcciones IP, entonces usted es un ganador. La segunda botnet pone el sitio suavemente y con cuidado, pero tendrá que prohibirlo, tal vez durante el día. Es importante entender a cualquier administrador: si está previsto que luche contra GREP, entonces debe estar listo para dedicarse a la lucha contra el ataque un par de días. A continuación se presentan los consejos sobre dónde puede poner de antelación de pajitas para que no sea tan doloroso caer.

3. Usa el módulo TESTCOOKIE

Quizás la receta más importante, efectiva y operativa de este artículo. Si el DDOS llega a su sitio, el módulo TestCookie-Nginx desarrollado por @kyprizel Coexler puede convertirse en la forma más eficiente. Una idea es simple. La mayoría de las veces, los bots que implementan inundaciones HTTP son bastante estúpidas y no tienen cookies HTTP y mecanismos de redirección. A veces, más avanzado, tal puede usar cookies y redirecciones de procesos, pero casi nunca DOS-Bot lleva un motor JavaScript de pleno derecho (aunque cada vez más a menudo y más a menudo). TESTCOOKIE-NGINX funciona como un filtro rápido entre los bots y el backend durante el ataque de L7 DDOS, lo que le permite cortar las consultas de basura. ¿Qué se incluye en estos cheques? Si el cliente puede ejecutar Redirect HTTP, ya sea que Javascript admite si es el navegador por el cual se entrega (ya que Javascript es diferente en todas partes y si el cliente dice que él, digamos Firefox, entonces podemos verificarlo). El cheque se implementa con cookies usando diferentes métodos:

  • "Establecer cookie" + redirigir con 301 Ubicación HTTP;
  • "Establecer cookie" + redirigir con HTML Meta Refresh;
  • una plantilla arbitraria, y puedes usar JavaScript.

Para evitar el análisis automático, las cookies de prueba se pueden cifrar utilizando AES-128 y luego se descifran en el lado del cliente de JavaScript. En la nueva versión del módulo, fue posible instalar los cocineros a través de Flash, lo que también le permite cortar bots efectivamente (que suele ser compatible con ellas que no se admite), pero, sin embargo, también bloquea el acceso a muchos usuarios legítimos (en realidad, todos los dispositivos móviles ). Cabe destacar que comienza a usar TestCookie-Nginx extremadamente simple. El desarrollador, en particular, lleva varios ejemplos comprensibles de uso (para diferentes casos de ataque) con muestras de configuraciones para NGINX.

Además de las ventajas, Tescokie tiene desventajas:

  • corta todos los bots, incluyendo Googlebot. Si planea dejar TestCookie de forma continua, asegúrese de no desaparecer de los resultados de búsqueda;
  • crea problemas con los usuarios con enlaces de navegadores, W3M y ellos como;
  • no salva de bots equipados con un motor de navegador completo con JavaScript.

En resumen, TestCookie_Module no es universal. Pero de una serie de cosas, como, por ejemplo, herramientas primitivas para Java y C #, lo ayuda. Así que cortas parte de la amenaza.

4. Código 444.

El propósito de los DDoS'ers a menudo se convierte en la parte más intensiva por recursos del sitio. Un ejemplo típico es una búsqueda que realiza consultas complejas a la base de datos. Naturalmente, los atacantes pueden aprovechar esto, habiendo cobrado varias decenas de miles de solicitudes al motor de búsqueda a la vez. ¿Lo que podemos hacer? Desactivar temporalmente la búsqueda. Deje que los clientes no puedan buscar la información necesaria por medios incorporados, pero todo el sitio principal permanecerá en las condiciones de trabajo hasta que encuentre la raíz de todos los problemas. NGINX admite el código 444 no estándar, lo que le permite cerrar simplemente la conexión y no para dar nada en respuesta:

Ubicación / búsqueda (devolución 444;)

Por lo tanto, es posible, por ejemplo, implementar rápidamente el filtrado en la URL. Si está seguro de que las solicitudes de ubicación / búsqueda vienen solo de bots (por ejemplo, su confianza se basa en el hecho de que no hay partición / búsqueda en su sitio), puede instalar el paquete IPSet y prohibir los bots con una cáscara simple texto:

IPSET -N BAN IPHASH TAIL -F Access.log | Mientras que lea la línea; Hacer eco "$ linea" | \\ Cut -d "" "-f3 | Cut -d" "-f2 | GREP -Q 444 && ipset -a prohibición" $ (l %% *) "; hecho

Si el formato de archivo de registro no es estándar (no combo) o es necesario prohibir otros signos que el estado de la respuesta, puede ser necesario reemplazar el corte para expresar regularmente.

5. Banya por Geod

El Código de respuesta no estándar 444 también puede ser útil para la prohibición operativa de los clientes en la adquisición geográfica. Apenas puede limitar a los países individuales que son inconvenientes. Digamos, apenas en la tienda en línea de cámaras de Rostov-On-Don hay muchos usuarios en Egipto. Esta no es una manera muy buena (solo diga: repugnante), ya que los datos de GEOIP son inexactos, y Rostov a veces vuelan a Egipto a descansar. Pero si no tienes nada que perder, entonces sigue las instrucciones:

  1. Conecte al módulo GEOIP NGINX (wiki.nginx.org/httpgeoIpmodule).
  2. Mostrar información de Geother en el registro de acceso.
  3. Además, modifique el script de shell anteriormente, ProgrEPT ACCESSLOG NGINX y agregue signos geográficos de clientes de SFatelated a una prohibición.

Si, por ejemplo, los bots en su mayor parte fueron de China, puede ayudar.

6. RED NEURALES (POC)

Finalmente, puede repetir la experiencia del juego @Savetherbtz, que tomó la red neuronal Pybrain, rellenó el inicio de sesión y analizó las solicitudes (HABRAHABR.RU/POST/136237). Método de trabajo, aunque no universal :). Pero si realmente conoce el interior de su sitio, y usted, como administrador del sistema, debe, entonces, entonces tiene la posibilidad de que, en las situaciones más trágicas, un kit de herramientas más en función de las redes neuronales, el aprendizaje y la recopilación de información anticipada lo ayudará. . En este caso, es extremadamente útil tener acceso. Antes del inicio de DDOS "A, ya que describe casi el 100% de los clientes legítimos, y por lo tanto, un gran conjunto de datos para capacitar a una red neuronal. Además, los ojos en el bar. No siempre son visibles.

Diagnóstico del problema.

El sitio no funciona, ¿por qué? ¿Su dadaim o es un error de JAG no notado por un programador? No importa. No busque una respuesta a esta pregunta. Si cree que su sitio puede atacar, comuníquese con compañías que brinden protección contra los ataques, una serie de servicios anti-DDOS durante el primer día después de que la conexión sea gratuita, y no pierda más tiempo en la búsqueda de síntomas. Centrarse en el problema. Si el sitio trabaja lentamente o no se abre en absoluto, significa que no tiene algo en orden con el rendimiento, y, independientemente de si el ataque de DDOS va o no, lo que, como profesional, está obligado a comprender qué causó eso. Hemos presenciado repetidamente cómo la compañía, experimentando dificultades con el trabajo de su sitio debido al ataque de DDOS, en lugar de encontrar puntos débiles en el motor del sitio, trató de enviar declaraciones al Ministerio de Asuntos Internos para encontrar y castigar a los atacantes. No permita tales errores. La búsqueda de ciberdelincuentes es un proceso difícil y a largo plazo complicado por la estructura y los principios de Internet, y el problema con el trabajo del sitio debe resolverse rápidamente. Hacer especialistas técnicos para encontrar cuál es la causa de la caída del desempeño del sitio, y la solicitud podrá escribir abogados.

7. Usa Profiler y Depurador.

Para la plataforma de creación del sitio web más común, PHP + MYSQL, se puede firmar un cuello de botella utilizando las siguientes herramientas:

  • xdebug Profiler mostrará qué llamadas la aplicación pasa la mayor cantidad de tiempo;
  • el depurador incorporado APD y la salida de depuración en el registro de errores ayudarán a averiguar qué código realiza estos desafíos;
  • en la mayoría de los casos, el perro está enterrado en la complejidad y el peso de las solicitudes a la base de datos. Aquí ayudará a explicar la base de datos SQL incrustada en el motor.

Si el sitio está mintido por casualidad y no perderá nada, apague la red, mire los registros, intente perderlos. Si no se encuentra, pase por las páginas, mira la base.

Se proporciona un ejemplo para PHP, pero la idea es válida para cualquier plataforma. Los productos de software de escritura de desarrolladores en cualquier lenguaje de programación deben poder aplicar rápidamente el depurador y el perfilador. ¡Practica por adelantado!

8. Analizar errores.

Analice el volumen de tráfico, el tiempo de respuesta del servidor, el número de errores. Para esto, ver registros. En NGINX, el tiempo de respuesta del servidor se fija en el registro con dos variables: Solicitud_Time y UpStream_Response_Time. El primero es el tiempo completo de ejecución de la consulta, incluidos los retrasos en la red entre el usuario y el servidor; El segundo informa cuánto backend (Apache, PHP_FPM, UWSGI ...) sirvió como una solicitud. Upstream_Response_Time Valor es extremadamente importante para los sitios con una gran cantidad de contenido dinámico y comunicación activa con la base de datos, no se pueden descuidar. Puede usar una configuración de este tipo como un formato de registro:

Log_format xakep_log "$ remote_addr - $ remote_user [$ TIME_LOCAL]" "" $ Solicitud "$ status $ body_bytes_sent" "$ http_referer" "$ http_user_agent" $ request_time \\ $ upstream_response_time ";;

Este es un formato combinado con los campos de distribución agregados.

9. Seguimiento del número de solicitudes por segundo

También mira el número de solicitudes por segundo. En el caso de NGINX, puede estimar aproximadamente este valor del siguiente comando Shell (la variable Access_log contiene la ruta al registro de consultas de Nginx en el formato combinado):

Echo $ (($ (fgrep -c "$ (env lc_all \u003d c Fecha [Correo electrónico protegido]$ (($ (FECHA (FECHA \\ +% S) -60)) +% D /% B /% Y:% H:% M) "" $ Access_log ") / 60))

En comparación con lo normal para este tiempo, el número de solicitudes por segundo puede caer como caídas y crecer. Crecen en el caso de que viniera una gran botnet, y caerá, si la BotNet victoriosa ha envuelto al sitio, haciéndolo completamente inaccesible para los usuarios legítimos, y al mismo tiempo no solicita estática, y los usuarios legítimos se solicitan. La caída en las consultas se observa justo debido a la estática. Pero, de una forma u otra, estamos hablando de cambios graves en los indicadores. Cuando esto sucede de repente, mientras está tratando de resolver el problema por su cuenta y, si no lo ve de inmediato en el registro, es mejor revisar rápidamente el motor y ponerse en contacto con los especialistas en paralelo.

10. No te olvides de tcpdump

Muchas personas olvidan que TCPDUMP es una herramienta de diagnóstico increíble. Le daré un par de ejemplos. En diciembre de 2011, se descubrió un error en el kernel de Linux cuando abrió una conexión TCP cuando se mostraron las banderas del segmento TCP SYN y RST. El primer BagePTort envió al administrador del sistema de Rusia, cuyo recurso fue atacado por este método, los atacantes aprendieron sobre las vulnerabilidades antes de todo el mundo. Es obvio para él que un diagnóstico de este tipo ayudó. Otro ejemplo: ¡NGINX tiene una propiedad muy agradable: escribe en el registro solo después de que la solicitud completa se entiende completamente. Hay situaciones en las que se encuentra el sitio, nada funciona y no hay nada en los troncos. Todo porque todas las solicitudes que actualmente descargan el servidor aún no se cumplen. Tcpdump ayudará aquí.

Es tan bueno que aconseje a las personas que no usen protocolos binarios antes de conquistar que todo está en orden, porque los protocolos de texto tcpdump deudas "Om es fácil, y binario, no. Sin embargo, el sniffer es bueno como un medio de Diagnóstico: como un medio para mantener la producción "y él es terrible. Puede perder fácilmente varios paquetes a la vez y estropearse la historia del usuario. Es conveniente observar su conclusión, y será útil para los diagnósticos manuales y una prohibición, pero trate de no basar nada crítico en ella. Otro medio favorito para "sujetar las solicitudes" - ngrep, en general, de forma predeterminada, está intentando solicitar en el área de dos gigabytes de memoria no interopedida y solo luego comienza a reducir sus requisitos.

11. ¿Ataque o no?

¿Cómo distinguir un ataque de DDOS, por ejemplo, del efecto de una campaña publicitaria? Esta pregunta puede parecer divertida, pero este tema no es menos complicado. Hay casos bastante curiosos. En algunos buenos, cuando se tensaron y se arruinaron completamente en el almacenamiento en caché, el sitio se ejecuta durante un par de días. Resultó que en unos pocos meses, este sitio está desapercibido por los datos de algunos alemanes y antes de optimizar el almacenamiento en caché de la página del sitio, estos alemanes se cargaron con todas las imágenes durante mucho tiempo. Cuando la página comenzó a ser emitida desde Kesha al instante, el bot, que no tenía tiempo despierto, también comenzó a recogerlos al instante. Fue dificil. El caso es particularmente difícil por la razón por la que si usted mismo cambió la configuración (encendida en caché) y el sitio después de eso dejó de funcionar, entonces, ¿quién, en su opinión, es para culpar? Exactamente. Si está observando un fuerte aumento en el número de solicitudes, busque, por ejemplo, en Google Analytics, que llegó a qué páginas.

Sintonización del servidor web

¿Qué otros son puntos clave? Por supuesto, puede poner el "predeterminado" Nginx y esperar que esté bien. Sin embargo, siempre no sucede bien. Por lo tanto, el administrador de cualquier servidor debe dedicar mucho tiempo a la sintonización fina y la sintonización de NGINX.

12. Limitar los recursos (tamaños de búfer) en Nginx

¿Qué necesitas para recordar primero? Cada recurso tiene un límite. En primer lugar, se refiere a la RAM. Por lo tanto, los tamaños de encabezados y todos los tampones usados \u200b\u200bdeben limitarse a valores adecuados en el cliente y el servidor enteramente. Deben prescribirse en la configuración de NGINX.

  • client_Header_Buffer_Size__ Especifica el tamaño del búfer para leer el encabezado de solicitud del cliente. Si la línea de consulta o el campo de encabezado de la consulta no se coloca completamente en este búfer, se asignan los búferes más grandes especificados por la directiva grande_client_header_buffers.
  • grande_client_header_buffers Establece el número máximo y el tamaño del búfer para leer un encabezado de solicitud de cliente grande.
  • cliente_body_buffer_size Especifica el tamaño del búfer para leer el cuerpo de solicitud del cliente. Si el cuerpo de la consulta es mayor que el tampón deseado, entonces todo el cuerpo de la consulta o solo la parte está escrita en un archivo temporal.
  • client_max_body_Size Especifica el tamaño corporal máximo permitido de la solicitud del cliente, especificado en el campo "Longitud de contenido" del encabezado de consulta. Si el tamaño está más especificado, entonces el cliente devuelve el error 413 (solicitud de solicitud demasiado grande).

13. Personaliza los tiempos de espera en nginx

El recurso es el tiempo. Por lo tanto, el siguiente paso importante debe ser instalar todos los tiempos de espera, lo que nuevamente es muy importante registrarse gentilamente en la configuración de Nginx.

  • reiniciar_timedout_connection en; Ayuda a combatir los enchufes colgados en la fase de espera de aleta.
  • client_Header_TimeOut. Especifica un tiempo de espera al leer el encabezado de solicitud del cliente.
  • client_body_timeout. Especifica un tiempo de espera al leer el organismo de solicitud del cliente.
  • mantener con vida el tiempo de espera. Establece el tiempo de espera durante el cual la conexión Keep-Alive al cliente no se cerrará desde el lado del servidor. Muchos temen pedir una gran importancia aquí, pero no estamos seguros de que este miedo esté justificado. Opcionalmente, puede establecer el valor de tiempo de espera en el encabezado HTTP Keep-Live, pero Internet Explorer es famoso por ignorar este valor.
  • send_timeut. Especifica un tiempo de espera al pasar una respuesta al cliente. Si después de esta hora, el cliente no aceptará nada, la conexión se cerrará.

Inmediatamente la pregunta: ¿Qué parámetros de amortiguadores y los tiempos de espera son correctos? No hay receta universal aquí, en cada situación son las suyas. Pero hay un enfoque comprobado. Debe establecer los valores mínimos en los que el sitio permanece en condiciones de trabajo (en tiempos de paz), es decir, las páginas se administran y las solicitudes se procesan. Esto se determina solo mediante pruebas, tanto desde escritorios como de dispositivos móviles. Algoritmo para encontrar valores de cada parámetro (tamaño del búfer o tiempo de espera):

  1. Yo exhibo un valor de parámetros mínimo mínimo.
  2. Ejecute la prueba de prueba del sitio.
  3. Si toda la funcionalidad del sitio funciona sin problemas, se define el parámetro. Si no, aumentamos el valor del parámetro e vamos a la cláusula 2.
  4. Si el valor del parámetro excede incluso el valor predeterminado es una razón para la discusión en el equipo del desarrollador.

En algunos casos, la auditoría de estos parámetros debe llevar a una refactorización / rediseño de usuarios. Por ejemplo, si el sitio no funciona sin solicitudes de votación largas de AJAX de tres minutos, entonces no necesita recaudar el tiempo de espera, pero un largo sondeo para reemplazar algo más: botnets en 20 mil autos colgando de las solicitudes durante tres minutos, fácil de Mata al servidor barato promedio.

14. Limite los compuestos en NGINX (LIMIT_CONN y LIMIT_REQ)

NGINX también tiene la capacidad de limitar las conexiones, las solicitudes y así sucesivamente. Si no está seguro de cómo se comporta cierta parte de su sitio, idealmente, debe probarlo, entienda la cantidad de solicitudes que soportará y lo registrará en la configuración de NGGINX. Es una cosa cuando el sitio se encuentra y puedes venir a levantarlo. Y otra cosa es: cuando irá a tal punto que el servidor se hundirá. En este caso, a menudo es más fácil reiniciarse que esperar a su regreso triunfante.

Supongamos que el sitio tiene secciones con nombres de habla / descarga y / búsqueda. Al mismo tiempo, nosotros:

  • no queremos bots (o personas con gerentes de descarga recursivos abrumados) para llevarnos una tabla de conexiones TCP con sus descargas;
  • no queremos bots (ni grúas voladoras de motores de búsqueda) agotados los recursos informáticos de DBMS mediante consultas de búsqueda múltiple.

Para estos fines, se utilizará la configuración del siguiente tipo:

Http (limit_conn_zone $ binary_remote_addr zone \u003d download_c: 10m; limit_req_zone $ binary_remote_addr zone \u003d search_r: 10m \\ rate \u003d 1r / s; servidor (ubicación / descarga / (limit_conn download_c 1; # otra ubicación de configuración) Ubicación / Búsqueda / (Limit_req Zone \u003d BUSCH_R BURST \u003d 5; OTROS CONFIGURACIÓN DE UBICACIÓN)))

Por lo general, tiene un significado directo para establecer limitaciones LIMIT_CONN y LIMIT_REQ para ubicaciones, en las cuales hay scripts caros (en el ejemplo, se especifica la búsqueda, y esto no es rentable). Las restricciones deben ser elegidas, guiadas por los resultados de las pruebas de carga y regresión, así como el sentido común.

Preste atención al parámetro 10M en el ejemplo. Significa que el cálculo de este límite destacará un diccionario con un búfer de 10 megabytes y un megabyte más. En esta configuración, esto le permitirá realizar un seguimiento de 320,000 sesiones TCP. Para optimizar la memoria ocupada como una clave en el diccionario, la variable $ binary_remote_addr, que contiene la dirección IP del usuario en forma binaria y toma menos memoria que la variable de cadena habitual $ remote_ADDR. Cabe señalar que el segundo parámetro a la directiva LIMIT_REQ_ZONE no puede ser solo IP, sino que también cualquier otra variable Ngginx disponible en este contexto es, por ejemplo, en el caso de que no desea proporcionar un modo de proxy más ahorrador, puede Use $ binary_remote_addr $ http_user_agent o $ binary_remote_addr $ http_cookie_myc00kiez, pero es necesario usar tales diseños con precaución, ya que, a diferencia de 32 bits $ binary_remote_addr, estas variables pueden ser significativamente más largas y los "10 m" declarados pueden ser sostenidos.

Tendencias en DDOS.

  1. Crece continuamente el poder de las redes y los ataques de nivel de transporte. El potencial del ataque promedio de ataque a inundación ya ha logrado 10 millones de paquetes por segundo.
  2. La demanda especial recientemente disfruta de los ataques a DNS. Las solicitudes de DNS válidas de DNS de UDP, con las direcciones IP de origen de Spoof'led, son una de las implementaciones más comunes y complicadas en términos de ataques de contrafoner. Muchas grandes empresas rusas (incluido el alojamiento) se han experimentado en problemas recientes como resultado de los ataques en sus servidores DNS. Cuanto más lejos, esos ataques tales serán más, y su poder crecerá.
  3. A juzgar por las características externas, la mayoría de los botnets no se gestionan de forma centralizada, sino a través de la red de pares a igual. Esto le da a los atacantes la oportunidad de sincronizar las acciones de la botnet a tiempo, si antes los equipos de administración se extienden en una botnet de 5 mil autos para docenas de minutos, ahora el proyecto de ley va por unos segundos, y su sitio puede experimentar inesperadamente un fotográfico instantáneo. Incremento en el número de solicitudes.
  4. La proporción de bots, equipada con un motor de navegador completo con JavaScript, sigue siendo pequeño, pero crece continuamente. Tal ataque es más difícil de eliminar las artesanías incorporadas, por lo que las auto-las reafirmaciones deben seguir esta tendencia con el miedo.

preparando el sistema operativo.

Además de la configuración fina de NGINX, debe encargarse de la configuración de la pila de red del sistema. Al menos, inmediatamente enciende net.ipv4.tcp_syncookies en Systl, para protegerse del ataque de syn-alimento de un tamaño pequeño.

15. Tyi Yard

Preste atención a las configuraciones más avanzadas de la parte de la red (kernel) nuevamente por los tiempos de tiempo y la memoria. Hay más importantes y menos importantes. En primer lugar, debe prestar atención a:

  • net.ipv4.tcp_fin_timout. El tiempo que pasará en la fase TCP de Fin-Wait-2 (esperando el segmento de fin / ACK).
  • net.ipv4.tcp _ (, r, w) mem TCP Sockets que reciben el tamaño del búfer. Tres valores: valor mínimo, valor predeterminado y máximo.
  • net.core. (R, w) mem_max Lo mismo para los buffers tcp.

Con un canal de 100 Mbps, los valores predeterminados son adecuados de alguna manera; Pero si tienes al menos Gigabit en el Candide, entonces es mejor usar algo como:

Systl -w net.core.rmem_max \u003d 8388608 systl -w net.core.wmem_max \u003d 8388608 systl -w net.ipv4.tcp_rmem \u003d "4096 87380 8388608" systl -w net.ipv4.tcp_wmem \u003d "4096 65536 8388608" systl - w net.ipv4.tcp_fin_timeut \u003d 10

16. Revisión / Proc / SYS / NET / **

Ideal para aprender todos los parámetros / proc / sys / net / **. Es necesario ver qué tan diferentes difieren del valor predeterminado y comprende lo adecuadamente exhibidos. Linux Developer (o administrador del sistema), que desmonta el servicio de Internet sujeto a ella y desea optimizarlo, debe leer la documentación de todos los parámetros de la Pila de energía nuclear con interés. Tal vez encontrará variables específicas para su sitio, lo que ayudará a no solo proteger el sitio de los intrusos, sino que también acelerará su trabajo.

¡No tengas miedo!

Los exitosos ataques de DDOS día tras día, el comercio electrónico pronega los medios de comunicación, los medios de comunicación, los sistemas de pago más grandes se envían a Knockout. Millones de usuarios de Internet pierden acceso a información crítica. La amenaza es urgente, por lo que debe cumplirlo en su cumplimiento. Realice su tarea, no tenga miedo y mantenga la cabeza fría. No eres el primero y no el último que se encontrará con un ataque de DDOS en su sitio web, y en su poder, guiado por su conocimiento y sentido común, para reducir las consecuencias del ataque al mínimo.

Hace algún tiempo, escribí un artículo detallado sobre la instalación y configuración del servidor web sobre la base de las últimas versiones. Allí mencioné que este es el primer artículo del ciclo de la zona del servidor web. Hoy te diré tan simple y espinoso significa protegerse de simple. dDOS. Ataques.

Inmediatamente haré una reserva sobre la palabra DDOS, que no es del todo apropiada aquí, pero no se me ocurrió cuánto más popular explica de qué estamos hablando. Desde el ataque completo de DDOS, no podrá protegerse como parte de la configuración del servidor web. Simplemente se obstruirá con todo el canal y el servidor dejará de responder. Si la alimentación del servidor no es suficiente para procesar y filtrar las solicitudes entrantes, se caerá para hacerlo allí. Para una protección completa contra DDOS, necesita fondos de pleno derecho que sean costos financieros tangibles. Para obtener más información con la teoría de acuerdo con la lectura en un artículo separado.

Debe entenderse que la protección contra DDOS debe ser adecuada para la importancia del recurso. Si tiene un blog personal, que no trae beneficios significativos, luego paga la protección contra DDOS sin sentido. Sólo es suficiente para recostarse por un tiempo o hacer protección por su cuenta. En general, siempre es necesario medir el costo del tiempo de inactividad con el costo de protección y sobre la base de esto para decidir la viabilidad de uno u otro método.

Daré consejos para proteger contra los ataques simples de bots o algunas plagas y paquetes pequeños, que sin acciones adecuadas de su parte pueden poner su sitio web o servidor sin ningún problema. Aquí hay un ejemplo simple. No hay muy débil, a bordo de cuales 2 yardas, 8 gigs operativos y un disco SSD.

El servidor está configurado por mi artículo anterior, la referencia a la que condujo al principio. En el servidor, se implementará el sitio de WordPress con algunos contenidos. Y tenemos una plaga, que en su servidor ejecuta la prueba simple desde Apache hasta el rendimiento del servidor web:

# AB -C 50 -N 30000 "https://hl.zeroxzed.ru/"

Sólo 50 arroyos paralelos. Lo que vemos en su servidor web:

No es una imagen muy agradable. El servidor está cargado por un 100%. Y aunque normalmente procesa las solicitudes y en general funciona correctamente. Ni siquiera se reduce la velocidad, pero aún así es malo. ¿Y si hay 3 servidores y 100 arroyos en cada uno? No hay problemas, incluso para una prueba, quítate a diferentes hosters en una máquina virtual y ejecute esas cosas en ellos imitando el ataque de DDOS.

En general, si no realizó ninguna protección en su servidor, entonces nadie podrá brindar algún inconveniente sin problemas especiales. Provisto de un "ataque" de este tipo no es difícil. Entonces te diré cómo hacerlo.

Protección DDOS usando IPTables

Para protegerse contra el ataque más sencillo, usaremos firewall. iptables, Kernel del módulo ipset. Para almacenar una gran lista de iP y scripts auto-escritos. Para Firewall, vea mi artículo -. Aquí no me detendré.

Pregunta de configuración de IPSet que consideré en detalle en mi artículo por. Le aconsejo que vea el material, ya que está directamente relacionado con este artículo y lo complementa.

Por lo tanto, procederemos a crear nuestra simple protección contra los ataques de DOS con una gran cantidad de conexiones de una dirección IP. Para empezar, marque el comando que nos mostrará la cantidad de conexiones de cada dirección IP:

# Netstat -ntu | AWK "(Imprimir $ 5)" | GREP -VE "(Dirección | Servidores | 127.0.0.1)" | CUT -D: -f1 | Ordenar | UNIQ -C | Ordenar -n | Sed "s / ^ [\\ t] * //"

Aquí es un violador de nuestra tranquilidad, tratando de organizar el jefe en nuestro servidor. Ahora dibuje un script que bloquee a todos los que establecen más de 50 conexiones simultáneas con el sitio.

#! / Bin / sh netstat -ntu | AWK "(Imprimir $ 5)" | GREP -VE "(Dirección | Servidores | 127.0.0.1)" | CUT -D: -f1 | Ordenar | UNIQ -C | Ordenar -n | Sed "s / ^ [\\ t] * //" | Awk "(Si ($ 1\u003e 50) Imprima $ 2)"\u003e /root/ddos/much_conn.txt Sleep 3 List \u003d $ (cat /root/ddos/much_conn.txt) para ipnet in $ List do ipset -a muchy_conn $ ipnet realizado

En principio, no hay nada que comentar aquí. Tomamos una lista de conexiones que acaba de resultar, comparar la primera columna en ella, si es mayor que 50, entonces el resultado de la segunda columna, donde se registra la dirección IP, pase al archivo.

A continuación, lea este archivo y agregue todas las direcciones IP a la lista IPSet llamada Much_Conn. Anteriormente es necesario crearlo. Hablé de esto en detalle en el artículo en el que el Lindero LED anteriormente, pero repito una vez más aquí:

# ipset -n mucho_conn ipphash

Ver el contenido de la lista puede ser comando:

# ipset -l mucho_conn

Ahora necesita agregar una regla a IPTables mediante la cual se bloqueen todas las conexiones de la lista IPSet especificada.

# IPTables -A INPUT-M set - Set-Set Much_Conn SRC -J DROP

Por si acaso, le advierto que revise su acceso a la consola del servidor antes de configurar las reglas de IPTables. Todo sucede, simplemente puede estar equivocado, copiar y pegarlo, no lo que necesita.

Todos, bloqueamos a todos los que crean conexiones de spam masivas al servidor. El límite en 50 conexiones se puede corregir en el lugar, es posible que deba reducirse si alguien abrirá menos conexiones de una IP.

El único momento que quiero decir. Yo mismo no revisé cuántas conexiones abren los bots de búsqueda cuando llegan al sitio. Sospecho que claramente no es 50 y ni siquiera 30, pero probablemente no lo comprueba. En general, tenga cuidado al usar esta herramienta.

Este script se puede empujar en la corona y correr cada minuto. Pero personalmente, no lo haría. Recomiendo monitorear los recursos del servidor y ejecutar herramientas similares solo si el servidor funciona en el límite de sus capacidades y ingresaste manualmente y se aseguró de que alguien se spammed con conexiones. Después de eso, condujo por algún tiempo este guión de la corona. Cuando DDOS se detiene, desconecta.

Sería bueno, de alguna manera, limpiará automáticamente la lista de prohibido, eliminando desde allí aquellos que no están conectados a usted durante un día, pero esto complica enormemente la tarea. Necesita al menos un registro en la lista de bloqueo, guarde el último tiempo de apelación. Procesando todo esto, calculando. En general, la tarea es aunque no es muy difícil, pero no trivial. No quería hacer esto.

Aunque no es muy elegante, sino una solución simple a este problema. Cree una lista de IPSet con una grabación de tiempo de vida específica con se acabó el tiempo.. Por ejemplo, como este:

Ipset -n mucho_conn iphash timeout 3600

En este caso, el registro IP almacenado IP en la lista IPSet se almacenará durante 3600 segundos o 60 minutos.

Debe entenderse que en este ejemplo con 1 dirección IP para usar IPSet no hay un punto, puede prohibir inmediatamente los medios de los iPtables en sí. Ipset se necesita solo cuando esta lista es de al menos cientos de líneas. Si hay varias docenas de direcciones, suficientes iptables.

Análisis del servidor de registro del servidor web para proteger contra DDOS

Considere otro tipo simple, pero aún más complejo de ataque de DDOS cuando las consultas de tipo provienen de diferentes IP. Es decir, Botnet simple, tal vez incluso ensamblado con las manos de varios servidores VDS baratos. Las conexiones simultáneas no serán mucho, pero si tiene un sitio pesado y un atacante encontrará su lugar débil (por ejemplo, una búsqueda), puede ser suficiente para poner el sitio.

Estaremos prohibidos a través de IPTables, y la lista de direcciones para la prohibición se extraerá de los registros del servidor web. Para hacer esto, debe habilitarse las solicitudes de registro al servidor web. Por ejemplo, en Nginx, este es responsable de esta configuración de un host virtual:

Access_log /web/sites/hl.zeroxzed.ru/log/Access.log Principal;

No analizaremos todo el archivo de registro cada vez. Esta operación en sí mismo calentará el servidor web. Tome las últimas 1000 líneas del registro de registros y considere la cantidad de conexiones de una IP con contenido de tipo, como la solicitud de página principal por HTTP 1.0, "GET / http / 1.0". Si observa otra característica permanente de la botnet que le ataca, use. Puede ser el mismo agente de usuario o algo más. Supongamos que si el atacante caerá en un lugar vulnerable, será la dirección de esta página.

# Cola -1000 /web/sites/hl.zeroxzed.ru/log/ssla-access.log | EGREP "GET / http / 1.0" | Awk "(Imprimir $ 1)" | Ordenar -n | UNIQ -C.

El resultado de este comando será de aproximadamente tal lista.

En este caso, usé una condición de poco diferente y simplemente trajo una lista de todos aquellos que golpeaban a la página principal. Pero aquí puedes ver el infractor que puedes prohibir.

Dibujamos similares al script anterior para bloquear automáticamente a aquellos que envían demasiadas solicitudes a nuestro sitio y crean problemas de rendimiento. Repito una vez más si no hay problemas con la productividad, no recomiendo hacer movimientos adicionales.

#! / Bin / sh tail -1000 /web/sites/hl.zeroxzed.ru/log/ssla-Access.log | EGREP "GET / http / 1.0" | Awk "(Imprimir $ 1)" | Ordenar -n | UNIQ -C | Ordenar -n | Cola -n100 | Awk "(Si ($ 1\u003e 50) Imprima $ 2)"\u003e /root/ddos/much_gets.txt Sleep 3 List \u003d $ (Cat /root/ddos/much_gets.txt) para ipnet in $ List do ipset -a Much_gets $ ipnet realizado

Aquí hacemos lo mismo que antes. Aquellos que hicieron más de 50 solicitudes idénticas en nuestra máscara para las últimas 1000 líneas en el archivo de registro se envían a la prohibición.

Llamo la atención sobre la cadena en la que filtrará las solicitudes. En este caso, solo mostré un ejemplo. No tome y aplique en el formulario, como lo muestro. Demuestro capacidades técnicas y enfoque. Necesitas configurar y calibrar el sistema en mi lugar. Es importante entender esto y no aplicar la decisión sin pensar. Solo habrá daño.

No se olvide de crear una lista separada en IPSet y agregue una regla separada a iPapables. Puede usar la lista ya existente y la regla agregada del ejemplo anterior, pero recomiendo resolverlo todo. Tan más conveniente para el análisis posterior.

Durante el ataque de DDOS, agregue esta regla a Cron y realice cada minuto. Después de completar el ataque, el script se puede desactivar. En principio, puede irte constantemente, pero aquí debes pensar cuidadosamente y estimar cómo debería mirar. El principio principal no es dañino.

Bots Banya con referente incorrecto

194.67.215.242 - - "POST /index.php http / 1.1" 200 913 " g0dfw4p1.ru."" Mozilla / 5.0 (Windows NT 6.0; RV: 34.0) Gecko / 20100101 Firefox / 34.0 "" - "

El campo de referencia correcto debe contener HTTP o HTTPS, o estar vacío. Todo lo que de lo contrario, puede bloquear o devolver de manera segura el estado de error. Agregue aproximadamente este diseño a la configuración de Host Virtual, en la sección servidor ().

Si ($ http_referer! ~ * ^ ($ | Http: // | https: //)) (devuelva 403;)

Después de eso, revise la configuración de NGGINX y lo vuelva a líneas.

# Nginxt -t # nginx -s recargar

Si saca algún tipo de bot con un referente específico, puede prohibirlo. Para hacer esto, puede agregar una condición o cambiar. Por ejemplo, como este:

If ($ http_referer \u003d "https://bots.ru/dostanim_tebya.html") (devuelva 403;)

Además, puede todos estos bots utilizando un script simple para prohibir los iptables, como en los ejemplos anteriores. Por cierto, se pueden prohibir inmediatamente, visualizando las solicitudes de HTTP incluso antes de que caigan a Nginx, por ejemplo, usando NGREP, pero esta es una tarea más difícil. No todos saben cómo hacerlo, hay matices allí, y todo está familiarizado con NGINX. No será mucho dificultad para implementar este método.

Protección DDOS con módulos NGINX - LIMIT_CONN y LIMIT_REQ

Voy a compartir otra forma sencilla de reducir la carga en el servidor y protegerse parcialmente contra DDOS utilizando los módulos NGINX: limit_conn. y limit_req. No es difícil configurarlos, en parte, el resultado del primer módulo se verá intersectando con los dos primeros métodos de protección DDoS descritos al principio. Es más sencillo personalizar, por lo que si no ha enfrentado con esos métodos, puede intentarlo.

El significado de estos módulos es que uno puede limitar la cantidad simultánea de conexiones permitidas con el sitio, y otro número de conexiones por unidad de tiempo.

Restringiré en mi ejemplo el número de conexiones simultáneas al sitio de un número IP 50, y el número de solicitudes simultáneas al contenido dinámico de no más de 2 por segundo. Esto se resolverá un chapoteo ( ráfaga.) Consultas hasta 5. Explicaré cómo entender este salpicaduras, ya que no entendí de inmediato qué significa exactamente.

Si hemos excedido el número de solicitudes establecidas por segundo, entonces su ejecución se retrasa, y se integran en la cola por la velocidad especificada. El tamaño de esta cola es igual al valor de la explosión. Todas las solicitudes que no son suficiente espacio en la cola se completarán con un error. Es decir, si las solicitudes son 4 por segundo, entonces 2 se realizarán de inmediato y otras 2 estarán en la cola. Y si es 10, entonces 2 se realizarán de inmediato, 5 estará en una cola para la ejecución de 2 piezas por segundo, y el resto se completará con un error.

Según estas condiciones, la restricción de la conexión debe instalarse en el contexto. servidory acceso al contenido dinámico en el apropiado localización. Al mismo tiempo, la descripción de las zonas que usará las directivas deben estar ubicadas en http..

Aquí hay un ejemplo de la configuración de NGINX para la implementación de restricciones establecidas para protegerse contra los ataques de DDOS.

Http (... limit_conn_zone $ binary_remote_addr zone \u003d perip: 10m; limit_req_zone $ binary_remote_addr zone \u003d dynamic: 10m tasa \u003d 2r / s; servidor (... limit_conn perip 50; ... ubicación ~ \\ .php $ ( ... limit_req zone \u003d ráfaga dinámica \u003d 5 Nodeley; ...)))

Después de eso, reinicie NGINX y verifique cómo funcionan los límites. El límite en el número de solicitudes dinámicas realizadas se puede ver simplemente presionando muy rápidamente F5 en el navegador. Si eres suficiente hábil, entonces verás una foto.

y entrada en el registro con errores:

2017/11/30 15:25:26 9773 # 9773: * 51482 Limitación de solicitudes, exceso: 5.664 por zona "dinámica", cliente: 195.91.248.43, servidor: hl.zeroxzed.ru, solicitud: "GET / http / 2.0 ", Host:" hl.zeroxzed.ru ", referente:" https://hl.zeroxzed.ru/2013/03/15/Featured-image-Vertical/ "

El límite en el número de conexiones puede verificar la misma utilidad abMe conté en la introducción.

017/11/30 15:38:56 9773 # 9773: * 53938 Limitar las conexiones por zona "Perip", Cliente: 94.142.141.246, Servidor: hl.zeroxzed.ru, Solicitud: "GET / WP-Content / Subir / 2013 /03/the-dark-knight-rises.jpg http / 1.0, host: "hl.zeroxzed.ru"

Simplemente no olvide que la prueba debe iniciarse no en una página específica, se lo tomará para limitar el rendimiento del contenido dinámico, pero para otra cosa. Por ejemplo, como en mi ejemplo, en la imagen.

Al emitir restricciones, no se olvide de controlar si los bots de búsqueda no caen en estas restricciones. De forma predeterminada, intentan no crear una mayor carga en el sitio. Si se desea, el robot yandex se puede especificar a través de robots.txt, qué tan rápido para escanear su sitio. Y el robot Google puede hacer lo mismo a través de Webmaster.

Conclusión

Revisé las formas más simples de proteger al servidor web de ataques DDOS no menos simples que son más como una mimera. Un ataque serio que simplemente llenará todo el canal de canal entrante, ni siquiera notará nuestra protección. Sin embargo, tuve que asegurarme de que la efectividad de estos métodos en el reflejo de algunos ataques.

Todavía hay una gran cantidad de servidores web que ni siquiera están protegidos incluso de la utilidad. ab :) Sé de lo que estoy hablando, ya que tales servidores se enfrentan a trabajar. Y también hay muchos tipos de robots y programas simples que se pueden encontrar en Internet y el recubrimiento, los sitios en negrita que no están listos para las cargas en absoluto.

Hay otra forma, lo mismo que describí, y efectivo de los bots que no entienden las redirecciones y las cookies. No lo describí, porque nada que verificar, y estaba cansado de escribir un artículo, resultó muy grande. Lo escribí y lo edité durante mucho tiempo, recopilando scripts y configuraciones en diferentes servidores y recordando que una vez lo hice. Luego revisó todo esto por separado.

La esencia de la protección es que con la ayuda de NGINX emitimos cookies específicas al usuario, y luego redirigen la página solicitada. Si el BOT no entiende las cookies o las redirecciones, entonces se cae. Los usuarios normales no notan nada. Tal vez más tarde le informaré sobre este método y agregaré un artículo. Mientras tanto. Estaré encantado de comentar sobre los méritos en los artículos.

Curso de Linux en línea

Si tiene el deseo de aprender a construir y mantener sistemas altamente accesibles y confiables, recomiendo familiarizarse con curso en línea "Administrador Linux" en Otus. El curso no es para principiantes, para la admisión, necesita conocimientos básicos en las redes e instalar Linux a Virtual. La capacitación dura 5 meses, después de lo cual los graduados exitosos del curso podrán pasar entrevistas de socios. ¿Qué te dará este curso?
  • Conocimiento de la arquitectura de Linux.
  • Masterización de métodos modernos y análisis de datos y herramientas de procesamiento de datos.
  • La capacidad de seleccionar la configuración de las tareas necesarias, administrar procesos y garantizar la seguridad del sistema.
  • Posesión de los principales instrumentos de trabajo del administrador del sistema.
  • Comprender las características del despliegue, la configuración y el mantenimiento de redes construidas sobre la base de Linux.
  • La capacidad de resolver rápidamente problemas emergentes y garantizar una operación estable e ininterrumpida del sistema.
Compruebe usted mismo en la prueba de introducción y vea más del programa de software.

Los proyectos web se encuentran a menudo con los ataques de DDOS. Hoy consideramos una de las formas básicas de protegerlo de la inundación HTTP.

Introducción:

Recientemente, un ataque le sucedió a uno de los proyectos de mi amigo, lo más probable es que atacó a un pirata informático inexperto, ya que el ataque se llevó a cabo de una dirección IP.

Durante el análisis de los registros, se encontró que el atacante está intentando cargar muchas veces la página principal, y el servidor intenta procesar estas solicitudes y no puede.

Para proteger contra los ataques de este tipo, utilizaremos el servidor proxy nginx y el módulo estándar NGX_HTTP_LIMIT_CONN_MODULE

Ngx_http_limit_conn_module Módulo le permite limitar el número de conexiones en una clave dada, en particular, el número de conexiones de una dirección IP.

No todas las conexiones se tienen en cuenta, pero solo aquellas en las que se procesan las solicitudes procesadas por el servidor, y el encabezado de solicitud ya está leído.

En otras palabras, podemos poner un límite en el número de solicitudes y conexiones de una dirección IP. Esto es suficiente para proteger contra los débiles y medios ataques de inundación HTTP.

Para establecer la restricción, usaremos la directiva LIMIT_CONN.

Configuración de Nginx para proteger contra DDOS:

lIMIT_CONN:

lIMIT_CONN Especifica el número máximo permitido de conexiones de una IP. Si se excede este número, en respuesta a la solicitud, el servidor devolverá un error 503 (Servicio temporalmente no disponible).

Después de recibir un error 503, el atacante dejará de crear una carga útil en el servidor de la base de datos, como MySQL, lo descargó.

Pero antes de usar LIMIT_CONN para proteger contra los ataques de DDOS con NGINX, debemos averiguar e instalar la directiva LIMIT_CONN_ZONE

limit_conn_zone:

Sintaxis: limit_conn_zone Tecla de zona \u003d. nombre: Tamaño;
Establece los parámetros de la zona de memoria compartida que almacena el estado para diferentes valores clave. El estado en particular contiene el número actual de conexiones. Como clave, puede usar texto, variables y combinaciones de los mismos. Las solicitudes con un valor de clave vacío no se tienen en cuenta.
Ejemplo de uso:

Ejemplo de uso

limit_conn_zone $ binary_remote_addr zone \u003d addr: 10m;

Esta directiva es necesaria para almacenar un estado para cada dirección IP. ¡Es importante! La presente Directiva debe ir a NGINX.CONF inmediatamente después de HTTP (.

Ejemplo de configuración de NGINX.CONF para LIMIT_CONN_ZONE:

Ejemplo de configuración

http (limit_conn_zone $ binary_remote_addr zone \u003d addr: 10m; ...

http (

limit_conn _ zona $ binary_remote_addr zone \u003d addr: 10m;

. . .

Después de instalar la directiva LIMIT_CONNN_ZONE, pasaremos a la instalación LIMIT_CONN.

Sintaxis: limit_conn.número de zona;

Tenga en cuenta que la zona debe tomarse de la zona instalada en LIMIT_CONN_ZONE, en nuestro caso Addr.

El 3er parámetro "Número" denota el número de las conexiones Abrir en la misma hora desde una dirección IP.

Para limitar 3 conexiones simultáneas para la zona ADDR, debe escribir lo siguiente:

limit_conn.addr 3;

Un ejemplo de una configuración para la protección contra los ataques de DDOS usando NGINX y LIMIT_CONN:

http (limit_conn_zone $ binary_remote_addr zone \u003d addr: 10m; ... servidor (escucha 80; ... ubicación / (limit_conn addr 3; ...)))

http (

limit_conn _ zona $ binary_remote_addr zone \u003d addr: 10m;

En realidad, ¿por qué prohibir el acceso al sitio de base geográfica? Sí, solo el 80% de las direcciones IP que participan en el ataque de DDOS, por regla general, pertenecen a los países cuyos residentes nunca entrarán en este sitio, naturalmente, es puramente individualmente para cada recurso y, si sabe que parte de sus visitantes proviene de Etiopía o Chile , Bloquearlos, casi no quieres. Para la mayoría de mis clientes, la ubicación geográfica de los visitantes generalmente se limita a Europa y la antigua URSS, el resto puede ser ignorado de manera segura.

Método descrito para bloquear a los países de despido utilizando un servidor web nginx y geoip. El módulo, solo, y aún más, el problema no resolverá el problema, es solo uno, de una serie de todo tipo de medidas (configurando el kernel, el firewall, los servicios de tiempo completo, el software adicional), para minimizar el Daño aplicado por este tipo de servidor de ataque y sitios, se encuentra.

Proyectos que a menudo necesitan este tipo de protección, intento recaudar inicialmente sin la participación del servidor web Apache, es decir, en un paquete nGINX - FASTCGI..

Entonces, ponga y configure todo este hogar en el servidor que ejecuta el sistema operativo. FreeBSD 8.2 y 64..

Eso sería módulo geoip. Ganado, se requerirá una biblioteca adicional, establecemos:

FreeBSD82 / USR / Puertos # Make -C NET / GEOIP Instale Clean

FreeBSD82 / USR / Puertos # Make -C www / nginx instalar limpio

en las opciones de montaje necesitas para habilitar geoip. módulo nginx, Poner un tanque opuesto al artículo Habilitar el módulo http_geoip.

A continuación, vamos a la página http://www.maxmind.com/app/geolitecountry y descargar Último formato binario del país de geolitaEsta es una opción gratuita de la base de los países y sus bloques correspondientes de direcciones IP. Desembale el archivo y tire el archivo. Geip.dat. en la carpeta Usr / local / etc / nginx / conf / geo. Queda por editar las configs. nginx.

Abierto nginx.conf., Añadir a la sección http. SIGUIENTE DIRECTIVA DE BLOQUE:

Geoip_country /usr/local/etc/nginx/conf/geo/geoip.dat; # Conectar la base de geip Mapa $ GeoIP_COUNTRY_CODE $ BAD_COUNTRY ( # Mapa del mapa crea variables cuyos valores dependen de otras variables, una cosa muy útil Predeterminado 1; # Valor por defecto incluir geo / good_countries; # Incluya el archivo, de vuelta a él más tarde más tarde }

Este bloque mapa, significa que todos los países están en la base de datos, están prohibidos por defecto, y en el archivo good_COUNTRIES.Los países permitidos serán listados. Si, por ejemplo, la situación cuando los países permitidos son más de lo que están prohibidos, puede invertir fácilmente esta lógica y crear un archivo bad_countries. Con la lista de países prohibidos, lo que permite a todos los demás.

Ahora anfitrión de la configuración. Prefiero mantener los hosts en una carpeta separada, por ejemplo hospedadores., Cada uno en tu archivo.

Servidor (Escucha IP: 80; server_name testhost.com; si ($ bad_country) ( # Si esta variable está instalada, es decir, si el país no está en la lista en el archivo Good_Countries Retorno 444; # emitiendo un cliente una respuesta en blanco (no hay necesidad de dar 403 error o alguna otra) } ................. ................. }

Ahora vuelve al archivo good_COUNTRIES.. Todo es extremadamente simple aquí, los países que pueden acceder al sitio se enumeran en el siguiente formato:

TM 0; Ua 0; Uz 0; Ru 0; ....... ....... etc.

Es decir, sería suficiente para cualquier país, es suficiente para agregar su código de dos letras y 0, después de lo cual reinicie la configuración de NGINX:

FreeBSD82 / # NGINX -s Reload

Los códigos de los países, dos veces, son a través de Google.

Comprobar, ejecutando geoip. El módulo o no, es posible, eliminar de la lista de países permitidos, y tratar de ingresar al sitio.

En realidad, tal es el esquema general de usar el módulo GEOIP NGINX para proteger contra los ataques de DDOS.

Naturalmente, puede idear muchas otras opciones para usar este módulo para resolver diversas tareas asociadas con la ubicación geográfica del visitante del sitio.

Puede sentarse así, no tocas a nadie, y luego llamas y dices que los servicios funcionan lentamente, los sitios abren durante 2-3 minutos logrados para producir 504 errores.
Trepar molesto en cactus, y hay:

A continuación se presentan los comandos que lo ayudarán a comprender lo que sucedió, y es exactamente DDOS.

Primero, recomiendo leer el artículo en detalle en detalle que los registros son interesantes para nosotros cómo leer la salida de comando superior y cómo usar el equipo de PS. Todos ellos serán útiles para entender qué anfitriones hemos sufrido un ataque y qué cuellos de botella hay en el servidor.

¿Qué equipos, y qué podemos determinar?

Para comenzar, puede ver el número de procesos de ejecución de Apache. Si más de 20-30 son más de 20-30, entonces algo no es así.

Miramos el número de procesos de Apache en Debian:

PS AUX | Grep apache | Wc -l.

Miramos la cantidad de procesos Apache en Centlos:

PS AUX | Grep httpd | Wc -l.

Este comando podemos ver el número de conexiones al servidor:

CAT / PROC / NET / IP_CONNTRACK | Wc -l.

También el indicador de que el servidor llega al servidor puede servir como el número de conexiones en 80 o 443 puertos. Aquí están los equipos capaces de mostrar este número:

Netstat -na | Grep: 80 | Wc -l netstat -na | GREP: 443 | Wc -l.

Todavía hay una variedad de DDOD como SYN. A continuación se muestra un comando que le permite determinar el número de solicitudes syn de los mismos 80 y 443 puertos:

Netstat -na | Grep: 80 | Grep syn | Ordenar -u | Más NetStat -na | GREP: 443 | Grep syn | Ordenar -u | Más

Y este comando muestra el número de solicitudes syn:

Netstat -n -t | Grep syn_recv | Wc -l.

El siguiente comando nos permitirá entender qué dominio es la mayoría de las solicitudes de todas las solicitudes:

Tcpdump -npi eth0 puerto dominio

Ahora veamos cuántas solicitudes proviene de cada IP. Este comando muestra todos los puertos:

Netstat -ntu | AWK "(Imprimir $ 5)" | CUT -D: -f1 | Ordenar | UNIQ -C | Ordenar -nr | Más

comandos similares:

Netstat -anp | GREP "TCP \\ | UDP" | | AWK "(Imprimir $ 5)" | CUT -D: -f1 | Ordenar | UNIQ -C | Ordenar -n netstat -antu | Awk "$ 5 ~ /: / (Split ($ 5, a": "); IPS [A] ++) End (para (IP in IPS) Imprime IPS, IP |" Sort -K1 -NR ")"

Este comando muestra el número de solicitudes solo a 80 puertos:

Netstat -ntu | GREP ": 80 \\" | AWK "(Imprimir $ 5)" | CUT -D: -f1 | Ordenar | UNIQ -C | Ordenar -nr | Más

Este comando muestra todas las solicitudes de 80 puertos, sin contarlos, es decir, "Simplificado" pero "Opción de salida" más completa ":

Netstat -na | Grep: 80 | Ordenar | UNIQ -C | Ordenar -nr | Más

Cálculo de la IP más activa también puede ver qué puertos van de las solicitudes de TI. Aquí, por ejemplo, IP 127.0.0.1 están sustituidos:

Netstat -na | GREP 127.0.0.1

Por cierto, si no está configurado por el estado del servidor en Apache, entonces el estado de este servidor se puede ver en el CLI:

Estado apachectl.

Archivos de registro

Los registros globales de Apache, Debian, suelen estar allí:

  • /var/log/apache2/error.log.
  • /var/log/apache2/Access.log.
  • /var/log/httpd/error.log.
  • /var/log/httpd/access.log.

Los registros globales de Nginx están ahí:

/var/log/nginx/error.log.
/var/log/nginx/access.log.

Además, no se olvide de ver los registros de hosts virtuales si los hosts están configurados. Estaremos interesados \u200b\u200ben el registro más grande que "crece" delante de.

Es necesario buscar en estos registros una anomalía, a saber, el mismo tipo de solicitudes sin agentes de usuario (o con la misma), una gran cantidad de solicitudes de la misma IP, solicita sin especificar un host virtual, etc.

Para identificar IP específicas con el número de solicitudes al sitio, puede este comando:

CAT ACCESS.LOG | Awk "(Imprimir $ 1)" | Ordenar | UNIQ -C.

También puede obtener estadísticas sobre las solicitudes con la agrupación IP utilizando la utilidad LOGTOP.

Para empezar, instale esta utilidad:

Apt-get install git libncurses5-dev uthash-dev gcc # en caso de que no tenga paquetes para la operación correcta git git clone https://github.com/julienpalard/logtop.git

Y ahora obtendremos estadísticas:

TAIL -F ACCESS.LOG | AWK ("Imprimir $ 1; fflush ();") | LOGTOP.

El siguiente comando nos ayudará a identificar a los agentes de usuario populares:

CAT ACCESS.LOG | Awk -f \\ "" (Imprimir $ 6) "| Ordenar | UNIQ -C | CORTE -N -N

¿Cómo bloquear?

De todos modos, debes soportar iptables. Lo más probable es que pueda no estar configurado, especialmente si no sabe qué es. Anteriormente, ya escribí un artículo sobre cómo usarlo: "", por lo que solo daré los comandos necesarios para resolver el problema aquí y ahora.

Así es como es posible. bloquear las solicitudes de TCP para 80 puertos de una IP específica:

IPTables -a input -p TCP --DPORT 80 -s 12.34.56.78 -J DROP

Así es como nosotros consultas de bloqueo para todos los puertos de una IP específica:

IPTables -A INPUT -S 12.34.56.78 -J DROP

Lista de visualización ya bloqueada Podemos dar a estos equipos:

Iptables -l -n.

IPTables -l -n - números -

Si necesitamos eliminar de bloquear una IP específica, puedes usar este comando

IPTables -d Entrada -s 1.2.3.4 -J DROP

o es posible eliminar la regla por su númeroDespués de revisar su comando IPTables -L -N -N -N -N-NUSOS:

IPTables -d entrada 6

Para eliminar todas las reglas., Puedes usar el equipo:

Iptables -f.

Alguna prevención, para proteger contra DDOS ...

Hay algunas reglas más que podrán protegernos de BOTs sin pensar creación de una carga en el servidor.

Instalamos el siguiente comando número máximo de conexiones de una IP en 80 puertos:

IPTables -a INPUT -P -P TCP --DPort 80 -M Connlimit --Conlimit-ANTES 128 -J DROP IPTables -A INPUT -P TCP --DPORT 80 -J Aceptar

Mismo Puedes hacer yo. para DNS.:

IPTables -A INPUT -P -P UDP --DPort 53 -M Connlimit --Conlimit-ANTES 16 -J Drop IPTables -A INPUT -P UDP --DPort 53 -J Aceptar

La siguiente regla en Iptables evitará una punta de nuestro nombre. Como regla general, durante el DDOS, obtenemos un paquete con banderas SYN y ACK instaladas en una conexión no abierta (esta combinación de banderas solo tiene la respuesta al paquete SYN). Esto sugiere que alguien envió otro anfitrión de SYN al anfitrión de nuestro nombre, y la respuesta vino a nosotros.
De acuerdo con esta regla, nuestro anfitrión responderá con un paquete RST, después de recibir el host atacado cierra la conexión.

IPTables -i Input -m ConnTrack - CCTSTATE Nuevo, Invalid -p TCP --TCP-Flags SYN, ACK SYN, ACK -J Rechazar --Reja con TCP-RESET

IPTables-Guardar\u003e /etc/ipts.rules

¿Qué más puedes hacer?

No impide un poco de "fuera de acuerdo" el kernel, haga un ajuste fino de Apache y Nginx (si vale la pena), coloque módulos y paquetes adicionales para protegerse contra los ataques, como Fail2ban, MOD_EVASIVE, MODSECIurity.

Pero todos estos son los temas de otros artículos que pronto estarán escritos ...



¿Te gustó el artículo? Compártelo