Todas as maneiras de verificar se uma porta está aberta no Linux

Seu servidor Linux está em execução e agora você deseja verificar se uma porta específica está aberta para que você possa acessá-la remotamente. Verificar portas abertas é uma tarefa bastante comum para administradores de sistemas, e existem algumas maneiras diferentes de fazer isso no Linux.

Neste artigo, você aprenderá várias maneiras de verificar se uma porta está aberta no Linux, para que você possa escolher aquelas que funcionam melhor para você. Pronto? Continue lendo!

Pré-requisitos

Este tutorial será uma demonstração prática. Se você quiser acompanhar, certifique-se de ter o seguinte.

  • A Linux computer. This guide uses Ubuntu 20.04, but any recent Linux distribution should work.
  • Acesso a um terminal. Se você usa um ambiente de desktop gráfico, procure por um programa emulador de terminal no menu de aplicativos. Ou, se você acessou um servidor remoto via SSH,
  • A user account with sudo privileges. For simplicity, this tutorial uses the root user.

Verificar se uma Porta Está Aberta no Linux Usando o netstat

O primeiro método para verificar se uma porta está aberta no Linux é executar o comando netstat. Este comando exibe conexões de rede, tabelas de roteamento e muitas estatísticas de interface de rede.

O comando netstat faz parte do pacote net-tools, e este pacote pode não vir por padrão com sua distribuição Linux. No Ubuntu, instale o netstat executando os seguintes comandos no terminal.

apt update -y && apt install net-tools -y

Suponha que você tenha um servidor web NGINX em execução e queira verificar se a porta 80 está aberta. Você pode fazer isso executando o seguinte comando. Substitua 80 pelo número da porta que deseja verificar.

As bandeiras -tulpn instruem o netstat a exibir todas as portas em escuta. O primeiro comando grep encontra e filtra a linha contendo a palavra LISTEN no resultado. O segundo comando grep filtra os resultados para exibir apenas os itens correspondentes a :80.

netstat -tulpn | grep LISTEN | grep :80

Para saber mais sobre as bandeiras do netstat, execute o comando netstat –help.

Se a porta estiver aberta, você verá a seguinte saída. Como pode ver, a saída mostra que a porta 80 está aberta no sistema. tcp é o tipo de protocolo, e :::80 indica que é uma porta TCPv6. 0.0.0.0:80 significa que a porta está aberta para todos os endereços IPv4. 80 é a porta HTTP padrão que oferece acesso ao site.

Checking If a Port is Open with netstat

Verificando se uma Porta Está Aberta Usando ss

O comando ss é outra utilidade de linha de comando para verificar portas abertas. Este comando exibe estatísticas de soquete, que você pode usar para confirmar se uma porta está aberta ou não. O comando ss exibe mais informações sobre portas abertas do que outras ferramentas.

Assim como o comando netstat, a bandeira -t instrui o ss a exibir apenas soquetes TCP, -u para exibir apenas soquetes UDP e -l para mostrar apenas soquetes de escuta. A bandeira -p indica o nome do processo ou PID usando a porta.

ss -tulpn | grep LISTEN | grep :80

Você verá a seguinte saída se a porta estiver aberta. Como você pode ver, a saída contém o nome do processo e PID para cada porta de escuta. Neste caso, a porta 80 está aberta e o servidor web NGINX a está usando.

Checking If a Port is Open Using ss

Verificando se uma Porta Está Aberta Usando o lsof

O comando lsof é outra ferramenta útil para verificar portas abertas. O nome lsof significa listar arquivos abertos, que exibe informações sobre arquivos que estão abertos no sistema. Essas informações incluem descritores de arquivo, IDs de processo, IDs de usuário, etc.

Como listar arquivos abertos ajuda você a determinar se uma porta está aberta? Você provavelmente já ouviu a frase “tudo no Linux é um arquivo”, e esta frase significa o que diz.

Por exemplo, suponha que você queira verificar se a porta 22 está aberta e seus usuários podem fazer SSH no seu servidor. Execute o comando abaixo para listar os arquivos abertos com conexões ativas na porta 22.

A opção -i instrui o lsof a exibir todos os sockets de Internet abertos. A opção -P mostra os números de porta em vez dos nomes dos serviços. E a opção -n suprime as pesquisas de DNS e nomes de serviço, então você verá os endereços IP em vez dos nomes de host remotos.

lsof -i -P -n | grep LISTEN | grep :22

