Descubre si un puerto está abierto o cerrado en Linux

Descubre si un puerto está abierto o cerrado en Linux

Sergio De Luz

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.

¿Es seguro NetCat?

Cuando usamos una herramienta tan versátil y que puede desempeñar multitud de tareas, siempre podemos pensar si se puede usar con fines poco adecuados. Y la respuesta es que sí, también se puede usar como una herramienta de hackeo que puede espiar, detectar agujeros de seguridad, esquivar cortafuegos y dar uso de puertas traseras que pueden hacer que se apoderen de nuestro equipo.

Siempre será recomendable descargar NetCat de una fuente segura en internet. A mayores, los expertos recomiendan realizar todos los análisis posibles, para ver si es necesario instalar NetCat en los sistemas. Tener ciertos conocimientos sobre las ventajas de esta herramienta, puede beneficiarnos en cuanto a la versatilidad y eficacia que nos brinda, y nos ayudará a determinar las amenazas con más precisión para adoptar las medidas necesarias.

Motivos para abrir puertos

Existen muchos motivos diferentes por los cuales un puerto necesita ser abierto. Pero por lo general, esto es algo que se realiza solo cuando es necesario y de forma automática. Normalmente durante la instalación de software, se realiza esta tarea. Pero pueden darse casos en los cuales esto no ocurre, siendo un error como tal. O que simplemente la aplicación así lo requiera. En cualquiera de los dos, es posible que esta no funcione de forma correcta hasta que esté abierto el puerto.

Esto ocurrirá porque cuando no se configura de forma adecuada, el equipo no sabrá cuál es el puerto que necesita para abrir los datos, ni a que aplicación de los debería de entregar. Entonces aparecerán problemas de conexión, pero no tiene por qué bloquearla por completo. Más bien se pueden producir retrasos, conexión lenta, o que tengamos mucho lag durante el proceso de uso de la aplicación.

En este caso, tendremos que acudir a la configuración de nuestro router y proceder con la apertura manual. Para ello tendremos que crear una regla en la configuración, la cual indica al router que queremos ese puerto abierto. En ese momento, se abrirá y todo funcionará de la forma adecuada. Pero de hacer esto, debemos tener mucho cuidado. Si en algún momento dejamos de utilizar la aplicación que requiere ese puerto, tendremos que acudir al router de nuevo para cerrarlo. Esto puede ser un problema grave en algún momento, ya que estaremos dejando la puerta abierta a posible atacantes. Entonces, siempre y cuando sea algo que las aplicaciones y el equipo realiza de forma automática, podemos despreocuparnos. Pero cuando lo hacemos de forma manual, no solo tendremos que acudir para abrir el puerto. Si no también para cerrarlo. Y recalcamos de nuevo la tremenda importancia que tiene este proceso.

Ver puertos abiertos con Nmap

Se trata de un programa de código abierto, el cual se usa para auditorías de seguridad. Su diseño está pensado para grandes redes, pero funciona realmente bien en hosts individuales. Este utiliza paquetes IP sin procesar para determinar qué hosts están disponibles, los servicios y sistemas operativos se están ejecutando junto con su versión, los filtros de los cortafuegos que se utilizan y muchas otras características.

Si bien su uso es más común para auditorías, los administradores de sistemas y redes, lo utilizan para realizar tareas rutinarias como puede ser inventariado, monitorización en tiempo real de la actividad del host o servidor y la administración de programas de actualización.

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.

Otro comando muy útil para estos fines, puede ser lsoft, el cual realiza una función similar a los que citamos, pero a mayores, es capaz de enlazar puertos abiertos a servicios y mostrar una lista de archivos que se encuentran abiertos en el sistema con los procesos correspondientes.

Podemos usar el comando con un simple lsoft -i

Comantdo lsof

Y otro método si queremos verificar el estado de algún puerto en concreto podemos usar el siguiente.

lsof para escanear un puerto

Peligros de los puertos abiertos

Cuando nos referimos a estos puertos en la conexión a internet, los podemos definir como unas puertas las cuales facilitan o permiten la comunicación que se recibe y envía desde nuestros equipos. Pero más técnicamente, es un número de 16 bits, el cual es empleado por un protocolo host a host, el cual identifica a qué protocolo de nivel superior o programa de aplicación debe realizar las entregas de los mensajes recibidos.

Como hemos comentado, esto son como puertas o ventanas que podemos tener en nuestras casas, y al igual que no dejaríamos estas abiertas, ocurre lo mismo con los puertos del ordenador. Pero puede darse el caso de que sea necesario abrir alguno, o que directamente quede abierto para el correcto funcionamiento de alguna aplicación o comunicación concreta. Esto a su vez, nos está generando nuevas vulnerabilidades, las cuales pueden variar en importancia, y los hackers se pueden aprovechar de ellas. Por lo cual es especialmente recomendable disponer de un buen sistema de seguridad, para tratar de evitar todos los problemas posibles.

Existen algunos puertos, que son más peligrosos que otros, debido a la funcionalidad que pueden ofrecer. Puede ser el caso del 3389, el cual se usa para Remote Desktop. Esto puede ser una gran amenaza para nuestro sistema o grupo de ellos, ya que permite la conexión por escritorio remoto a los equipos, por lo cual es recomendable tenerlo siempre cerrado a no ser que sea necesario para realizar alguna función.

Otros puertos que son considerados peligrosos cuando están abiertos son:

  • TCP: 3301, 3306, 8080, 53, 9002, 5986, 8443
  • FTP: Los puertos 20 y 21 se catalogan como peligrosos cuando se detecta un gran número de impresoras, cámaras y otros dispositivos vulnerables.

Por lo cual, es recomendable mantener todos los puertos que no sean necesarios cerrados para la mayor seguridad de nuestros sistemas. Y si es necesario abrir uno o varios, es conveniente revisar que los sistemas de seguridad estén al día, y los dispositivos totalmente actualizados.

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!