Como verificar conexões abertas no Linux

Este artigo descreve o resultado de minhas pesquisas sobre como verificar conexões abertas no Linux. Aqui descrevo três métodos: análise dos arquivos do /proc e os comandos netstat e lsof.

[ Hits: 105.670 ]

Por: Marco Carvalho de Oliveira em 11/09/2008 | Blog: http://demoncyber.wordpress.com/


Como verificar as conexões abertas no seu Linux de várias maneiras



Estivemos com um problema em um projeto que precisava verificar se o serviço xdmcp estava aberto, porém ele não é um processo independente, ele fica interligado ao X, kdm, gdm, xdm, para tanto a solução mais cabível era procurar saber se a porta estava aberta na máquina.

Sim, talvez pudesse existir outras maneiras de resolver isso, mas esta se fez mais interessante. A clássica solução que me veio a cabeça foi usar o netstat, mas pensei em porque não ir mais a fundo e como resultado venho por este artigo mostrar algumas coisas que aprendi.

As formas que executei este processo foram:
  • Geek hacker ninja style form - procura no proc pelas conexões abertas (mais interessante e a que mais aprendi);
  • Status network - usa o comando de status de rede para listar;
  • Open Files - Procura baseado nos arquivos abertos o que está ligado a porta.

Geek hacker ninja style form

A forma mais baixo nível e estilosa =], vamos aos arquivos de kernel analisar suas saídas, está é a base utilizada por programas como o netstat, o qual converte os dados deste e mostra com uma saída personalizada. Foi publicado um artigo antes explicando sobre a conversão de bases, então não vou abordar este assunto aqui.

O arquivo em questão utilizado é o /proc/net/tcp.

Exemplo de /proc/net/tcp:

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
0: 9E00A8C0:D3FD E1D7BCCD:1F4A 01 00000000:0003163C 00:00000000 00000000  1000        0 383991 1 cb042500 102 12 4 2 100
1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 626508 1 c299db80 750 0 0 2 -1

Onde:
  • sl: O número de identificador da linha.
  • local_address: O endereço local e o número da porta do socket. O endereço local está codificado em little-endian em quatro seqüências de números em hexadecimal, isso significa que o byte mais importante é listado primeiro e você necessita fazer a inversão da ordem dos bytes para converter para o endereço de IP. O número da porta é um hexadecimal simples utilizado pelo programa.
  • rem_address - O endereço remoto e o número da porta do socket. O endereço local está codificado em little-endian em quatro seqüências de números em hexadecimal, isso significa que o byte mais importante é listado primeiro e você necessita fazer a inversão da ordem dos bytes para converter para o endereço de IP. O número da porta é um hexadecimal simples.
  • st: Status do socket (depois de muita busca encontrei onde estava o padrão de código daqui e o porque do valor ficar com 0A - segue tabela de referência no final).
  • tx_queue rx_queue: O tamanho de transmissão e recebimento das filas de pacotes.
  • tr tm->when: tr é o campo que indica se o medidor de tempo está ativo para este socket. Um valor zero indica que o medidor de tempo não está ativo. O tm->when indica tempo que o sock está sendo utilizado em jiffies (usado basicamente para debug).
  • retrnsmt: Campo de informação interna do socket do kernel (usado basicamente para debug).
  • uid: O uid do usuário dono da conexão.
  • time-out: Campo de informação interna do socket do kernel (usado basicamente para debug).
  • inode: Um número encriptado de identificação do socket para o sistema de arquivos do Linux (não encontrei qual é a criptografia utilizada aqui).

Achei a representação padrão do cat do arquivo /proc/net/tcp muito extensa, então refiz ela na horizontal para melhor explanar o exemplo acima e traduzi alguns dados:

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
0: 9E00A8C0:D3FD E1D7BCCD:1F4A 01 00000000:0003163C 00:00000000 00000000  1000        0 383991 1 cb042500 102 12 4 2 100
1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 626508 1 c299db80 750 0 0 2 -1

sl : 0 - linha indicadora da primeira conexão
local_address: 9E00A8C0:D3FD - convertendo fica 192.168.0.158:151775
rem_address: E1D7BCCD:1F4A - convertendo fica 205.188.215.225:8010
st: 01 - TCP ESTABELISHED - conexão estabelecida
tx_queue rx_queue: 00000000:0003163C - fila de dados transmitidos
tm->when retrnsmt: 00:00000000 00000000 - dados utilizados para debug
uid: 1000 - id do usuário dono da conexão
timeout: 0 - dado utilizado para debug
inode: 383991 1 cb042500 102 12 4 2 100 - identificador criptografado

