Ya sea que esté solucionando problemas de conectividad de red o configurando un firewall, una de las primeras cosas que debe verificar es qué puertos están realmente abiertos en su sistema.
Este artículo describe varios enfoques para averiguar qué puertos están abiertos al exterior en su sistema Linux.
¿Qué es el número de puerto abierto
Un puerto de escucha es un puerto de red en el que escucha una aplicación. Puede obtener una lista de los puertos de escucha en su sistema consultando la pila de red con comandos como ss
, netstat
o lsof
. Cada puerto de escucha se puede abrir o cerrar (filtrar) usando un firewall.
En términos generales, un puerto abierto es un puerto de red que acepta paquetes entrantes desde ubicaciones remotas.
Por ejemplo, si está ejecutando un servidor web que escucha en los puertos 80
y 443
y esos puertos están abiertos en su firewall, cualquier persona (excepto las ip bloqueadas) podrá acceder a los sitios web alojados en su servidor web usando su navegador. En este caso, ambos 80
y 443
son puertos abiertos.
Los puertos abiertos pueden representar un riesgo para la seguridad, ya que los atacantes pueden utilizar cada puerto abierto para explotar una vulnerabilidad o realizar cualquier otro tipo de ataque. Debe exponer solo los puertos necesarios para la funcionalidad de su aplicación y cerrar todos los demás puertos.
Verificar puertos abiertos con nmap
#
Nmap es una poderosa herramienta de escaneo de red que puede escanear hosts individuales y redes grandes. Se utiliza principalmente para auditorías de seguridad y pruebas de penetración.
Si está disponible, nmap
debe ser su primera herramienta cuando se trata de escanear puertos. Además del escaneo de puertos, nmap
también puede detectar la dirección Mac, el tipo de sistema operativo, las versiones del kernel y mucho más.
El siguiente comando emitido desde la consola determina qué puertos están escuchando las conexiones TCP de la red:
sudo nmap -sT -p- 10.10.8.8
El -sT
le dice a nmap
para buscar puertos TCP y -p-
para buscar todos los puertos 65535. Si -p-
no se usa nmap
escaneará solo los 1000 puertos más populares.
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-09 23:10 CEST
Nmap scan report for 10.10.8.8
Host is up (0.0012s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:05:49:23 (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds
El resultado anterior muestra que solo los puertos 22
, 80
y 8069
se abren en el sistema de destino.
Para buscar puertos UDP use -sU
en lugar de -sT
:
sudo nmap -sU -p- 10.10.8.8
Para obtener más información, visite la página de manual de nmap y lea sobre todas las demás opciones poderosas de esta herramienta.
Verificar puertos abiertos con netcat
#
Netcat (o nc
) es una herramienta de línea de comandos que puede leer y escribir datos a través de conexiones de red, usando los protocolos TCP o UDP.
Con netcat
puede escanear un solo puerto o un rango de puertos.
Por ejemplo, para buscar puertos TCP abiertos en una máquina remota con dirección IP 10.10.8.8
en el rango 20-80
usaría el siguiente comando:
nc -z -v 10.10.8.8 20-80
El -z
opción le dice a nc
para escanear solo en busca de puertos abiertos, sin enviar ningún dato y el -v
es para información más detallada.
La salida se verá así:
nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused
nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
...
Connection to 10.10.8.8 80 port [tcp/http] succeeded!
Si desea que solo las líneas con los puertos abiertos se impriman en la pantalla, filtre los resultados con grep
comando.
nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
Connection to 10.10.8.8 80 port [tcp/http] succeeded!
Para buscar puertos UDP, pase -u
opción al nc
comando:
nc -z -v -u 10.10.8.8 20-80 2>&1 | grep succeeded
El 2>&1
construir redirigir el error estándar a la salida estándar. Verificar puertos abiertos usando Bash Pseudo Device #
Otra forma de verificar si un determinado puerto está abierto o cerrado es usando el shell Bash /dev/tcp/..
o /dev/udp/..
pseudo-dispositivo.
Al ejecutar un comando en un /dev/$PROTOCOL/$HOST/$IP
pseudodispositivo, Bash abrirá una conexión TCP o UDP al host especificado en el puerto especificado.
La siguiente declaración if..else verificará si el puerto 443
en kernel.org
está abierto:
if timeout 5 bash -c '</dev/tcp/kernel.org/443 &>/dev/null'
then
echo "Port is open"
else
echo "Port is closed"
fi
Port is open
¿Cómo funciona el código anterior?
Cuando se conecta a un puerto usando un pseudodispositivo, el tiempo de espera predeterminado es enorme, por lo que estamos usando el timeout
comando para matar el comando de prueba después de 5 segundos. Si la conexión se establece con kernel.org
puerto 443
el comando de prueba devolverá verdadero.
Para verificar un rango de puertos, use el bucle for:
for PORT in {20..80}; do
timeout 1 bash -c "</dev/tcp/10.10.8.8/$PORT &>/dev/null" && echo "port $PORT is open"
done
La salida se verá así:
port 22 is open
port 80 is open
Conclusión #
Le mostramos varias herramientas que puede usar para buscar puertos abiertos. También hay otras utilidades y métodos para verificar los puertos abiertos, por ejemplo, puede usar Python socket
módulo, curl
, telnet
o wget
.
Si tiene alguna pregunta o comentario, deje un comentario a continuación.