21 oct 2011

El sistema de ficheros procfs o “/proc”… Ese gran desconocido

La mayoría de los Unix y Linux, cuentan con un útil pero, en ocasiones, desconocido directorio, el cuál nos ofrece un amigable interfáz con los procesos que corren en el sistema.

Esta capa de abstracción, se denomina “procfs” y podemos tener acceso a ella como si de un sistema de ficheros se tratase en /proc.

La estructura de /proc, es muy simple. Si hacemos un listado del contenido de este directorio, veremos algo similar a esto:

La estructura de /proc, es muy simple. Si hacemos un listado del contenido de este directorio, veremos algo similar a esto:

En esta captura, podemos ver, por un lado directorios asociados a los procesos identificados por un número (el PID, o Process ID) y por otro, algunos directorios y ficheros que hacen referencia a diferentes carácterísticas de equipo. Si nos metemos en cualquier directorio de proceso, tendremos acceso a información acerca de su linea de comando, memoria, PPID. En resumen, estos ficheros y directorios que encontraremos aqui, recogen diferente información acerca del funcionamiento del programa. Esta información, en su mayoría, se almacena en formato ascii y es accesible mediante el uso del comando cat.

Por ejemplo, si queremos conocer con qué linea de comando se ha lanzado el proceso 34223, únicamente deberemos ejecutar:

$ cat /proc/34223/cmdlinesshd: usuario1@pts/0Además, dentro de profs, podemos encontrar muchísima información sobre la configuración del hardware de nuestro equipo:

  • Tipo y características de la/s CPU/s: $ cat /proc/cpuinfo
  • Modulos de cifrado activos: $ cat /proc/crypto
  • Claves almacenadas/cacheadas por el kernel: $ cat /proc/keys
  • Versión del kernel y compilador: $ cat /proc/version

También resulta muy interesante subdirectorio /proc/sys. Desde el mismo, es posible ver y modificar, algunos parámetros de la configuración del equipo, y si vamos a /proc/sys/net, podemos hacer lo propio con la red. Por ejemplo, para ver o modificar el estado del IPForwarding entre los interfaces, tan solo debemos ejecutar:

$ cat /proc/sys/net/ipv4/ip_forward

Para activarlo deberemos escribir (como root)

# echo 1 > /proc/sys/net/ipv4/ip_forward

Y simplemente, para desactivarlo:

# echo 0 > /proc/sys/net/ipv4/ip_forward

Otros parámetros que podemos fijar u observar desde este directorio son:

/proc/sys/net/ipv4/…

  • icmp_ratelimit e icmp_ratemask: Permiten controlar el rátio de generación de paquetes ICMP, por red.
  • icmp_echo_ignore_all: Activado, desactiva el envío de respuestas a ping por parte del sistema.
  • icmp_echo_ignore_broadcasts: Activado, ignora cualquier respuesta a ping que tenga como origen una dirección de broadcast (muy util en determinadas redes)
  • ip_conntrack_max: Fija el número de conexiones que el sistema puede tener en su tabla de conexiones. Por defecto, está fijado a 65536. En caso de que nuestro servidor tenga muchas conexiones concurrentes, se puede elevar o pensar en jugar con otros valores como el tiempo de conexión o el uso de balanceo de carga. Un numero elevado de conexiones, se diagnostica facilmente cuando empezamos a recibir en nuestro syslog mensajes del tipo “ip_conntrack: table full, dropping packet”. El número de conexiones concurrentes actual, podemos verlo en /proc/net/ip_conntrack.
  • ip_default_ttl: Fija el TTL de los paquetes IP
  • ip_local_port_range: Limita (o amplia) el rango de puertos usados como puertos de origen en las conexiones locales.
  • tcp_rfc1337: Activado, permite cortar conexiones en un tiempo menor del
  • tcp_syncookies: Activado, aumenta la seguridad frente a spoofing ciego, ya que activa en el kernel la utilización de un número de secuencia basado en la dirección de IP de origen, IP destino, número de puerto y el tiempo que hace que el paquete fué enviado.

Si no queremos hacer uso de este sistema, también podemos acceder o fijar estos valores mediante el comando “sysctl”. Con él, es posible acceder a todo lo que hemos visto en el apartado anterior, así como guardar la configuración en el fichero /etc/sysctl.conf.

Si quereis profundizar sobre este útil sistema de ficheros virtual, podeis visitar el correspondiente artículo en la Wikipedia (inglés):

Saludos,

 

2 comentarios:

  1. muy bueno, hay datos que no los conocía. Yo lo usaba simplemente como información del sistema. Y una vez lo usé para modificar en tiempo real la activación del reenvío de paquetes. Muchas gracias por la info

    ResponderEliminar
  2. [...] Nuevo artículo de Jesusdml: El sistema de ficheros procfs o “/proc”… Ese gran desconocido [...]

    ResponderEliminar