viernes, 20 de julio de 2007

Usando sysctl para optimizar la pila TCP/IP

sysctl es una herramienta que nos permite modificar el comportamiento del kernel en vivo. Esto significa que las modificaciones que hagamos se aplican instantaneamente sin tener que reiniciar la máquina. Además si añadimos los cambios que vayamos a hacer al archivo /etc/sysctl.conf estos cambios se aplicarán cada vez que se arranque la máquina. sysctl realiza estos cambios a través del sistema de archivos virtual /proc que permite la comunicación directa con el kernel.

El uso de sysctl es muy sencillo. Para listar las variables que podemos modificar basta con ejecutar:


# sysctl -a
sunrpc.max_resvport = 1023
sunrpc.min_resvport = 665
sunrpc.tcp_slot_table_entries = 16
sunrpc.udp_slot_table_entries = 16
sunrpc.nlm_debug = 0
sunrpc.nfsd_debug = 0
sunrpc.nfs_debug = 0
sunrpc.rpc_debug = 0
...
# He recortado la salida porque es bastante extensa


Como podéis el esquema es "nombre de la variable" = "valor". Muchas de estas variables son boleanas un 0 significa que están deshabilitadas y un 1 que están habilitadas. Si conocemos el nombre de la variable que queremos modificar bastará filtrar la salida de la orden anterior con grep para conocer su valor, p.e:


sysctl -a | grep 'ipv4.ip_forward'
net.ipv4.ip_forward = 1


Para que nuestros cambios sean permanentes y además queden documentados lo mejor es editar el archivo /etc/sysctl.conf. A continuación os pego un ejemplo:


# Hablitar reenvío de paquetes (modo router)
net.ipv4.ip_forward = 1

# Habilitar IP dinámica
net.ipv4.ip_dynaddr = 1

# Deshabilitar ECN (señalizador de congestión en la línea)
net.ipv4.tcp_ecn = 0

# Habilitar verificación del origen de la ruta (ayuda a
# a prevenir el IP Spoofing)
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1

# Habilitar SYN cookies (protege contra un ataque de desbordamiento
# de paquetes SYN http://cr.yp.to/syncookies.html
net.ipv4.tcp_syncookies = 1

# Deshabilitar enrutamiento de origen (el enrutamiento de origen
# se considera peligroso)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# Deshabilitar paquetes de redireccionamiento icmp
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# Ignorar broadcasts icmp
net.ipv4.icmp_echo_ignore_broadcasts = 1

# No loguear paquetes icmp defectuosos
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Desactivar marcas de tiempo. Con conexiones menores de 10mbps
# son innecesarias
net.ipv4.tcp_timestamps = 0

# Reducir el tiempo tcp_fin_timeout. Reduce el tiempo que
# permanece el socket abierto al cerrar una conexión.
net.ipv4.tcp_fin_timeout = 25

# Reducir tiempo entre keepalives. Cada cuanto tiempo se deben
# mandar paquetes para mantener abierta una conexión viva pero
# que no está siendo usada.
net.ipv4.tcp_keepalive_time = 1200

# Aumentar el búfer para los paquetes SYN
net.ipv4.tcp_max_syn_backlog = 1024

# Reducir los reintentos de conexión
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3


Una vez editado el archivo aplicamos los cambios:


# sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.ip_dynaddr = 1
net.ipv4.tcp_ecn = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3


La salida nos muestra los cambios aplicados. Podéis encontrar el significado y lo valores que puede tomar cada variable en este tutorial.

1 comentario:

Javier dijo...

Al reiniciar los servicios de red con service network restart se deshabilita el reenvio de paquetes ipv4.ip_forward. Por qué?