sl : 1 - linha indicadora da primeira conexão
local_address: 00000000:0016 - convertendo fica localhost:22
rem_address: 00000000:0000 - não tem ninguém conectado
st: 0A - TCP_LISTEN - escutando conexão
tx_queue rx_queue: 00000000:0003163C - fila de dados transmitida
tm->when retrnsmt: 00:00000000 00000000 - dados utilizados para debug
uid: 1000 - id do usuário dono da conexão
timeout: 0 - dado utilizado para debug
inode: 383991 1 cb042500 102 12 4 2 100 - identificador criptografado

Status network

Podemos ver as conexões abertas através do comando netstat. O mesmo é um programa de estatísticas de rede utilizado amplamente para este fim. Não tem muitos segredos e as informações que ele mostra são muito legíveis. Alguém percebeu a similaridade com um outro arquivo no modo que as informações aparecem? :)

# netstat -tl - lista as conexões abertas de tcp em modo de escuta
# netstat -t - lista as conexões tcp estabelecidas
# netstat -p - lista os programas que estão usando a conexão
# netstat --numeric-ports - não converte o número da porta para ser listado
# netstat --numeric-hosts - não converte o número de ip para nome do host

Comando que resolveu meu problema:

# netstat -t -l -p --numeric-ports

Open Files

Vendo as conexões abertas através do comando lsof. O comando lsof lista os arquivos abertos, através disto vamos procurar o arquivo aberto relacionado às portas tcp.

Obs.: Ele pode pegar muitas informações interessantes sobre os arquivos abertos, mas não é escopo deste artigo. :)

Sintaxe: lsof -i protocolo

Exemplo:

# lsof -i tcp

Tabela de dados para o status do socket - versão do kernel 2.6.21.5 Slackware Linux 12

st status socket values
significado valor
TCP_ESTABLISHED01
TCP_SYN_SENT02
TCP_SYN_RECV03
TCP_FIN_WAIT104
TCP_FIN_WAIT205
TCP_TIME_WAIT06
TCP_CLOSE07
TCP_CLOSE_WAIT08
TCP_LAST_ACK09
TCP_LISTEN0A
TCP_CLOSING0B
TCP_MAX_STATES0C

Ambiente de teste

  • Slackware 12.0
  • kernel 2.6.21.5

Conclusão

Estas foram apenas algumas maneiras, devem ter mais. Espero que tenham gostado e que algum dia isto seja útil a alguém =], bom para mim foi um grande aprendizado.

(Desculpe qualquer erro de português :X)

Definições

jiffy - medida utilizada para representar o uso de uma tarefa em chamadas de interrupção no processador (medida em um Linux com kernel 2.6.13 em um Intel 386 é de 4 ms ou 1/250th de um segundo)

Referências


   

Páginas do artigo
   1. Como verificar as conexões abertas no seu Linux de várias maneiras
Outros artigos deste autor

Instalando o Zenmap e mantendo-o atualizado no Slackware Linux

Leitura recomendada

Alcatel SpeedTouch USB no Slackware 10.1

Manter autenticado o Velox da Telemar

Montando um roteador com o floppyFW

Compartilhar uma conexão via rádio na rede interna

Entendendo TCP/IP (Parte 3) - Resolução de nomes

  
Comentários
[1] Comentário enviado por gabrielsimas em 13/09/2008 - 13:12h

Muito bom o seu artigo.
Adicionou bastante valor para o que eu preciso.

abraços e continue assim

[2] Comentário enviado por removido em 13/09/2008 - 20:30h

Tinha que ser você né Marco?
Sumido hein , cara....
Até mais.

[3] Comentário enviado por Reideer em 15/09/2008 - 09:59h

po cara, parabens aí.
agora é meio tarde, mas outro dia me bati um bocado com algo similar.
bom, agora não me bato mais com este tipo de coisas...

vlw

[4] Comentário enviado por Thiago Madella em 16/09/2008 - 16:47h

Muito legal kara, Isso é muito util mesmo.

[5] Comentário enviado por luizvieira em 20/04/2009 - 15:43h

Ótimo artigo!
Bom para ilustrar o segundo passo de um pen test: footprinting, para descobrir portas abertas.
Uma boa ferramenta para isso tbm é o netcat, nosso querido canivete suiço.
Parabéns!

[6] Comentário enviado por dacarfre em 20/09/2011 - 11:34h

Mto bom o artigo, parabéns....

[7] Comentário enviado por Zirou em 23/09/2015 - 15:47h

Rápido e direto brow muito bom artigo, muito obrigado me ajudou.


Contribuir com comentário