interface linux para obter IPs conectados

3

Existe uma interface para obter os IPs atualmente conectados e seu estado no Linux? Estou ciente de ss e netstat , mas eu quero usar /proc/ ou alguma outra interface de kernel "oficial" que já os tenha (se existir). Se não existe onde eu começaria a obter essa informação? Basicamente, eu preciso de uma interface que tenha essa informação para que eu possa recuperá-la programaticamente.

    
por user1529891 19.06.2014 / 15:33

3 respostas

4

Além de ss e netstat , atualmente não conheço outras ferramentas que eu recomende.

Para saber como obter essa informação:

Se você man netstat , você pode ver na seção FILES alguns arquivos listados que o netstat usa para coletar suas informações.

Entre eles, há /proc/net/tcp e /proc/net/udp .

Se você cat /proc/net/tcp você pode ver várias informações sobre conexões tcp no seu sistema.

Um exemplo de saída seria

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 aqui é o IP que você está procurando. Não sei muito sobre isso, mas acho que st fornece informações sobre o estado atual. 0A deve significar LISTEN , 01 significa ESTABLISHED .

Decodificar local_address ou rem_address é bastante fácil, 8700A8C0:8F76 , por exemplo:

Format: hex(rev_ip):hex(port)

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

=> 192.168.0.135, Port 36726

Mais informações sobre o diretório /proc/net são aqui .

Mais informações sobre os dados apresentados são aqui .

Um thread SO relacionado também é aqui .

    
por 19.06.2014 / 15:43
1

Se você executar strace lsof -i 2>&1 | grep open , receberá algumas dicas sobre como 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 alguns dos arquivos não existem no meu sistema. Alguns desses arquivos estão documentados em man proc , mas sua saída não parece muito difícil de entender.

Depois disso, lsof -i literalmente percorre toda a tabela de processos, em ordem crescente, procurando por descritores abertos:

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
    
por 19.06.2014 / 15:54
1

Uma alternativa, se você estiver usando iptables e tiver ip_conntrack compilado em seu kernel ou carregado como um módulo, poderá obter a exibição iptables de todo o estado da conexão de /proc/net/ip_conntrack ou da interface mais recente do espaço de usuário ferramenta 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

Isso também incluirá informações para conexões roteadas por meio de sua máquina, não apenas conexões locais.

    
por 19.06.2014 / 16:08