Se a porta estiver aberta, você verá a seguinte saída. Como pode ver, a saída contém informações sobre:

  • 1027 é o ID do processo do serviço sshd.
  • root é o ID de usuário que está usando a porta.
  • 3u e 4u são os descritores de arquivo para IPv4 e IPv6, respectivamente.
  • 31035 e 31037 são as portas de rede para IPv4 e IPv6, respectivamente.
  • :22 indica que a porta 22 está aberta para todos os endereços IPv4 e IPv6.
  • (LISTEN) mostra que a porta está escutando por conexões de entrada.
  • 0t0 é o status do socket, o que significa que o socket está no estado LISTEN.
Checking If a Port is Open Using lsof

Verificando se uma Porta está Aberta Usando o nmap

Até agora, você viu como verificar se uma porta está aberta no Linux usando a linha de comando. Mas e se você quiser verificar se uma porta está aberta em uma máquina remota? Nesse caso, você pode usar a ferramenta nmap.

Mas antes de executar o nmap, esteja ciente de que esta ferramenta pode não fazer parte dos pacotes padrão em sua distribuição Linux. Nesse caso, você deve primeiro instalar o nmap executando o comando abaixo.

apt install nmap -y

Agora, execute o seguinte comando para verificar se uma porta está aberta em uma máquina remota. Este comando testa se a porta 22 está aberta em 159.89.176.25 para que seu usuário possa fazer SSH no seu servidor. Substitua o endereço IP conforme necessário.

nmap -p 22 159.89.176.25

Como você pode ver, a saída contém informações sobre:

  • O horário de início da varredura de portas (2022-06-30 16:58 UTC).
  • O endereço IP da máquina remota (159.89.176.25).
  • O estado da porta (aberta).
  • O serviço que está usando a porta (ssh).
  • O estado do host (ativo).
Checking If a Port is Open Using nmap

O resultado confirma que os usuários podem fazer SSH no computador usando o endereço IP e a porta.

ssh [email protected] -p 22

A captura de tela abaixo mostra uma conexão SSH bem-sucedida ao servidor, comprovando que a porta 22 está aberta.

SSHing into your server

Testando se uma Porta Está Aberta a Partir de um Script Shell

A automação é sempre uma boa ideia. Verificar portas abertas executando um script shell é uma excelente maneira de testar várias portas. Você pode usar quaisquer métodos anteriores para verificar se uma porta está aberta. Mas, para este exemplo, você estará escrevendo um script shell básico que executa o Netcat comando nc.

1. Crea un archivo llamado check_port.sh en tu directorio principal utilizando tu editor de texto preferido. En este ejemplo, se utiliza nano.

nano check_port.sh

2. Copia el siguiente código de muestra en tu editor. Reemplaza 80 con el número de puerto que deseas verificar.

La condición if verifica si el puerto 80 está abierto utilizando el comando nc. Los redireccionamientos 2>&1 y >/dev/null envían los mensajes de error y salida a /dev/null, respectivamente. /dev/null es un archivo especial que descarta todo lo que recibe.

Si el puerto está abierto, el script check_port.sh imprimirá “En línea” en la consola. De lo contrario, el script imprimirá “Desconectado”.

if ( nc -zv localhost 80 2>&1 >/dev/null ); then
    echo 'Online'
else
    echo 'Offline'
fi

El archivo de script debería verse similar a la captura de pantalla siguiente. Guarda el script y sale del editor.

Creating the Shell script

3. Ejecuta el script de shell para comenzar a verificar los puertos abiertos que especificaste dentro del script.

bash check_port.sh

Verás uno de los siguientes resultados dependiendo de si el puerto está abierto. En este caso, el puerto está abierto, como confirma el mensaje En línea.

Check if the 80 port is open

Você pode usar este script shell para verificar se uma porta está aberta em um intervalo ou como um trabalho agendado. A automação de scripts é especialmente útil ao verificar várias servidores. Você só precisa copiar este script check_port.sh para todos os servidores que deseja verificar e executá-lo usando ferramentas de CI/CD, como Jenkins ou Ansible.

Testando se uma Porta está Aberta Usando PowerShell

O PowerShell possui um cmdlet integrado para testar conexões de rede chamado Test-NetConnection — mas esse cmdlet está disponível apenas em sistemas Windows. Não se preocupe; você ainda pode usar o PowerShell no Linux para verificar portas abertas e conexões usando a classe TcpClient.

Se seu computador Linux ainda não possui o PowerShell, instale-o seguindo as instruções na documentação da Microsoft: Instalar o PowerShell no Linux.

