Todas las formas de verificar si un puerto está abierto en Linux

Tu servidor Linux está en funcionamiento y ahora quieres comprobar si un puerto específico está abierto para poder acceder a él de forma remota. Comprobar los puertos abiertos es una tarea bastante común para los administradores del sistema, y hay algunas formas diferentes de hacerlo en Linux.

En este artículo, aprenderás varias formas de comprobar si un puerto está abierto en Linux para que puedas elegir las que mejor funcionen para ti. ¿Listo? ¡Continúa leyendo!

Prerrequisitos

Este tutorial será una demostración práctica. Si quieres seguirlo, asegúrate de tener lo siguiente.

  • A Linux computer. This guide uses Ubuntu 20.04, but any recent Linux distribution should work.
  • Acceso a un terminal. Si utilizas un entorno de escritorio gráfico, busca un programa emulador de terminal en el menú de aplicaciones. O, si iniciaste sesión en un servidor remoto a través de SSH,
  • A user account with sudo privileges. For simplicity, this tutorial uses the root user.

Comprobar si un puerto está abierto en Linux usando netstat

El primer método para comprobar si un puerto está abierto en Linux es ejecutando el comando netstat. Este comando muestra las conexiones de red, las tablas de enrutamiento y muchas estadísticas de interfaces de red.

El comando netstat es parte del paquete net-tools, y este paquete puede no venir por defecto con tu distribución de Linux. En Ubuntu, instala netstat ejecutando los siguientes comandos en el terminal.

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

Supongamos que tienes un servidor web NGINX en funcionamiento y quieres comprobar si el puerto 80 está abierto. Puedes hacerlo ejecutando el siguiente comando. Reemplaza 80 con el número de puerto que deseas verificar.

Las banderas -tulpn instruyen a netstat a mostrar todos los puertos en escucha. El primer comando grep encuentra y filtra la línea que contiene la palabra LISTEN en el resultado. El segundo comando grep filtra los resultados para mostrar solo aquellos elementos que coinciden con :80.

netstat -tulpn | grep LISTEN | grep :80

Para obtener más información sobre las banderas de netstat, ejecuta el comando netstat –help.

Si el puerto está abierto, verás la siguiente salida. Como puedes ver, la salida muestra que el puerto 80 está abierto en el sistema. tcp es el tipo de protocolo, y :::80 indica que es un puerto TCPv6. 0.0.0.0:80 significa que el puerto está abierto para todas las direcciones IPv4. 80 es el puerto HTTP predeterminado que proporciona acceso al sitio web.

Checking If a Port is Open with netstat

Comprobando Si un Puerto está Abierto Usando ss

El comando ss es otra utilidad de línea de comandos para verificar puertos abiertos. Este comando muestra estadísticas de socket, que puedes utilizar para confirmar si un puerto está abierto o no. El comando ss muestra más información sobre los puertos abiertos que otras herramientas.

Al igual que el comando netstat, la bandera -t instruye a ss para mostrar solo sockets TCP, -u para mostrar solo sockets UDP, y -l para mostrar solo sockets en escucha. La bandera -p indica el nombre del proceso o PID que utiliza el puerto.

ss -tulpn | grep LISTEN | grep :80

Verás la siguiente salida si el puerto está abierto. Como puedes ver, la salida contiene el nombre del proceso y el PID para cada puerto en escucha. En este caso, el puerto 80 está abierto y el servidor web NGINX lo está utilizando.

Checking If a Port is Open Using ss

Verificando Si un Puerto Está Abierto Usando lsof

El comando lsof es otra herramienta útil para verificar puertos abiertos. El nombre lsof significa listar archivos abiertos, que muestra información sobre archivos que están abiertos en el sistema. Esta información incluye descriptores de archivos, IDs de proceso, IDs de usuario, etc.

¿Cómo ayuda listar archivos abiertos a determinar si un puerto está abierto? Probablemente ya hayas escuchado la frase “todo en Linux es un archivo”, y esta frase significa lo que dice.

Por ejemplo, supongamos que quieres verificar si el puerto 22 está abierto y tus usuarios pueden hacer SSH en tu servidor. Ejecuta el siguiente comando para listar archivos abiertos con conexiones activas en el puerto 22.

La bandera -i indica a lsof que muestre todos los sockets de Internet abiertos. La bandera -P muestra los números de puerto en lugar de los nombres de servicio. Y la bandera -n suprime las búsquedas de DNS y nombres de servicio, por lo que verás las direcciones IP en lugar de los nombres de host remotos.

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

Si el puerto está abierto, verás la siguiente salida. Como puedes observar, la salida contiene información sobre:

  • 1027 es el ID de proceso del servicio sshd.
  • root es el ID de usuario que está utilizando el puerto.
  • 3u y 4u son los descriptores de archivo para IPv4 e IPv6, respectivamente.
  • 31035 y 31037 son los puertos de red para IPv4 e IPv6, respectivamente.
  • :22 indica que el puerto 22 está abierto para todas las direcciones IPv4 e IPv6.
  • (LISTEN) muestra que el puerto está a la espera de conexiones entrantes.
  • 0t0 es el estado del socket, lo que significa que el socket está en estado LISTEN.
Checking If a Port is Open Using lsof

Comprobación de si un puerto está abierto usando nmap

Hasta ahora, has visto cómo comprobar si un puerto está abierto en Linux usando la línea de comandos. Pero ¿qué pasa si quieres comprobar si un puerto está abierto en una máquina remota? En ese caso, puedes utilizar la herramienta nmap.

