Este artículo pretende recopilar y documentar algunos de los parámetros útiles para la optimización del kernel de Linux, que pueden establecerse sea temporalmente escribiendo en los archivos de /proc/sys/net/
o mediante el comando sysctl -w parametro=valor
, o también de manera persistente editando el archivo /etc/sysctl.conf
o los archivos en el subdirectorio /etc/sysctl.d/
(puede que no exista en algunas distribuciones).
Parámetro | Valor predeterminado | Valor recomendado | Observaciones | Relevancia |
---|---|---|---|---|
net.ipv4.ip_forward | 0 | 1 | Habilitar el reenvío de paquetes, necesario para el NAT.1) | Alta |
net.ipv6.conf.all.disable_ipv6 | 0 | 1 | De momento en Cuba no se está utilizando IPv6, deshabilitarlo puede evitar un consumo de recursos innecesario en un servidor de prestaciones limitadas. | Baja |
net.ipv6.conf.default.disable_ipv6 | 0 | 1 | Idem. | Baja |
net.ipv4.conf.all.accept_redirects | 1 | 0 | Normalmente habilitar las redirecciones ICMP se considera un riesgo de seguridad. | Media |
net.ipv4.conf.all.log_martians | 0 | 1 | Registrar los paquetes que parecen salir de la nada (marcianos). | Baja |
net.ipv4.tcp_syncookies | 0 | 1 | Evitar los ataques de inundación SYN. | Media |
net.ipv4.tcp_max_syn_backlog | 1024 | 2048 | Cantidad de peticiones SYN a mantener en memoria que aun no hayan recibido ACK por parte del cliente. No incrementar mucho si se posee poca RAM. Se supone que un valor de 1024 es para 128 MiB de RAM o superior. | Baja |
net.ipv4.tcp_tw_recycle | 0 | 1 | Habilitar el reciclaje rápido de los sockets TIME_WAIT. Puede ayudar en el caso de muchos paquetes que permanezcan en dicho estado llenando la tabla de rastreo de conexiones. | Media |
net.ipv4.tcp_tw_reuse | 0 | 1 | Habilitar la reutilización de los sockets TIME_WAIT. Complementa la preferencia anterior. | Media |
net.ipv4.tcp_timestamps | 1 | 0 | Deshabilitar las marcas de tiempo en las conexiones TCP puede ayudar en las redes lentas, ya que de estar habilitadas se agregan 10 bytes a cada paquete. | Media |
net.ipv4.tcp_rmem | 4096 87380 6291456 | ? | Tamaño mínimo, predeterminado y máximo (en bytes) de los búferes de recepción TCP. | Media |
net.ipv4.tcp_wmem | 4096 16384 4194304 | ? | Idem de los búferes de transmisión TCP. | Media |
net.ipv4.tcp_syn_retries | 5 | 6 | Cantidad de reintentos de envío del paquete SYN para establecer una nueva conexión, si no se recibe una respuesta (cada intento demora el doble de tiempo que el anterior, comenzando por 3 segundos). Es recomendable mantenerlo entre 4 y 8. Bajo ninguna circunstancia debe ser mayor de 255. | Media |
net.ipv4.tcp_synack_retries | 5 | 5 | Complementa la preferencia anterior, establece los reintentos de transmisión de la respuesta SYN/ACK a un paquete SYN, en otras palabras, cuántas veces reintentar establecer una conexión pasiva iniciada por otro equipo. Puede ser útil reducirla a 4 ó 3 si se sospecha que nos realizan un ataque de denegación de servicios. | Media |
net.netfilter.nf_conntrack_icmp_timeout | 30? | 20 | Tiempo de espera (en segundos) para las conexiones ICMP. | Baja |
net.netfilter.nf_conntrack_tcp_timeout_syn_recv | 60 | 60 | Tiempo de espera (en segundos) para el estado SYN-RECEIVED, al cual se entra de los estados LISTEN o SYN-SENT una vez que el servidor recibe un paquete SYN y responde con SYN/ACK. Cuando el servidor recibe el ACK final del 3-way handshake, se pasa al estado ESTABLISHED. Generalmente es desaconsejable reducirlo. | Media |
net.netfilter.nf_conntrack_tcp_timeout_syn_sent | 120 | ? | Tiempo de espera (en segundos) que el cliente permanece en estado SYN-SENT una vez enviado el paquete SYN y se espera el SYN/ACK. Si la comunicación se estanca, puede ser útil subir el valor; bajarlo para reducir las entradas en la tabla de rastreo de conexiones es desaconsejable. | Media |
net.netfilter.nf_conntrack_tcp_timeout_established | 432000 | 86400 | TTL (en segundos) para las conexiones establecidas. Puede reducirse más aun si no se pretende permitir conexiones persistentes de larga duración. | Alta |
net.netfilter.nf_conntrack_tcp_timeout_fin_wait | 120 | ? | Tiempo de espera (en segundos) para los estados FIN_WAIT. Se entra a FIN_WAIT1 cuando el servidor envía un paquete FIN, y a FIN_WAIT2 cuando el servidor recibe como respuesta FIN/ACK. Si el servidor recibe FIN mientras espera aun FIN/ACK, entra directamente en el estado CLOSE. | Alta |
net.netfilter.nf_conntrack_tcp_timeout_close_wait | 43200 | ? | Tiempo de espera (en segundos) en el estado CLOSE_WAIT, al cual se entra después que el cliente recibe un paquete FIN y responde con FIN/ACK. El estado CLOSE_WAIT se mantiene hasta que el cliente envía el paquete FIN final, y entonces la conexión pasa a LAST_ACK. | Alta |
net.netfilter.nf_conntrack_tcp_timeout_last_ack | 30 | ? | Tiempo de espera (en segundos) para entrar en el estado LAST_ACK, que sigue a CLOSE_WAIT y termina cuando se recibe el FIN/ACK final en respuesta al último FIN del cliente, tras lo cual el rastreo de conexiones se destruye y se pasa al estado CLOSED. | Alta |
net.netfilter.nf_conntrack_tcp_timeout_close | 10 | ? | Tiempo de espera del estado CLOSE, al cual se entra si el cliente envía FIN y recibe FIN del servidor, y responde con FIN/ACK. El estado CLOSE se mantiene mientras se espera el FIN/ACK de respuesta, cuando llega, se entra en TIME_WAIT. | Alta |
net.netfilter.nf_conntrack_tcp_timeout_time_wait | 120 | 20 | Tiempo de espera (en segundos) del estado TIME_WAIT, que es el último posible en una conexión TCP. Cuando expira, se destruye la entrada en el rastreo de conexiones y se entra al estado CLOSED. | Alta |
net.ipv4.netfilter.ip_conntrack_udp_timeout | 30 | ? | Tiempo de espera inicial (en segundos) para las conexiones UDP. Cuando un paquete UDP enviado ha recibido respuesta entra en el estado ESTABLISHED, de continuar el tráfico se considera un stream. Si se utilizan protocolos que intercambian poca información en un lapso de tiempo largo, puede ser necesario elevar este valor. Reducirlo es generalmente desaconsejable. | Baja |
net.ipv4.netfilter.ip_conntrack_udp_timeout_stream | 180 | ? | Tiempo de espera (en segundos) para los streams UDP (tales como intercambio de voz o video). Si se tienen problemas con conexiones UDP que expiran muy pronto, puede ser útil elevar este valor. Reducirlo es desaconsejable. | Baja |
net.netfilter.nf_conntrack_generic_timeout | 600 | ? | Tiempo de espera genérico (en segundos) para el rastreo de conexiones, en caso de no poder determinarse el protocolo utilizado. | Media |
net.ipv4.ip_local_port_range | 32768 61000 | ? | Contiene el rango de puertos efimeros que se usarán de forma aleatorea para crear conexiones TCP. Para servidores con una gran carga de conexiones (Web, email, etc) puede ser recomendable aumentarlo. | Baja |
net.ipv4.tcp_keepalive_time | 7200 | 18002) | Tiempo que se mantendrán las conexiones TCP inactivas. Conviene reducirlo en servidores de gran carga. | Media |
net.ipv4.icmp_echo_ignore_broadcasts | 1 | 1 | Evitar que el comando ping pueda enviarse a la dirección de difusión de una red (esto crearía una congestión inútil). | Alta |
Para ilustrar un poco mejor la relación entre los diferentes estados por los que transitan los paquetes con el protocolo TCP, incluímos el siguiente gráfico.3)
La mayoría de las distribuciones propone una configuración que suele funcionar de manera estable y razonablemente eficiente para la generalidad de los casos. Modificar dicha configuración sin conocer lo que se está haciendo puede tener resultados contraproducentes.