interfaz de Linux para obtener direcciones IP conectadas

interfaz de Linux para obtener direcciones IP conectadas

¿Existe una interfaz para obtener las IP conectadas actualmente y su estado en Linux? Conozco ssand netstat, pero quiero usar /proc/alguna otra interfaz del kernel "oficial" que ya los tenga (si existe). Si no existe, ¿por dónde empezaría a obtener esta información? Básicamente, necesito una interfaz que tenga esta información para poder recuperarla mediante programación.

Respuesta1

Además ss, netstatactualmente no conozco ninguna otra herramienta que recomendaría.

Para saber cómo obtener esta información:

Si es así man netstat, puede ver en la sección FILESalgunos archivos enumerados que utiliza netstat para recopilar su información.

Entre estos, están /proc/net/tcpy /proc/net/udp.

Si cat /proc/net/tcppuede ver diversa información sobre las conexiones TCP en su sistema.

Un resultado de muestra sería

sl local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
0: 0101007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 11190 1 0000000000000 000 100 0 0 10 0
1: 8700A8C0:91FC 0F02000A:15B3 01 00000000:00000000 02:00000AF6 00000000  1000        0 5565254 2 00000000000 00000 46 4 13 10 -1

rem_addressAquí está la IP que estás buscando. No sé mucho al respecto, pero creo que stte da información sobre el estado actual. 0Adebería significar LISTEN, 01significa ESTABLISHED.

Decodificar un local_addresso rem_addresses bastante fácil, 8700A8C0:8F76por ejemplo:

Format: hex(rev_ip):hex(port)

87 -> 135
00 -> 0
A8 -> 168
C0 -> 192
:8F76 -> 36726

=> 192.168.0.135, Port 36726

Más información sobre el /proc/netdirectorio esaquí.

Más información sobre los datos presentados esaquí.

Un hilo SO relacionado también esaquí.

Respuesta2

Si ejecutas strace lsof -i 2>&1 | grep openobtendrás algunas pistas sobre cómo lsof -ifunciona:

open("/proc/1/fdinfo/7", O_RDONLY)      = 5
open("/proc/net/ax25", O_RDONLY)        = -1 ENOENT (No such file or directory)
open("/proc/net/ipx", O_RDONLY)         = -1 ENOENT (No such file or directory)
open("/proc/net/raw", O_RDONLY)         = 5
open("/proc/net/netlink", O_RDONLY)     = 5
open("/proc/net/packet", O_RDONLY)      = 5
open("/proc/net/unix", O_RDONLY)        = 5

Observe que algunos de los archivos no existen en mi sistema. Algunos de esos archivos están documentados en man proc, pero su resultado no parece demasiado difícil de entender.

Después de eso, lsof -iliteralmente recorre toda la tabla de procesos, en orden ascendente, buscando descriptores abiertos:

open("/proc/2/stat", O_RDONLY)          = 4
openat(AT_FDCWD, "/proc/2/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/3/stat", O_RDONLY)          = 4
openat(AT_FDCWD, "/proc/3/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/5/stat", O_RDONLY)          = 4
openat(AT_FDCWD, "/proc/5/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/7/stat", O_RDONLY)          = 4
openat(AT_FDCWD, "/proc/7/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/8/stat", O_RDONLY)          = 4
[...]
openat(AT_FDCWD, "/proc/101/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/112/stat", O_RDONLY)        = 4
openat(AT_FDCWD, "/proc/112/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/143/stat", O_RDONLY)        = 4
openat(AT_FDCWD, "/proc/143/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/proc/143/fdinfo/3", O_RDONLY)    = 5
open("/proc/143/fdinfo/4", O_RDONLY)    = 5
open("/proc/143/fdinfo/5", O_RDONLY)    = 5
open("/proc/143/fdinfo/11", O_RDONLY)   = 5
open("/proc/143/fdinfo/12", O_RDONLY)   = 5
open("/proc/143/fdinfo/13", O_RDONLY)   = 5

Respuesta3

Una alternativa, si está utilizando iptablesy ha ip_conntrackcompilado en su kernel o cargado como un módulo, entonces puede obtener la iptablesvista de todo el estado de conexión desde /proc/net/ip_conntrackla herramienta de interfaz de espacio de usuario más nueva.conntrack

$ sudo cat /proc/net/ip_conntrack
icmp     1 23 src=10.1.1.14 dst=10.1.1.1 type=8 code=0 id=10017 src=10.1.1.1 dst=10.1.1.14 type=0 code=0 id=10017 mark=0 use=2
unknown  2 597 src=10.1.1.10 dst=224.0.0.1 [UNREPLIED] src=224.0.0.1 dst=10.1.1.10 mark=0 use=2
udp      17 17 src=10.1.1.181 dst=10.1.1.255 sport=17500 dport=17500 [UNREPLIED] src=10.1.1.255 dst=10.1.1.181 sport=17500 dport=17500 mark=0 use=2
tcp      6 431999 ESTABLISHED src=10.1.1.14 dst=10.1.1.2 sport=22 dport=49218 src=10.1.1.2 dst=10.1.1.14 sport=49218 dport=22 [ASSURED] mark=0 use=2
icmp     1 28 src=10.1.1.14 dst=8.8.8.8 type=8 code=0 id=13601 src=8.8.8.8 dst=10.1.1.14 type=0 code=0 id=13601 mark=0 use=2

Esto también incluirá información para las conexiones que se enrutan a través de su máquina, no solo las conexiones locales.

información relacionada