GNU/Linux >> Tutoriales Linux >  >> Linux

configuración de sysctl para alta carga y prevención de DDoS

Introducción

Hay bastantes ejemplos diferentes de configuraciones del kernel de Linux en Internet para admitir una gran cantidad de conexiones, proyectos web muy cargados y contrarrestar los ataques DDoS. Aquí hay otro ejemplo que ya he podido probar en la práctica. Lo diré de inmediato:me ayudó con creces. Pruébalo y tú.

/etc/sysctl.conf opciones

Hay una lista de opciones necesarias para agregar a /etc/sysctl.conf :

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_mem = 50576   64768   98152
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.netfilter.ip_conntrack_max = 16777216
net.netfilter.nf_conntrack_max = 16777216
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.route.flush = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_forward = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 1000
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
fs.inotify.max_user_watches = 16777216

Y ahora sobre cada opción con más detalle.

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0

No acepte ni envíe paquetes de redirección ICMP. Un atacante puede utilizar las redirecciones ICMP para modificar las tablas de enrutamiento. Es recomendable ponerlo en “0″. La unidad solo tiene sentido para hosts utilizados como enrutadores.

net.ipv4.tcp_max_orphans = 65536

El valor entero del parámetro tcp_max_orphans determina el número máximo de sockets TCP válidos en el sistema que no están conectados por ningún identificador de archivo de usuario. Cuando se alcanza el valor umbral, los compuestos huérfanos se restablecen inmediatamente con una advertencia. Este umbral ayuda a prevenir solo ataques DoS simples. No debe reducir el valor del umbral (más bien aumentarlo de acuerdo con los requisitos del sistema, por ejemplo, después de agregar memoria. Cada conexión huérfana absorbe alrededor de 64 Kbytes de memoria no intercambiable).

net.ipv4.tcp_fin_timeout

net.ipv4.tcp_fin_timeout = 10

El parámetro tcp_fin_timeout determina el tiempo en que el socket permanece en el estado FIN-WAIT-2 después de que el lado local lo cierra. El socio nunca puede cerrar esta conexión, por lo que debe cerrarla por su propia iniciativa después de un tiempo de espera. De forma predeterminada, el tiempo de espera es de 60 segundos. En los núcleos de la serie 2.2 se solía utilizar un valor de 180 segundos y puedes guardar este valor, pero no debes olvidar que en servidores WEB cargados corres el riesgo de consumir mucha memoria para salvar conexiones muertas medio rotas. Los sockets en estado FIN-WAIT-2 son menos peligrosos que FIN-WAIT-1 porque no absorben más de 1,5 Kbytes de memoria, pero pueden durar más.

tiempo de mantenimiento de TCP

net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5

tcp_keepalive_time La variable determina la frecuencia con la que se debe comprobar la conexión si no se ha utilizado durante mucho tiempo. El valor de la variable solo tiene sentido para aquellos sockets que se crearon con el indicador SO_KEEPALIVE. La variable entera tcp_keepalive_intvl define el intervalo de muestreo. El producto tcp_keepalive_probes * tcp_keepalive_intvl determina el tiempo después del cual se desconectará la conexión si no hay respuestas. Por defecto, el intervalo es de 75 segundos, es decir, el tiempo de desconexión en ausencia de respuestas será de aproximadamente 11 minutos.

net.ipv4.tcp_max_syn_backlog = 4096

El valor entero en el archivo tcp_max_syn_backlog define el número máximo de solicitudes de conexión recordadas para las que no se ha recibido confirmación del cliente que se conecta. Si se produce una sobrecarga en el servidor, puede intentar aumentar este valor.

net.ipv4.tcp_synack_retries = 1

El valor entero (1 byte) tcp_synack_retries determina el número de reintentos para transmitir paquetes SYNACK para conexiones TCP pasivas. El número de intentos no debe exceder los 255. Un valor de 5 corresponde a aproximadamente 180 segundos para intentar establecer una conexión.

