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
Postar um comentário