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.