Le système de fichiers /proc
fournit des informations détaillées sur chaque processus, y compris la mise en réseau information. Les informations de socket ouvert sont répertoriées dans /proc/net/tcp
. Les sockets IPv6 sont répertoriés séparément dans le fichier tcp6
. Les informations de prise de courant comprend des informations telles que les ports locaux et distants, et la douille numéro de i-node, qui peuvent être mappées vers le procédé en analysant les informations /proc/{pid}/fd/*
.
Si vous n'êtes pas familier avec le système de fichiers /proc
, il s'agit essentiellement d'un système de fichiers virtuel qui permet au noyau de publier toutes sortes d'informations utiles dans l'espace utilisateur. Les fichiers sont normalement des fichiers texte structurés simples et faciles à analyser.
Par exemple, sur mon système Ubuntu j'ai utilisé netcat
pour les tests, et courut nc -l -p 8321
écouter sur le port 8321. En regardant les informations de prise tcp
:
$ 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 première ligne montre qu'il est à l'écoute sur toutes les adresses au point 8321 (0x2081). Le numéro d'inode est 26442, que nous pouvons utiliser pour rechercher le pid correspondant dans /proc/{pid}/fd/*
, qui consiste en un tas de liens symboliques à partir du numéro de descripteur de fichier sur le périphérique. Donc, si nous regardons le pid pour netcat
, et vérifier son fd
mapping:
$ 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]
Et là, nous voyons que le descripteur de fichier 3 dans ce processus est associé à la prise avec inode 26442, tout comme nous attendons.
Alors, évidemment, de construire une carte complète de prises, vous devez d'abord énumérer tous les /proc/**/fd/*
fichiers, rechercher les sockets symlinks, correspondent alors la prise inode sur les tables de /proc/net/tcp
qui a l'information point final.
C'est la manière dont fonctionne l'outil lsof
(voir lsof/dialects/linux/dsocket.c
pour la mise en œuvre).
oh wow. J'écris un programme pour faire juste cela maintenant, quelle coïncidence –
J'ai le code maintenant si vous êtes intéressé par la comparaison des notes. J'ai vu quelques bizarreries rares dans les données/proc, mais dans l'ensemble l'approche fonctionne. –