Existem diversas formas de consultar se uma porta está aberta ou fechada em um determinado host da rede (remotamente).
Uns preferem abrir uma conexão normal pelo programa padrão (um navegador se a porta for 80, um cliente de e-mail se a porta for 143, 25 ou 110), outros preferem abrir um “telnet host porta” e há ainda aqueles que usam programas exploradores de rede e port scanners como o “nmap“.
Neste post, vou explicar como usar o “netcat” (binario nc) para explorar determinada porta em um host de sua rede. Ainda teremos um exemplo de combinação de códigos em shellscript para informar a você se a porta está aberta ou fechada.
Para entender o uso do netcat para este fim, imaginemos que em minha máquina local tenho o serviço OpenSSH aguardando conexões na porta 22, mas não tenho nenhum serviço aguardando conexões na porta 23. Ou seja:
Porta 22 está aberta.
Porta 23 está fechada.
Segue linha de comando para verificar a porta 22:
root@vostrolab:/# nc -w1 localhost 22 <<< ”
SSH-2.0-OpenSSH_5.1p1 Debian-5ubuntu1
Protocol mismatch.
O retorno do serviço OpenSSH indica que a porta está aberta. Em seguida ele informa que o protocolo não casa e fecha a conexão.
Já na porta 23:
root@vostrolab:/# nc -w1 localhost 23 <<< ”
localhost [127.0.0.1] 23 (telnet) : Connection refused
O retorno “Connection refused” indica que a a conexão foi recusada, ou seja, tudo indica que a porta estar fechada.
Se direcionarmos a saida padrão (STDOUT) e saida de erro (STDERR) para /dev/null, não veremos estes outputs intuitivos, porém a variavel de retorno do shell $? vai continuar sendo alimentada, e é com ela que nosso shell vai funcionar. Repare abaixo:
root@vostrolab:/# nc -w1 localhost 22 <<< ” 1>>/dev/null 2>>/dev/null
root@vostrolab:/# echo $?
0
O retorno zero indica que nenhum erro aconteceu, e que tudo indica que o handshake inicial aconteceu normalmente…
Já na porta 23:
root@vostrolab:/# nc -w1 localhost 23 <<< ” 1>>/dev/null 2>>/dev/null
root@vostrolab:/# echo $?
1
Olha o retorno um ali, indicando que aconteceu algum erro. Compreendido?
Se colocarmos isso em uma estrutura de decisão IF e organizarmos os parâmetros, fica assim:
#!/bin/bash
HOST=$1
PORTA=$2
if [ $# != 2 ]; then
echo “utilize: $0 host porta”
exit 0
else
if nc -w1 $HOST $PORTA <<< ” 1>>/dev/null 2>>/dev/null ; then
echo “Porta $PORTA esta’ aberta em $HOST…”
else
echo “Porta $PORTA esta’ fechada em $HOST…”
fi
fi
E a execução fica assim:
root@vostrolab:/# ./porta
utilize: ./porta host porta
root@vostrolab:/# ./porta localhost 22
Porta 22 esta’ aberta em localhost…
root@vostrolab:/# ./porta localhost 23
Porta 23 esta’ fechada em localhost…
root@vostrolab:/#
Funciona para host remoto também, conforme abaixo:
root@vostrolab:/# ./porta 192.168.0.1 23
Porta 23 esta’ fechada em 192.168.0.1…
root@vostrolab:/# ./porta 192.168.0.1 80
Porta 80 esta’ aberta em 192.168.0.1…
root@vostrolab:/#
Por: Hudson Murilo dos Santos
Fonte de pesquisa: Google
vlw brigadaooooooooooo 🙂
não entendi nada kra
Olá Jimmy!
Obrigado pela leitura e comentário.. mesmo que não tenha entendido nada.
Sobre seu não entendimento: Isso é normal, muitas pessoas não entendem os conteúdos aqui do BLOG CIALINUX visto que é um assunto bem aplicado e específico.
Mas não desista, e sim faça perguntas. Estamos aqui para esclarecê-las. Fique a vontade.
Atenciosamente,
Hudson
Dúvida de leigo: se a porta estiver aberta, significa que a mesma está sendo utilizada por algum programa, correcto?
Sim Henrique! Isso mesmo! Todas as portas estão fechadas por padrão. Algo ou alguém tem que abrí-las.
Pra você entender bem o assunto que gerou a sua pergunta, você pode raciocinar da seguinte maneira, bem simples:
– O que é uma porta aberta em um computador? R: É um bloco de código XYZ escrito por algum programador, que foi acionado manualmente ou automaticamente e está aguardando uma interação qualquer. Quando algum outro código qualquer KHZ, comunicar-se com o código XYZ, houve-uma interação, algum tipo de troca de informação, houve handshake…
Logo, percebemos que precisa haver alguma interação, seja automática ou manual, para poder abrir uma porta.
É mesma coisa que pensar em seu computador desligado da tomada, ele simplesmente não computa.. algo ou alguém precisa ligá-lo na energia elétrica e então, quando os componentes eletrônicos (que foram programados) começarem a entrar em funcionamento lógico, começa/continua a “vida” do software, por assim dizer, o computador começa a computar…
Assim também são as portas, elas estão fechadas, e algum código precisa acioná-las.
Nossa, fui longe agora. =) Mas o objetivo é que você compreenda bem o assunto que gerou a sua pergunta.
Obrigado pela leitura e volte sempre.
Cordialmente,
Fica mais uma dica… Para ver o PID do processo que está conectado ou abrindo uma porta localmente pode usar:
netstat -tupln |grep “PORTA DE INTERESSE”
O resultado trás uma coluna com o PID do fulano que mantem a porta aberta ou conectado à mesma…
Obrigado pela visita ao Blog.