¿Existe una interfaz para obtener las IP conectadas actualmente y su estado en Linux? Conozco ss
and 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
, netstat
actualmente 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 FILES
algunos archivos enumerados que utiliza netstat para recopilar su información.
Entre estos, están /proc/net/tcp
y /proc/net/udp
.
Si cat /proc/net/tcp
puede 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_address
Aquí está la IP que estás buscando. No sé mucho al respecto, pero creo que st
te da información sobre el estado actual. 0A
debería significar LISTEN
, 01
significa ESTABLISHED
.
Decodificar un local_address
o rem_address
es bastante fácil, 8700A8C0:8F76
por 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/net
directorio 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 open
obtendrás algunas pistas sobre cómo lsof -i
funciona:
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 -i
literalmente 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 iptables
y ha ip_conntrack
compilado en su kernel o cargado como un módulo, entonces puede obtener la iptables
vista de todo el estado de conexión desde /proc/net/ip_conntrack
la 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.