net.ipv4.tcp_mem

net.ipv4.tcp_mem = 50576   64768   98152

La variable de vector (mínimo, modo de carga, máximo) en el archivo tcp_mem contiene configuraciones generales de consumo de memoria para el protocolo TCP. Esta variable se mide en páginas (generalmente 4kb), no en bytes.

Mínimo :mientras que el tamaño total de la memoria para las estructuras del protocolo TCP es menor que este número de páginas, el sistema operativo no hace nada.

Modo de carga :tan pronto como el número de páginas de memoria asignadas para el protocolo TCP alcanza este valor, se activa el modo de carga, en el que el sistema operativo intenta limitar la asignación de memoria. Este modo se mantiene hasta que el consumo de memoria vuelve a alcanzar el nivel mínimo.

Máximo :El número máximo de páginas de memoria permitidas para todos los sockets TCP.

net.ipv4.tcp_rmem

net.ipv4.tcp_rmem = 4096 87380 16777216

La variable de vector (mínimo, predeterminado, máximo) en el archivo tcp_rmem contiene 3 enteros que determinan el tamaño del búfer de recepción del socket TCP.

Mínimo :cada socket TCP tiene derecho a utilizar esta memoria en el momento de su creación. La capacidad de usar dicho búfer está garantizada incluso cuando se alcanza el umbral del límite (presión de memoria moderada). El tamaño de búfer mínimo predeterminado es 8 KB (8192).

Valor predeterminado :la cantidad de memoria permitida para el búfer de transferencia de socket TCP predeterminado. Este valor se utiliza en lugar del parámetro /proc/sys/net/core/rmem_default utilizado por otros protocolos. El valor predeterminado del búfer (generalmente) es 87830 bytes. Esto determina el tamaño de la ventana de 65535 con el valor predeterminado de tcp_adv_win_scale y tcp_app_win =0, algo más pequeño que el valor predeterminado de tcp_app_win.

Máximo :El tamaño máximo del búfer se puede asignar automáticamente para recibir un socket TCP. Este valor no cancela el máximo especificado en el archivo /proc/sys/net/core/rmem_max. Con la asignación de memoria "estática" usando SO_RCVBUF, este parámetro no importa.

net.ipv4.tcp_wmem

net.ipv4.tcp_wmem = 4096 65536 16777216

La variable de vector en el archivo tcp_wmem contiene 3 valores enteros que definen la cantidad mínima, predeterminada y máxima de memoria reservada para los búferes de transferencia de socket TCP.

Mínimo :cada socket TCP tiene derecho a utilizar esta memoria en el momento de su creación. El tamaño de búfer mínimo predeterminado es 4 KB (4096)

Valor predeterminado :la cantidad de memoria permitida para el búfer de transferencia de socket TCP predeterminado. Este valor se usa en lugar del parámetro /proc/sys/net/core/wmem_default que usan otros protocolos y, por lo general, es menor que /proc/sys/net/core/wmem_default. El tamaño del búfer predeterminado suele ser (predeterminado) 16 Kbytes (16384).

Máximo :la cantidad máxima de memoria que se puede asignar automáticamente para el búfer de transmisión de socket TCP. Este valor no anula el máximo especificado en el archivo /proc/sys/net/core/wmem_max. Con la asignación de memoria "estática" usando SO_SNDBUF, este parámetro no importa.

net.ipv4.tcp_orphan_retries=0

El valor entero tcp_orphan_retries determina el número de intentos fallidos, después de lo cual se destruye la conexión TCP que se cierra en el lado local. El valor predeterminado es 7, que corresponde aproximadamente a un período de 50 segundos a 16 minutos, según el RTO. En servidores WEB muy cargados, tiene sentido reducir el valor de este parámetro, ya que las conexiones cerradas pueden consumir muchos recursos.

net.ipv4.tcp_syncookies=0

