Su servidor Linux se está ejecutando y ahora desea verificar si un puerto específico está abierto para poder acceder a él de forma remota. Verificar los puertos abiertos es una tarea bastante común para los administradores de sistemas, y hay algunas formas diferentes de hacerlo en Linux.
En este artículo, aprenderá varias formas de verificar si un puerto está abierto en Linux para que pueda elegir cuál funciona mejor para usted. ¿Listo? ¡Sigue leyendo!
Requisitos
Este tutorial será una demostración práctica. Si desea seguirlo, asegúrese de tener lo siguiente.
- Una computadora con Linux. Esta guía usa Ubuntu 20.04, pero cualquier distribución reciente de Linux debería funcionar.
- Acceso a una terminal. Si utiliza un entorno de escritorio gráfico, busque un programa emulador de terminal en el menú de su aplicación. O, si inició sesión en un servidor remoto a través de SSH,
- Una cuenta de usuario con
sudo
privilegios Para simplificar, este tutorial utiliza el usuario root.
Comprobar si un puerto está abierto en Linux usando netstat
El primer método para verificar si un puerto está abierto en Linux es ejecutar netstat
dominio. Este comando muestra conexiones de red, tablas de enrutamiento y muchas estadísticas de interfaz de red.
El netstat
el comando es parte del net-tools
paquete, y es posible que este paquete no venga de forma predeterminada con su distribución de Linux. En Ubuntu, instala netstat
ejecutando los siguientes comandos en la terminal.
apt update -y && apt install net-tools -y
Suponga que tiene un servidor web NGINX ejecutándose y desea verificar si el puerto 80
Esta abierto. Puede hacerlo ejecutando el siguiente comando. Reemplazar 80
con el número de puerto que desea comprobar.
Los -tulpn
banderas instruir netstat
para mostrar todos los puertos de escucha. El primer grep
El comando encuentra y filtra la línea que contiene la palabra LISTEN
en el resultado. El segundo grep
El comando filtra los resultados para mostrar solo aquellos elementos que coincidan con :80
.
netstat -tulpn | grep LISTEN | grep :80
Para obtener más información sobre las banderas de netstat, ejecute el comando netstat –help.
Si el puerto está abierto, verá el siguiente resultado. Como puede ver, el resultado muestra que el puerto 80 está abierto en el sistema. tcp es el tipo de protocolo y :::80
indica que es un TCPv6 Puerto. 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.
Comprobar si un puerto está abierto usando ss
El ss
command es otra utilidad de línea de comandos para comprobar los puertos abiertos. Este comando muestra estadísticas de socket, que puede usar para confirmar si un puerto está abierto o no. El ss
El comando muestra más información sobre los puertos abiertos que las otras herramientas.
Como el netstat
comando, el -t
bandera instruye a ss
para mostrar solo sockets TCP, -u
para mostrar solo sockets UDP, y -l
para mostrar solo los enchufes de escucha. El -p
bandera indica el nombre del proceso o PID usando el puerto.
ss -tulpn | grep LISTEN | grep :80
Verá el siguiente resultado si el puerto está abierto. Como puede ver, la salida contiene el nombre del proceso y el PID para cada puerto de escucha. En este caso, el puerto 80 está abierto y el servidor web NGINX lo está utilizando.
Comprobar si un puerto está abierto usando lsof
El lsof
El comando es otra herramienta útil para comprobar si hay puertos abiertos. El lsof
nombre significa lista de archivos abiertos , que muestra información sobre los archivos que están abiertos en el sistema. Esta información incluye descriptores de archivos, identificaciones de procesos, identificaciones de usuarios, etc.
¿Cómo le ayuda la lista de archivos abiertos a determinar si un puerto está abierto? Probablemente ya haya escuchado la frase "todo en Linux es un archivo", y esta frase significa lo que dice.
Por ejemplo, suponga que desea verificar si el puerto 22 está abierto y sus usuarios pueden acceder a su servidor mediante SSH. Ejecute el siguiente comando para enumerar los archivos abiertos con conexiones activas en el puerto 22.
El -i
bandera instruye lsof
para mostrar todas las tomas de Internet abiertas. El -P
bandera muestra los números de puerto en lugar de los nombres de servicio. Y el -n
El indicador suprime las búsquedas de nombres de servicio y DNS, por lo que verá 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á el siguiente resultado. Como puede ver, la salida contiene información sobre:
1027 is the process id of the sshd service.
root is the user id that is using the port.
3u and 4u are the file descriptors for IPv4 and IPv6, respectively.
31035 and 31037 are the network ports for IPv4 and IPv6, respectively.
:22 indicates that port 22 is open for all IPv4 and IPv6 addresses.
- (LISTEN) muestra que el puerto está escuchando conexiones entrantes.
0t0 is the status of the socket, which means that the socket is in the LISTEN state.
Comprobar si un puerto está abierto usando nmap
Hasta ahora, ha visto cómo verificar si un puerto está abierto en Linux usando la línea de comando. Pero, ¿qué sucede si desea verificar si un puerto está abierto en una máquina remota? En ese caso, puedes usar el nmap
herramienta.
Pero antes de ejecutar nmap
, tenga en cuenta que esta herramienta puede no ser parte de los paquetes predeterminados en su distribución de Linux. En cuyo caso, primero debe instalar nmap
ejecutando el siguiente comando.
apt install nmap -y
Ahora, ejecute 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 su usuario pueda SSH en su servidor. Reemplace la dirección IP según sea necesario con la suya.
nmap -p 22 159.89.176.25
Como puede ver, la salida contiene información sobre:
- La hora 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á usando el puerto (ssh ).
- El estado del host (up ).
El resultado confirma que los usuarios pueden usar SSH en la computadora usando la dirección IP y el puerto.
ssh [email protected] -p 22
La siguiente captura de pantalla muestra una conexión SSH exitosa al servidor, lo que demuestra que el puerto 22 está abierto.
Probar si un puerto está abierto desde un script de Shell
La automatización siempre es una buena idea. Verificar los puertos abiertos ejecutando un script de shell es una excelente manera de probar múltiples puertos. Puede usar cualquier método anterior para verificar si un puerto está abierto. Pero, para este ejemplo, escribirá un script de shell básico que ejecuta Netcat nc
comando.
1. Cree un archivo llamado check_port .sh en su directorio de inicio usando su editor de texto preferido. Este ejemplo usa nano.
nano check_port.sh
2. Copie el siguiente código de muestra en su editor. Reemplace 80 con el número de puerto que desea verificar.
El si condition comprueba si el puerto 80 está abierto mediante el comando nc. 2>&1 y>/dev/null redirigen los mensajes de error y de salida a /dev/null, respectivamente. El /dev/null es un archivo especial que descarta todo lo que recibe.
Si el puerto está abierto, el check_port.sh el script se imprimirá en línea en la consola. De lo contrario, el script se imprimirá sin conexión.
if ( nc -zv localhost 80 2>&1 >/dev/null ); then
echo 'Online'
else
echo 'Offline'
fi
El archivo de secuencia de comandos debe ser similar a la siguiente captura de pantalla. Guarde el script y salga del editor.
3. Ejecute el script de shell para comenzar a verificar los puertos abiertos que especificó dentro del script.
bash check_port.sh
Verá uno de los siguientes resultados dependiendo de si el puerto está abierto. En este caso, el puerto está abierto, que el mensaje Online
confirma.
Puede usar este script de shell para verificar si un puerto está abierto en un intervalo o en un trabajo programado. Las secuencias de comandos son especialmente útiles cuando tiene que comprobar varios servidores. Solo necesita copiar este check_port.sh script a todos los servidores que desea verificar y ejecútelo usando herramientas de CI/CD como Jenkins o Ansible.
Comprobar si un puerto está abierto mediante 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 puede usar PowerShell en Linux para verificar puertos abiertos y conexiones usando la clase TcpClient.
Si su computadora con Linux aún no tiene PowerShell, instálelo siguiendo las instrucciones de esta documentación de Microsoft:Instalar PowerShell en Linux.
1. Inicie PowerShell ejecutando el siguiente comando.
pwsh
2. Luego, cree un archivo llamado Test-Port.ps1 usando su editor de texto. Este ejemplo usa nano.
nano Test-Port.ps1
3. A continuación, copie el siguiente código en su editor. Guarde el archivo y luego salga del editor.
Nota:Este código es un extracto de la herramienta de prueba de puerto de prueba de PowerShell todo en uno.
<#
.SYNOPSIS
This function tests for open TCP/UDP ports.
.DESCRIPTION
This function tests any TCP/UDP port to see if it's open or closed.
.NOTES
.PARAMETER Computername
One or more remote, comma-separated computer names
.PARAMETER Port
One or more comma-separated port numbers you'd like to test.
.PARAMETER TcpTimeout
The number of milliseconds that the function will wait until declaring
the TCP port closed. Default is 1000.
.EXAMPLE
PS> Test-Port -Computername 'LABDC','LABDC2' -Protocol TCP 80,443
This example tests the TCP network ports 80 and 443 on both the LABDC
and LABDC2 servers.
#>
[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:$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
:$Portx'"
$Output.Result = $false
}
else {
$TcpClient.EndConnect($Connect)
$TcpClient.Close()
Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' passed port test on port '$Protocol:$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 -ComputerName acepta la lista de nombres de host, FQDN o direcciones IP de las máquinas de destino.
El parámetro -Port acepta una matriz de uno o más números de puerto para probar.
./Test-Port.ps1 -ComputerName localhost -Port 22,80,443
Como 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).
Para ejecutar el mismo script en varios puntos finales y puertos de destino, edite el siguiente código para agregar todos los equipos de destino en el parámetro ComputerName y los números de puerto en el parámetro Port.
./Test-Port.ps1 `
-ComputerName adamtheautomator.com,localhost,8.8.8.8 `
-Port 22,80,443,53
Conclusión
En este artículo, ha aprendido cómo verificar si un puerto está abierto o no en Linux. También ha aprendido a verificar si un puerto está abierto desde un script de shell y PowerShell. Ahora, puede usar cualquiera de estos métodos para verificar si un puerto está abierto en su máquina o en cualquier máquina remota.
Sin embargo, no te detengas aquí. ¡Consulte otros artículos de solución de problemas para continuar perfeccionando sus habilidades de administrador del sistema!