1. Inicie o PowerShell executando o comando abaixo.

pwsh
Launching PowerShell

2. Em seguida, crie um arquivo chamado Test-Port.ps1 usando seu editor de texto. Este exemplo usa o nano.

nano Test-Port.ps1

3. Depois, copie o código abaixo para o seu editor. Salve o arquivo e saia do editor em seguida.

Observação: Este código é um excerto da Ferramenta de Teste de Portas All-in-One PowerShell.

<#
	.SINOPSE
		Essa função testa portas TCP/UDP abertas.
	.DESCRIÇÃO
		Essa função testa qualquer porta TCP/UDP para verificar se está aberta ou fechada.
	.NOTAS

	.PARAMETER NomeDoComputador
		Um ou mais nomes de computadores remotos, separados por vírgula.
	.PARAMETER Porta
		Um ou mais números de porta separados por vírgula que você gostaria de testar.
	.PARAMETER TcpTimeout
		O número de milissegundos que a função aguardará até declarar
		a porta TCP fechada. O padrão é 1000.
	.EXEMPLO
		PS> Test-Port -NomeDoComputador 'LABDC','LABDC2' -Protocolo TCP 80,443
		
		Este exemplo testa as portas de rede TCP 80 e 443 nos servidores LABDC
		e LABDC2.
	#>
[CmdletBinding()]
[OutputType([System.Management.Automation.PSCustomObject])]
param (
    [Parameter(Mandatory)]
    [string[]]$ComputerName,
    [Parameter(Mandatory)]
    [int[]]$Port,
    [Parameter()]
    [int]$TcpTimeout = 1000
)
begin {
    $Protocol = 'TCP'
}
process {
    foreach ($Computer in $ComputerName) {
        foreach ($Portx in $Port) {            
            $Output = @{ 'Computername' = $Computer; 'Port' = $Portx; 'Protocol' = $Protocol; 'Result' = '' }
            Write-Verbose "$($MyInvocation.MyCommand.Name) - Beginning port test on '$Computer' on port '$Protocol<code>:$Portx'"

            $TcpClient = New-Object System.Net.Sockets.TcpClient
            $Connect = $TcpClient.BeginConnect($Computer, $Portx, $null, $null)
            $Wait = $Connect.AsyncWaitHandle.WaitOne($TcpTimeout, $false)
            if (!$Wait -or !($TcpClient.Connected)) {
                $TcpClient.Close()
                Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' failed port test on port '$Protocol</code>:$Portx'"
                $Output.Result = $false
            }
            else {
                $TcpClient.EndConnect($Connect)
                $TcpClient.Close()
                Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' passed port test on port '$Protocol<code>:$Portx'"
                $Output.Result = $true
                $TcpClient.Close()
                $TcpClient.Dispose()
            }
            [pscustomobject]$Output
        }
    }
}

4. Após salvar o script Test-Port.ps1, execute o comando abaixo para testar as portas 22, 80, 443 e 53.

O parâmetro -NomeDoComputador aceita a lista de nomes de host, FQDN ou endereços IP da(s) máquina(s) de destino.

O parâmetro -Porta aceita uma matriz de um ou mais números de porta para testar.

./Test-Port.ps1 -ComputerName localhost -Port 22,80,443

Como você pode ver abaixo, o resultado mostra que as portas 22 e 80 estão abertas (Verdadeiro), enquanto a porta 443 não está (Falso).

Checking for open ports using PowerShell scripting

Para executar o mesmo script em vários pontos de extremidade e portas de destino, edite o código abaixo para adicionar todos os computadores de destino no parâmetro NomeDoComputador e números de porta no parâmetro Porta.

./Test-Port.ps1 `
    -ComputerName adamtheautomator.com,localhost,8.8.8.8 `
    -Port 22,80,443,53
Checking for open ports on multiple targets using PowerShell scripting

Conclusão

Neste artigo, você aprendeu como verificar se uma porta está aberta ou não no Linux. Você também aprendeu a verificar se uma porta está aberta a partir de um script de shell e do PowerShell. Agora, você pode usar qualquer um desses métodos para verificar se uma porta está aberta em sua máquina ou em qualquer máquina remota.

Não pare por aqui, no entanto. Confira outros artigos de solução de problemas para continuar aprimorando suas habilidades como administrador de sistemas!

Source:
https://adamtheautomator.com/check-if-a-port-is-open-in-linux/