En relación con la recomendación de los desarrolladores del kernel, es mejor deshabilitar esta opción.

net.ipv4.netfilter.ip_conntrack_max =16777216

El número máximo de conexiones para que funcione el mecanismo de seguimiento de conexiones (usado, por ejemplo, iptables). Si los valores son demasiado pequeños, el kernel comienza a rechazar las conexiones entrantes con la entrada correspondiente en el registro del sistema.

net.ipv4.tcp_timestamps=1

Permite marcas de tiempo TCP. Su presencia le permite controlar el funcionamiento del protocolo bajo cargas severas (ver tcp_congestion_control).

net.ipv4.tcp_sack = 1

Permitir reconocimiento selectivo de soporte TCPIP. Esta opción es necesaria para el uso eficiente de todo el ancho de banda disponible de algunas redes.

net.ipv4.tcp_congestion_control = htcp

Protocolo, utilizado para el control de carga en redes TCP. Las implementaciones predeterminadas de bic y cubic contienen errores en la mayoría de las versiones del kernel de RedHat y sus clones. Se recomienda usar htcp.

net.ipv4.tcp_no_metrics_save = 1

No guarde las medidas de la conexión TCP en la memoria caché cuando esté cerrada. En algunos casos, ayuda a aumentar la productividad.

Defensa contra la falsificación de IP

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

Deshabilitar enrutamiento de origen

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

net.ipv4.ip_local_port_range

net.ipv4.ip_local_port_range = 1024 65535

Aumente el rango de puertos locales disponibles para conexiones salientes.

net.ipv4.tcp_tw_reuse = 1

Permitimos la reutilización de sockets TIME-WAIT en los casos en que el protocolo lo considere seguro.

net.ipv4.tcp_window_scaling = 1

Permitir el cambio de tamaño dinámico de la ventana de la pila TCP.

net.ipv4.tcp_rfc1337 = 1

Defensa del ataque TIME_WAIT.

net.ipv4.ip_forward = 0

Prohibimos el reenvío de paquetes, ya que no somos un enrutador.

net.ipv4.icmp_echo_ignore_broadcasts = 1

No respondemos a las solicitudes ICMP ECHO transmitidas por paquetes de difusión.

net.ipv4.icmp_echo_ignore_all = 1

No puede responder a las solicitudes ICMP ECHO en absoluto (el servidor no hará ping).

net.ipv4.icmp_ignore_bogus_error_responses = 1

No respondemos a mensajes formados erróneamente.

net.core.somaxconn = 65535

El número máximo de sockets abiertos esperando una conexión. Tiene sentido aumentar el valor predeterminado.

net.core.netdev_max_backlog = 1000

El parámetro determina la cantidad máxima de paquetes en la cola de procesamiento si la interfaz recibe paquetes más rápido de lo que el kernel puede procesarlos.

Memoria máxima predeterminada

net.core.rmem_default = 65536

El tamaño de búfer de recepción de datos predeterminado para todas las conexiones.

net.core.wmem_default = 65536

El tamaño del búfer de transferencia de datos predeterminado para todas las conexiones.

net.core.rmem_max = 16777216

El tamaño máximo del búfer de recepción de datos para todas las conexiones.

net.core.wmem_max = 16777216

Tamaño máximo de búfer de datos para todas las conexiones.


Linux
  1. Bash For Loop Guía y ejemplos

  2. Análisis de casos a favor y en contra de la configuración del espacio de intercambio en instancias de nube

  3. Instalación y configuración de Grafana en Linux

  4. Cómo cargar el módulo SELinux para Oracleasm

  5. Código para malloc y gratis

Configuración del entorno de desarrollo y las herramientas de .NET en Fedora 35

Keepalived y alta disponibilidad:temas avanzados

¿Qué es un DDoS y cómo evitamos que nuestro negocio sea atacado?

Interfaz de cinta para GTK y Qt

¿Hasta dónde puede llegar la carga del sistema?

Puente de Linux para KVM