Sobes.tech
Junior

¿Cómo verificar si un puerto está abierto en un host remoto o local?

sobes.tech AI

Respuesta de la IA

Para verificar si un puerto está abierto en un host remoto o local, se pueden usar los siguientes métodos:

  1. netcat (nc): Herramienta universal para trabajar con conexiones de red.

    • Host local:
      nc -zv localhost <puerto>
      
    • Host remoto:
      nc -zv <host_remoto> <puerto>
      

    Las opciones -z (modo cero-I/O) y -v (detallado) se usan para escanear sin enviar datos y para mostrar información detallada.

  2. telnet: Protocolo para control remoto, que se puede usar para verificar la conexión en el puerto especificado.

    • Host local:
      telnet localhost <puerto>
      
    • Host remoto:
      telnet <host_remoto> <puerto>
      

    Si la conexión se establece (generalmente aparece un aviso o línea en blanco), el puerto está abierto. Se puede cerrar presionando Ctrl+], luego quit y Enter.

  3. nmap: Escáner de puertos potente. Requiere instalación.

    • Host local:
      nmap -p <puerto> localhost
      
    • Host remoto:
      nmap -p <puerto> <host_remoto>
      

    La salida mostrará el estado del puerto: open, closed o filtered.

  4. < /dev/tcp o < /dev/udp (en Bash): En Bash, se pueden usar descriptores de archivos para crear conexiones TCP o UDP.

    • Host local (TCP):
      timeout 1 bash -c "cat < /dev/tcp/localhost/<puerto>" 2>/dev/null && echo "Puerto <puerto> está abierto" || echo "Puerto <puerto> está cerrado"
      
    • Host remoto (TCP):
      timeout 1 bash -c "cat < /dev/tcp/<host_remoto>/<puerto>" 2>/dev/null && echo "Puerto <puerto> está abierto" || echo "Puerto <puerto> está cerrado"
      

    timeout se usa para evitar bloqueos si el puerto está cerrado. 2>/dev/null oculta errores. Este método no funciona para UDP.

  5. Python: Uso de sockets para verificar.

    import socket
    
    def check_port(host, port):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(1)  # Establecer tiempo de espera
        try:
            s.connect((host, port))
            print(f"El puerto {port} en {host} está abierto")
        except (socket.timeout, ConnectionRefusedError):
            print(f"El puerto {port} en {host} está cerrado o filtrado")
        finally:
            s.close()
    
    # Ejemplo de uso
    check_port("localhost", 80)       # Verificación en host local
    check_port("google.com", 443)  # Verificación en host remoto
    

La elección del método depende de las herramientas disponibles, el sistema operativo y la naturaleza de la tarea. netcat y nmap son algunas de las herramientas más flexibles e informativas.