Configuración de parámetros del núcleo

El comando sysctl nos permite parametrizar parámetros del núcleo. No hace falta decir que son aquellos con los que fue compilado el núcleo.

Toda la configuración se hace a través del fichero /etc/sysctl.conf:

# Kernel sysctl configuration file
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.forwarding = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

Esta configuración se activará en el arranque de la máquina o bien podemos modificar el fichero y:

[root@sal]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.forwarding = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
[root@sal]# 

Modificación de los parámetros

Como ya hemos visto lo podemos hacer modificando el fichero de configuración /etc/sysctl.conf y ejecutando después sysctl -p.

También es posible modificar estos parámetros directamente en el sistema de ficheros /proc/.

Todos los parámetros que podemos configurar los encontraremos en /proc/sys/.

Importante

Para algunas familias de dispositivos podemos establecer configuraciones por defecto, para todos, o por dispositivo individual. Por ejemplo para los dispositivos de red lo podemos hacer en /proc/sys/net/ipv4/conf/default/, /proc/sys/net/ipv4/conf/all/eth?/, /proc/sys/net/ipv4/conf/lo/, ...

Por ejemplo el parámetro net.ipv4.ip_forward lo encontraremos en /proc/sys/net/ipv4/ip_forward. Para modificar este parámetro:

[root@sal]# echo 0 > /proc/sys/net/ipv4/ip_forward
[root@sal]# 

El inconveniente de este método es que al reiniciar la máquina esta configuración se pierde.

Por lo tanto será necesario ejecutar los echoes y habrá que incluirlos en los ficheros de arranque.

El uso de echoes es una mala practica de administración y debe evitarse y usarse en su lugar el fichero /etc/sysctl.conf.

Parámetros configurables

Los parámetros que podremos configurar son aquellos que se hayan seleccionado en la configuración del núcleo que se está usando.

Podemos comprobar los parámetros que podemos configurar:

[root@sal]# sysctl -A

sunrpc.tcp_slot_table_entries = 16
sunrpc.udp_slot_table_entries = 16
sunrpc.max_resvport = 1023
sunrpc.min_resvport = 650
sunrpc.nlm_debug = 0
sunrpc.nfsd_debug = 0
sunrpc.nfs_debug = 0
sunrpc.rpc_debug = 0
abi.vsyscall32 = 1
dev.scsi.logging_level = 0
dev.raid.speed_limit_max = 200000
dev.raid.speed_limit_min = 1000
dev.cdrom.check_media = 0
dev.cdrom.lock = 1
dev.cdrom.debug = 0
dev.cdrom.autoeject = 0
dev.cdrom.autoclose = 1
dev.cdrom.info = CD-ROM information, Id: cdrom.c 3.20 2003/12/17
dev.cdrom.info =
dev.cdrom.info = drive name:            sr0
dev.cdrom.info = drive speed:           24
dev.cdrom.info = drive # of slots:      1
dev.cdrom.info = Can close tray:                1
dev.cdrom.info = Can open tray:         1
dev.cdrom.info = Can lock tray:         1
dev.cdrom.info = Can change speed:      1
dev.cdrom.info = Can select disk:       0
dev.cdrom.info = Can read multisession: 0
dev.cdrom.info = Can read MCN:          1
dev.cdrom.info = Reports media changed: 1
dev.cdrom.info = Can play audio:                1
dev.cdrom.info = Can write CD-R:                0
dev.cdrom.info = Can write CD-RW:       0
dev.cdrom.info = Can read DVD:          1
dev.cdrom.info = Can write DVD-R:       0
dev.cdrom.info = Can write DVD-RAM:     0
dev.cdrom.info = Can read MRW:          1
dev.cdrom.info = Can write MRW:         1
dev.cdrom.info = Can write RAM:         1
dev.cdrom.info =
dev.cdrom.info =
dev.rtc.max-user-freq = 64
debug.exception-trace = 1
net.ipv6.conf.default.max_addresses = 16
net.ipv6.conf.default.max_desync_factor = 600
net.ipv6.conf.default.regen_max_retry = 5
...

Algunos parámetros útiles

  • net.ipv4.tcp_syncookies = 1 proteje contra los ataques Sync packet flooding pero no es conforme a los estándares marcados por los RFCs.

    Aviso

    Puede tener impacto en el rendimiento de servidores sobrecargados.

    Importante

    Sync packet flooding es una ataque de denegación de servicio. Cuando se va a establecer una conexión TCP un host manda un paquete SYNC a lo que el otro host responde con un paquete ACK. Si el host atacante empieza a mandar de forma indiscriminada paquetes SYNC con la cabecera falseada con una IP de origen falsa el host atacado mandará sus ACK o bien a ningún host o a un host que no es el que está intentando establecer la comunicación. Dependiendo de la implementación de la pila TCP de ese host tratará el paquete ACK de una forma u otra.

    El host atacado llegará un momento en el que no pueda atender más conexiones.

    Otra forma de prevenir estos ataques es ampliando el tamaño de las colas en las que se almacena la informació referente a las peticiones de conexión: net.ipv4.tcp_max_syn_backlog.

  • net.ipv4.tcp_max_sync_backlog = XXX por defecto suele estar a 1024 y estable el tamaño de la cola donde se guarda la información referente a las peticiones de conexión.

  • net.ipv4.tcp_fin_timeout = 60 cierra los sockets ináctivos, no se recivió paquete FIN, después de 60 segundos.

  • net.ipv4.tcp_keepalive_time = 1800 segundos después de un proceso de inactividad tras los cuales se intenta verificar si el cliente sigue vivo.

  • net.ipv4.conf.all.accept_redirects = 0 no se aceptan redirecciones ICMP para evitar ataques Man in the middle.

    Aviso

    Mediante el uso del protocolo ICMP es posible modificar los gateways definidos estáticamente en la máquina.

  • net.ipv4.conf.all.send_redirects = 0 evita que la máquina mande paquetes ICMP con redirecciones.

  • net.ipv4.conf.all.accept_source_route = 0 se evita que TCP tenga control para decidir sobre la determinación de la ruta de los paquetes.

  • net.ipv4.conf.all.rp_filter = x protección contra ataques de spoofing.

    x puede tomar los valores:

    • 0 no realiza comprobaciones.

    • 1 rechazar suplantaciones evidentes.

    • 2 comprobación exahustiva.

  • net.ipv4.ip_forward = 0 deshabilitar el reenvio de paquetes.

    Importante

    Esta opción suele estar con un valor distinto de cero en máquinas que hacen enrutado entre diferentes redes.

  • net.ipv4.icmp_ignore_bogus_error_responses = 1 activa la protección ante mensajes de error malformados.

  • net.ipv4.icmp_echo_ignore_broadcast = 1 desactivar la respuestas a las peticiones de broadcast de echo ICMP.

  • net.ipv4.icmp_echo_ignore_all = 1 desactivació de la respuesta a ping.

  • kernel.panic = n después de un kernel panic espera n segundos para reinciar el sistema.

  • kernel.sysrq = 1 activa SYSRQ.

    SYSRQ es una característica del núcleo que permite pasarle instrucciones con fines de depuración.

    Sugerencia

    Con el SYSRQ activado si se presionan las teclas AltGr+PetSis+t, AltGr+PetSis+m y AltGr+PetSis+p se escribirán en los logs el estado de los procesos, memoria y CPU.

Sugerencia

En la documentación del núcleo podemos encontrar toda la información sobre sysctl en Documentacion/networking/ip-sysctl.txt.