Pero antes de ejecutar nmap, ten en cuenta que esta herramienta puede no ser parte de los paquetes predeterminados en tu distribución de Linux. En ese caso, primero debes instalar nmap ejecutando el siguiente comando.

apt install nmap -y

Ahora, ejecuta el siguiente comando para verificar si un puerto está abierto en una máquina remota. Este comando prueba si el puerto 22 está abierto en 159.89.176.25 para que tu usuario pueda hacer SSH en tu servidor. Reemplaza la dirección IP según sea necesario con la tuya.

nmap -p 22 159.89.176.25

Como puedes ver, la salida contiene información sobre:

  • El tiempo de inicio del escaneo de puertos (2022-06-30 16:58 UTC).
  • La dirección IP de la máquina remota (159.89.176.25).
  • El estado del puerto (abierto).
  • El servicio que está utilizando el puerto (ssh).
  • El estado del host (activo).
Checking If a Port is Open Using nmap

El resultado confirma que los usuarios pueden hacer SSH en la computadora usando la dirección IP y el puerto.

ssh [email protected] -p 22

La captura de pantalla a continuación muestra una conexión SSH exitosa al servidor, demostrando que el puerto 22 está abierto.

SSHing into your server

Probando si un puerto está abierto desde un script de shell

La automatización siempre es una buena idea. Verificar puertos abiertos ejecutando un script de shell es una excelente manera de probar múltiples puertos. Puedes usar cualquier método anterior para verificar si un puerto está abierto. Pero, para este ejemplo, escribirás un script de shell básico que ejecuta el comando Netcat nc.

1. Crea un archivo llamado check_port.sh en tu directorio de inicio usando tu editor de texto preferido. En este ejemplo se usa nano.

nano check_port.sh

2. Copia el siguiente código de ejemplo 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 usando el comando nc. El 2>&1 y >/dev/null redirigen los mensajes de error y de 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 la consola “Online”. De lo contrario, el script imprimirá “Offline”.

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

El archivo de script debería lucir similar a la captura de pantalla a continuación. Guarda el script y cierra el 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, lo que confirma el mensaje Online.

Check if the 80 port is open

Puedes usar este script de shell para verificar si un puerto está abierto en un intervalo o como una tarea programada. La creación de scripts es especialmente útil cuando tienes que verificar múltiples servidores. Solo necesitas copiar este script check_port.sh en todos los servidores que desees verificar y ejecutarlo utilizando herramientas de CI/CD como Jenkins o Ansible.

Comprobación Si un Puerto está Abierto Usando PowerShell

PowerShell tiene un cmdlet integrado para probar conexiones de red llamado Test-NetConnection — pero ese cmdlet solo está disponible en sistemas Windows. No te preocupes; aún puedes usar PowerShell en Linux para verificar puertos abiertos y conexiones utilizando la clase TcpClient.

Si tu computadora Linux aún no tiene PowerShell, instálalo siguiendo las instrucciones en esta documentación de Microsoft: Instalar PowerShell en Linux.

1. Inicia PowerShell ejecutando el siguiente comando.

pwsh
Launching PowerShell

2. Luego, crea un archivo llamado Test-Port.ps1 usando tu editor de texto. Este ejemplo utiliza nano.

nano Test-Port.ps1

3. A continuación, copia el código a continuación en tu editor. Guarda el archivo y sal del editor después.

Nota: Este código es un extracto de la Herramienta de Prueba de Puertos Todo en Uno PowerShell.

<#
	.SINOPSIS
		Esta función prueba puertos TCP/UDP abiertos.
	.DESCRIPCIÓN
		Este función prueba cualquier puerto TCP/UDP para ver si está abierto o cerrado.
	.NOTAS

	.PARÁMETRO NombreEquipo
		Uno o más nombres de equipo remotos separados por comas.
	.PARÁMETRO Puerto
		Uno o más números de puerto separados por comas que desea probar.
	.PARÁMETRO TcpTimeout
		El número de milisegundos que la función esperará antes de declarar
		el puerto TCP cerrado. El valor predeterminado es 1000.
	.EJEMPLO
		PS> Test-Port -NombreEquipo 'LABDC','LABDC2' -Protocolo TCP 80,443
		
		Este ejemplo prueba los puertos de red TCP 80 y 443 en los servidores LABDC
		y 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. Después de guardar el script Test-Port.ps1, ejecute el siguiente comando para probar los puertos 22, 80, 443 y 53.

El parámetro -NombreEquipo acepta la lista de nombres de host, FQDN o direcciones IP de la(s) máquina(s) objetivo.

El parámetro -Puerto acepta una matriz de uno o más números de puerto para probar.

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

Como se puede ver a continuación, el resultado muestra que los puertos 22 y 80 están abiertos (Verdadero), mientras que el puerto 443 no lo está (Falso).

Checking for open ports using PowerShell scripting

Para ejecutar el mismo script contra múltiples puntos finales y puertos objetivo, edite el siguiente código para agregar todos los equipos objetivo en el parámetro NombreEquipo y los números de puerto en el parámetro Puerto.

./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

Conclusión

En este artículo, has aprendido cómo verificar si un puerto está abierto o no en Linux. También has aprendido a verificar si un puerto está abierto desde un script de shell y PowerShell. Ahora, puedes usar cualquiera de estos métodos para verificar si un puerto está abierto en tu máquina o en cualquier máquina remota.

Sin embargo, no te detengas aquí. ¡Consulta otros artículos de solución de problemas para seguir perfeccionando tus habilidades como administrador del sistema!

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