Saltar al contenido principal

Comprobación de conectividad con máquina y puerto específico

Documento escrito por: Fernando Lucendo García

Puedes ver todos los documentos de este autor aquí.

conectividad

Introducción

En el siguiente artículo se propone un problema y solución para un caso determinado que puede ocurrir en los entornos de trabajo o máquinas con las que se están experimentando. El caso es el siguiente:

Escenario

Imagina que estás en una máquina cuyo sistema operativo es Kali Linux e intentas comprobar la conectividad de esta máquina con otras máquinas remotas a partir de un puerto específico. Para mayor problemática, no se disponen de los paquetes más usados para este tipo de acciones, el comando más rápido que se nos viene a la mente es nc <dirección_ip_publica_máquina_remota> <puerto_máquina_remota>, otra opción que se podría usar es telnet <dirección_ip_publica_máquina_remota> <puerto_máquina_remota> pero como se indica, estos paquetes han sido desinstalados del sistema y por motivos de seguridad no pueden ser instalados de nuevo. Si quisieras resolver este problema, ¿cómo lo harias?

Pongamonos en situación, tu máquina Kali Linux es una máquina cuya dirección IP pública es la 185.61.150.20 y estás intentando comprobar la conectividad con una o varias máquinas remotas específicas a través de un puerto específico, por ejemplo, quieres comprobar que conectas con la máquina con dirección IP pública 182.55.190.60 a través del puerto 80, pero no puedes usar los comandos nc ni telnet.

Solución

Para este problema específico se ha visto que utilizando este comando propio de cualquier sistema Linux se podría comprobar la conectividad a una máquina remota y un puerto específico.

timeout 1 bash -c "echo > /dev/tcp/<dirección_ip_publica_máquina_remota>/<puerto_máquina_remota>" 2> /dev/null && echo "Puerto ABIERTO en máquina indicada"

Explicación comando

Este comando lo que hace en primer lugar es:

  • timeout 1 especifica un tiempo límite en segundos para ejecutar el comando que le continua.
  • bash -c inicia una instancia en Bash para ejecutar el comando que continua en las comillas dobles.
  • "echo > /dev/tcp/<dirección_ip_publica_máquina_remota>/<puerto_máquina_remota>" esta parte utiliza una función de redirección de Bash para crear una conexión TCP a la dirección IP pública y puerto especificados, y lo que hace el comando echo es tener una salida que se pueda redirigir hacia el archivo /dev/tcp.
  • 2> /dev/null redirige una salida de error estándar hacia null, lo cuál hace que se descarte y no se muestre.
  • && echo "Puerto ABIERTO en máquina indicada" finalmente si el comando timeout y bash se ejecutan con éxito se mostrará el mensaje por pantalla "Puerto ABIERTO en máquina indicada", que como se puede deducir, esta salida puede personalizarse y hacerse más elaborada aún. Con esto también podemos concluir que si este comando se ejecuta y no encuentra conectividad con la máquina y puerto especificados NO mostrará nada por pantalla.

prueba

Ampliación

Si vamos un poco más allá y decidimos exprimir aún más el comando anterior podríamos realizar un script que nos compruebe la conectividad con las máquinas remotas que sean necesarias y por los puertos que sean necesarios, y que la salida de este script quede guardada en un fichero para su posterior revisión.

Script comprobar conectividad con máquina y puerto específicos

Este script en bash tiene como objetivo comprobar la conectividad a varios puertos en diferentes máquinas de destino y registrar el resultado en un archivo llamado "accesos_mv.txt".


#!/bin/bash

# Definir las máquinas de destino y puertos
DESTINOS=("142.250.200.142" "192.168.1.2" "192.168.1.3" "192.168.1.4" "192.168.1.5")
PUERTOS=(80 443 8080 22 3306)

# Ejecutar el comando en cada máquina de destino y puerto, almacenando el resultado en el archivo "accesos_mv.txt"
for destino in "${DESTINOS[@]}"; do
for puerto in "${PUERTOS[@]}"; do
for intento in {1..5}; do
timeout 1 bash -c "echo > /dev/tcp/$destino/$puerto" 2> /dev/null && echo "PUERTO: $puerto MÁQUINA: $destino ESTADO: ABIERTO, en el intento $intento" >> accesos_mv.txt || echo "PUERTO: $puerto MÁQUINA: $destino ESTADO: CERRADO, en el intento $intento" >> accesos_mv.txt
done
done
done

A continuación, te explico lo que hace el script paso a paso:

  1. Se definen dos arrays: DESTINOS y PUERTOS.

    • DESTINOS: Contiene las direcciones IP de las máquinas de destino que se van a probar.
    • PUERTOS: Contiene los números de puerto que se van a comprobar en cada máquina de destino.
  2. Se utiliza un bucle for anidado para iterar sobre cada máquina de destino (DESTINOS) y cada puerto (PUERTOS).

    Para cada combinación de máquina de destino y puerto, se ejecuta el bloque de código.

  3. Dentro del bucle anidado, se utiliza otro bucle for para realizar 5 intentos de conexión a cada máquina y puerto.

    • Para cada intento, se ejecuta el comando timeout junto con bash -c para abrir una conexión al puerto especificado en la máquina de destino.
    • Si la conexión tiene éxito (el puerto está abierto), se registra un mensaje indicando que el puerto está abierto en el archivo "accesos_mv.txt".
    • Si la conexión falla (el puerto está cerrado), se registra un mensaje indicando que el puerto está cerrado en el archivo "accesos_mv.txt".
  4. El resultado de cada intento se agrega al archivo "accesos_mv.txt" junto con información adicional, como el número de puerto, la dirección IP de la máquina y el estado (abierto o cerrado).

En resumen, este script ejecuta una serie de intentos de conexión a diferentes puertos en varias máquinas de destino y guarda el resultado en un archivo de texto. Proporciona información sobre el estado de cada puerto en cada intento para cada combinación de máquina de destino y puerto.

Conclusión

Como has podido comprobar, en ocasiones no es necesario utilizar herramientas o paquetes adicionales en un sistema Linux para realizar ciertas acciones, el propio sistema operativo es muy potente y capaz de realizar todo tipo de tareas, y aún más si nos ayudamos de los famosos Scripts podremos automatizar y agilizar mucho más el trabajo en cuestión.