Descubre si un puerto está abierto o cerrado en Linux

Saber si un puerto TCP o UDP está abierto o cerrado es una tarea fundamental para cualquier administrador de sistemas y redes. A menudo, es imprescindible saber si los puertos están abiertos para establecer una comunicación con el servicio que hay escuchando detrás, pero también es muy importante saber si están cerrados para evitar posibles problemas de seguridad. Hoy en RedesZone os vamos a enseñar cómo saber si un puerto está abierto o cerrado en un sistema operativo Linux, ya que normalmente en servidores se utiliza este sistema operativo.

Existen varias formas de comprobar si un determinado puerto está abierto o cerrado, especialmente en Linux, la primera de ellas es utilizando el popular programa Netcat que viene preinstalado en todas las distribuciones, a continuación, una muy buena forma de saber si un puerto está abierto es comprobándolo directamente con el programa Nmap que nos permitirá escanear todos los puertos de un determinado host. Por último, si queremos saber si tenemos nosotros un puerto abierto o cerrado, tendremos que mirarlo en el firewall y también en las conexiones actuales del sistema operativo.

Ver puertos abiertos con Netcat

Netcat es una herramienta que viene por defecto en la mayoría de las distribuciones Linux, por lo que, aparte de ser muy fácil de usar, no necesitaremos instalar ningún paquete adicional. Antes de comprobar con Netcat si el puerto está abierto, vamos a ver los dos parámetros más importantes de Netcat:

  • z es un parámetro que se encarga de que, al finalizar la comprobación, la conexión se cierre o, de lo contrario, el programa quedaría funcionando en bucle hasta que lo finalizáramos nosotros manualmente con control+C, de forma similar a cuando se realiza un ping en Linux.
  • v es el parámetro que se encarga de comprobar si el puerto está abierto o cerrado.

Para comprobar el puerto lo que debemos hacer es teclear lo siguiente en un terminal:

nc -zv {IP} {PUERTO}

Por ejemplo, para comprobar el puerto 443 en nuestro router teclearemos:

nc -zv 192.168.10.1 443

En la siguiente imagen se puede ver cómo este puerto está abierto:

Si probamos la web de RedesZone y el puerto 443, nos saldrá una información similar:

En el caso de que nos salga cerrado, nos debería poner esto:

Tal y como habéis visto, es muy sencillo comprobar si un puerto está abierto o cerrado con Netcat, una utilidad muy simple que viene preinstalada en Linux. Además de los comandos «z» y «v», también tenemos disponible otros argumentos que nos permitirá conocer más información, si ejecutamos la siguiente orden nos saldrá la ayuda:

nc -h

Tal y como podéis ver, disponemos de muchos argumentos para ampliar las funcionalidades.

Ver puertos abiertos con Nmap

Nmap es el programa por excelencia para descubrir hosts y también para comprobar si los diferentes puertos están abiertos, este programa no viene preinstalado en sistemas operativos Linux, pero podremos instalarlo directamente desde los repositorios con la siguiente orden:

sudo apt install nmap

Una vez instalado, para buscar si un puerto específico está abierto, deberemos poner la siguiente orden:

nmap -p {PUERTO} {IP}

En la siguiente imagen podéis ver cómo saldría un puerto abierto:

En el caso de que un puerto esté cerrado o esté filtrado por un firewall, nos saldrá lo siguiente:

Si queremos escanear todos los puertos de un determinado host o un rango de puertos, tendremos que indicar un rango de puertos de la siguiente forma:

nmap -p {PUERTO}-{PUERTO} {IP}

Por ejemplo:

nmap -p 1-65535 192.168.10.1

Tal y como podéis ver, comprobar los puertos abiertos con Nmap es realmente sencillo, además, podremos escanear todos los hosts de la red local doméstica o profesional, para posteriormente escanear los diferentes puertos.

Comprobar el firewall en Linux

Si queremos comprobar si nosotros tenemos un puerto abierto para aceptar conexiones, lo primero que debemos comprobar es el estado del firewall en nuestro sistema operativo Linux. Por defecto, en todos los servidores Linux la política es permisiva, es decir, se aceptan todos los paquetes por política. Nosotros podremos modificar esta política por una restrictiva, e incluso añadir nuevas tablas, cadenas y reglas para permitir o denegar el tráfico.

Si en nuestro terminal Linux ponemos lo siguiente:

iptables -L

Nos saldrán todas las cadenas y reglas de la tabla «filter» de iptables, en el caso de usar Nftables, deberás indicar la siguiente orden:

nft list ruleset

Una recomendación de seguridad muy importante, es que todos los puertos en un servidor Linux deberían estar cerrados, de esta forma, cuando levantemos un servicio escuchando en un determinado puerto, no será accesible a menos que lo permitamos en el firewall. Deberemos comprobar en detalle si un determinado puerto está o no abierto para que nuestros servicios sean accesibles desde el exterior.

Ver el estado de las conexiones TCP y UDP

Si nos interesa conocer el estado de todas las conexiones TCP, UDP, ICMP y otros protocolos en nuestro sistema operativo, una herramienta muy utilizada siempre ha sido «netstat», sin embargo, esta herramienta ha quedado en segundo lugar gracias al nuevo «ss» que nos proporcionará una gran cantidad de información de manera fácil y rápida. Esta herramienta se encarga de comprobar todos los sockets abiertos o cerrados en nuestro servidor Linux, y podremos ver las estadísticas de dichos sockets abiertos o cerrados. Si has utilizado en el pasado la herramienta netstat, estamos seguros que esta nueva herramienta «ss» te encantará.

La herramienta «ss» ya viene preinstalada en sistemas operativos Linux como parte del propio sistema, tal y como ocurre con las herramientas «ping», «traceroute» y muchas otras. Si abrimos una consola, tanto en modo usuario como en modo superusuario, deberemos ejecutar:

ss

Una vez que hayamos ejecutado esta orden, podremos ver lo siguiente:

Veremos el estado de la conexión (ESTAB), y también los paquetes recibidos y enviados, la dirección local y el puerto, así como la dirección remota y el puerto utilizado. Nos van a salir una gran cantidad de puertos en uso por los diferentes programas y servicios que tendremos instalados en el sistema operativo.

Si queremos ver el estado de todos los puertos (sockets) podremos poner la siguiente orden:

ss -a

Si queremos ver solamente los puertos que están «escuchando», deberemos poner la siguiente orden:

ss -l

En la siguiente imagen se puede ver un ejemplo de puertos que están «LISTEN» para aceptar conexiones entrantes:

En el caso de que queramos mostrar las conexiones TCP, tendremos que usar el argumento «-t» y en el caso de querer mostrar las conexiones UDP, tendremos que usar el argumento «-u».

ss -t ss -u

La orden «ss» es realmente útil para mostrar todas las conexiones establecidas y también escuchando en nuestro sistema operativo Linux.

Tal y como habéis visto, tenemos diferentes métodos para saber si un puerto está abierto o cerrado en un host remoto y también en nuestro equipo local, dependiendo de lo que nos interese saber, utilizaremos una herramienta u otra, lo más importante es que todos los puertos que no estén en uso deberían estar cerrados por seguridad a través del firewall, de esta forma, evitaremos problemas de seguridad y explotación de vulnerabilidades en los servidores.

¡Sé el primero en comentar!