Hola compañeros de la shell, en este artículo vamos a repasar la funcionalidad de los comandos nc y telnet para escanear puertos.
El programa nc (netcat) tiene muchas más opciones y utilidades que el escaneo de puertos pero, en esta entrada, nos centraremos en este tipo de pruebas de conectividad.
Pasemos directamente a los ejemplos para describir la información que nos aportará la salida de estos programas.
Para comprobar la conectividad con un puerto mediante el comando nc ejecutaremos:
nc -zv host/ip puerto
Por ejemplo:
nc -zv 92.176.x.x 22 Connection to 92.176.x.x 22 port [tcp/ssh] succeeded!
En este caso conseguimos comprobar que la máquina en cuestión tiene levantado un servicio escuchando en el puerto 22.
Veamos ahora la salida del comando cuando intentamos comprobar la conectividad de un puerto en el que no está escuchando ningún servicio:
nc -zvv 192.168.1.2 23 nc: connect to 192.168.1.2 port 23 (tcp) failed: Connection refused
También podría darse el caso de que no se nos permita llegar al puerto deseado, por ejemplo, por culpa de alguna regla de firewall. En este caso, nc tratará de conectar sin éxito contra el puerto indicado hasta alcanzar el tiempo de time-out.
Para comprobar si tenemos conectividad con un listado de puertos ejecutaremos:
nc -zv host/ip puerto1 [puerto2] [puerto n]
Por ejemplo:
nc -zv localhost 22 23 24 nc: connect to localhost port 22 (tcp) failed: Connection refused nc: connect to localhost port 23 (tcp) failed: Connection refused nc: connect to localhost port 24 (tcp) failed: Connection refused
Para comprobar si hay conectividad contra un rango de puertos ejecutaremos
nc -zv host/ip portA-port(A+x)
Por ejemplo:
nc -zv localhost 22-24 nc: connect to localhost port 22 (tcp) failed: Connection refused nc: connect to localhost port 23 (tcp) failed: Connection refused nc: connect to localhost port 24 (tcp) failed: Connection refused
Una nota aclaratoria: nc es una auténtica navaja suiza para redes. En esta entrada solamente describimos la comprobación de puertos tcp que tan útil nos ha resultado.
En caso de no disponer (y no poder instalar) nc, podríamos usar el clásico telnet para comprobar que llegamos correctamente a un puerto:
telnet MAQUINA PUERTO
Por último, en caso de que en un host con GNU/Linux no tengamos instalado ni telnet, ni nc, podríamos usar el siguiente built-in de bash (usando /dev/tcp o /dev/udp según corresponda):
exec 3<> /dev/tcp/IP/PUERTO
La ejecución de exec devolverá inmediatamente el promt y valor 0 si la comunciación con el puerto es correcta. Por ejemplo, contra una IP de google y puerto tcp 80:
exec 3<> /dev/tcp/216.58.211.227/80 echo $? 0
Sin embargo, si la comunicación contra el puerto no es correcta:
exec 3<> /dev/tcp/216.58.211.227/151515 bash: connect: Connection timed out bash: /dev/tcp/216.58.211.227/151515: Connection timed out
Otra posibilidad alternativa sería usar el comando curl tal y como detallamos a continuación:
curl -v -k HOST:PORT
Además, si necesitáramos crear un proceso que escuche en un puerto de un host para realizar pruebas de conectividad, en el siguiente enlace,
https://geekflare.com/es/create-port-listener-in-windows-or-linux/
Espero que os sirva.
Nos vemos al otro lado de la pantalla negra.
