Como posso obter informações de soquete, de fora de um processo do Linux, em seu soquete?

2
Estou especificamente interessado em escutar sockets TCP, mas obter todas e quaisquer informações de socket (struct sock, tal como definido no include / net / sock.h do Kernel) para um socket seria bom.

Por exemplo, essa saída ss mostra um soquete TCP ligado a 8080.

tcp    LISTEN     20     128                    *:8080                  *:*      uid:500 ino:32355 sk:ffff8801b11ca880
      rto:1000 mss:536 cwnd:10

Eu assumo que sk: *** é o endereço da estrutura (struct sock) para este socket. Não encontrei nenhuma ferramenta que possa pegar a estrutura sk e imprimir seus campos. Posso usar algo para entrar na memória (é kernel ou processo?) E interpretar dados em ffff8801b11ca880 como (struct sock)?

    
por Pawel Veselov 12.12.2014 / 04:04

2 respostas

3

O endereço está no espaço do kernel, porque os 16 bits mais altos são definidos (FFFF). Para prosseguir, você precisa do GDB e dos símbolos de depuração para o seu kernel em execução. Estou usando o CentOS, então o seguinte funcionou para mim:

# yum install gdb
# yum install --enablerepo=base-debuginfo kernel-debuginfo
# gdb /usr/lib/debug/lib/modules/'uname -r'/vmlinux /proc/kcore

Depois disso, você pode usar o GDB como um processo userspace, exceto que é o kernel:

(gdb) explore (struct sock *)0xffff8801b11ca880
    
por 12.12.2014 / 06:11
0

Depende exatamente do que você precisa.

A maioria das informações contidas no sock de struct ( não o soquete de struct) é útil apenas para depuração. Um despejo da tabela de soquete TCP está contido em / proc / net / tcp e, da mesma forma, em UDP, IGMP, raw, arp, UNIX-domain. É uma mesa simples, cujo conteúdo é brevemente summerized pelos títulos na linha 1 desta saída:

 more /proc/net/tcp
 sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
 0: 00000000:228B 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 15159 1 ffff8801a1ee2300 100 0 0 10 0                     
 1: 00000000:CC4B 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 13835 1 ffff8801a1ee0700 100 0 0 10 0    

e é um pouco mais extensivamente descrito na página man proc (5) da seguinte forma:

/proc/net/tcp

Holds a dump of the TCP socket table. Much of the information is not of use apart from debugging. The "sl" value is the kernel hash slot for the socket, the "local_address" is the local address and port number pair. The "rem_address" is the remote address and port number pair (if connected). "St" is the internal status of the socket. The "tx_queue" and "rx_queue" are the outgoing and incoming data queue in terms of kernel memory usage. The "tr", "tm->when", and "rexmits" fields hold internal information of the kernel socket state and are only useful for debugging. The "uid" field holds the effective UID of the creator of the socket.

Esta informação é lida e mais convenientemente exibida por comandos como lsof -i ou netstat -4 .

    
por 12.12.2014 / 13:15