Listar conexões de rede sem netstat

Neste post vou mostrar como visualizar o status das conexões de rede mesmo em situações em que o utilitário netstat não esteja disponível.

É relativamente comum, principalmente em ambientes de containers, que você precise fazer um diagnóstico de algum problema de conectividade, mas o sistema onde você precisa conectar não dispõe do netstat nem permite a sua instalação.

De uma forma bem simplista, podemos verificar as informações de conexões listando o conteúdo do arquivo "/proc/net/tcp" ou "/proc/net/tcp6", caso esteja utilizando IPv6.

O ponto que torna a visualização mais complicada é que as informações nesses arquivos estão em hexadecimal.

cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt  uid  timeout inode
   0: 5120A8C0:862A 21327092:0050 06 00000000:00000000 03:0000060B 00000000    0        0 0 3 0000000000000000
   1: 5120A8C0:A302 AE1ED9AC:01BB 02 00000001:00000000 01:00000213 00000003    0        0 521729281 2 0000000000000000 800 0 0 1 7

Mas, caso o sistema em questão possua o AWK instalado, o código abaixo vai te ajudar a ter uma visão mais simplificada das informações de rede contidas nesses arquivos.

function hextodec(str,ret,n,i,k,c){
    ret = 0
    n = length(str)
    for (i = 1; i <= n; i++) {
        c = tolower(substr(str, i, 1))
        k = index("123456789abcdef", c)
        ret = ret * 16 + k
    }
    return ret
}
function getIP(str,ret){
    ret=hextodec(substr(str,index(str,":")-2,2));
    for (i=5; i>0; i-=2) {
        ret = ret"."hextodec(substr(str,i,2))
    }
    ret = ret":"hextodec(substr(str,index(str,":")+1,4))
    return ret
}
function getState(str,ret){
    if (str=="01") ret="ESTABLISHED"
    if (str=="02") ret="SYN SENT"
    if (str=="04") ret="FIN WAIT1"
    if (str=="05") ret="FIN WAIT2"
    if (str=="06") ret="TIME WAIT"
    if (str=="10") ret="LISTEN"
    return ret
}
NR > 1 {{if(NR==2)print "Local - Remote - State";local=getIP($2);remote=getIP($3);state=getState($4)}{print local" - "remote" - "state}}

Esse código AWK pode ser salvo em um arquivo (netstat.awk, por exemplo) e invocado com o parâmetro -f (awk -f netstat.awk /proc/net/tcp), ou então pode ser chamado de forma inline com todo o bloco de código entre aspas simples, conforme abaixo.

awk 'function hextodec(str,ret,n,i,k,c){
    ret = 0
    n = length(str)
    for (i = 1; i <= n; i++) {
        c = tolower(substr(str, i, 1))
        k = index("123456789abcdef", c)
        ret = ret * 16 + k
    }
    return ret
}
function getIP(str,ret){
    ret=hextodec(substr(str,index(str,":")-2,2));
    for (i=5; i>0; i-=2) {
        ret = ret"."hextodec(substr(str,i,2))
    }
    ret = ret":"hextodec(substr(str,index(str,":")+1,4))
    return ret
}
function getState(str,ret){
    if (str=="01") ret="ESTABLISHED"
    if (str=="02") ret="SYN SENT"
    if (str=="04") ret="FIN WAIT1"
    if (str=="05") ret="FIN WAIT2"
    if (str=="06") ret="TIME WAIT"
    if (str=="10") ret="LISTEN"
    return ret
}
NR > 1 {{if(NR==2)print "Local - Remote - State";local=getIP($2);remote=getIP($3);state=getState($4)}{print local" - "remote" - "state}}' /proc/net/tcp

Esse comando vai produzir uma saída semelhante à esta abaixo.

Local - Remote - State
192.168.32.81:51940 - 146.112.50.180:443 - TIME WAIT
192.168.32.81:46676 - 200.147.3.157:443 - SYN SENT

O que torna bem mais fácil interpretar o conteúdo do arquivo.

Comentários

Postagens mais visitadas deste blog

Gerar uma cadeia de certificados usando OpenSSL

Migrar Replicação do SYSVOL de FRS para DFS

Converter um certificado PEM/CRT + KEY para PFX