El sistema de ficheros /proc
proporciona detalles sobre cada proceso, incluyendo la creación de redes información. La información de socket abierto se enumera en /proc/net/tcp
. Los conectores IPv6 se enumeran por separado en el archivo tcp6
. La información del socket incluye información tal como los puertos locales y remotos, y el número de inodo del socket, que puede correlacionarse con el proceso al analizar la información /proc/{pid}/fd/*
.
Si no está familiarizado con el sistema de archivos /proc
, básicamente es un sistema de archivos virtual que le permite al kernel publicar todo tipo de información útil en el espacio de usuario. Los archivos son normalmente archivos de texto estructurados simples que son fáciles de analizar.
Por ejemplo, en mi sistema Ubuntu que utiliza netcat
para las pruebas, y corrieron nc -l -p 8321
a escuchar en el puerto 8321. En cuanto a la información tcp
socket:
$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:2081 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 26442 1 de0c8e40 300 0 0 2 -1
1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7019 1 de0c84c0 300 0 0 2 -1
La primera línea muestra que está escuchando en todas las direcciones al punto 8321 (0x2081). El número de inodo es 26442, que podemos usar para buscar el pid correspondiente en /proc/{pid}/fd/*
, que consiste en un conjunto de enlaces simbólicos desde el número de identificador de archivo al dispositivo. Así que si miramos hacia arriba el pid para netcat
, y comprobar su fd
mapeo:
$ ls -l /proc/7266/fd
total 0
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 0 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 1 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 2 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 3 -> socket:[26442]
Y no vemos que el descriptor de fichero 3 en este proceso se asigna a la toma de corriente con inodo 26442, del mismo modo que esperamos.
Así que, obviamente, para construir un mapa completo de tomas, deberá enumerar en primer lugar todos los archivos /proc/**/fd/*
, buscar los enlaces simbólicos de socket, entonces coincidir con el nodo-i toma contra las tablas de /proc/net/tcp
que tiene la información de punto final.
Así funciona la herramienta lsof
(ver lsof/dialects/linux/dsocket.c
para la implementación).
oh wow. Estoy escribiendo un programa para hacer esto ahora, qué casualidad –
Tengo código ahora si está interesado en comparar notas. He visto algunas extrañas peculiaridades en los datos/proc, pero en general el enfoque funciona. –