Verifique si el host / puerto remoto está abierto - No se puede usar GNU Netcat ni NMap - RHEL 7

17

En el trabajo, el equipo de infraestructura está implementando nuevas máquinas virtuales con RHEL7 instalado como sistema operativo base. Esta imagen en particular viene con la nmap-ncatversión de Netcat y no tiene instalado NMap. No podemos instalar nada en las máquinas.

Anteriormente, estábamos usando GNU Netcat, que tiene la -zopción de escanear un host / puerto remoto para verificar si estaba abierto. Algo como esto:

nc -z -v -w 3 remote.host.name 1234

¿Cómo puedo lograr la misma verificación con el nuevo ncatque no tiene la -zopción en un sistema donde no puedo instalar nmap?

λ Jonas Gorauskas
fuente
1
¿Por qué está verificando si un puerto está abierto / cerrado? ¿Es esto parte de una solución de monitoreo?
ewwhite
1
Estamos trabajando para -zingresar a Ncat, pero no estará en Red Hat por un tiempo, estoy seguro: github.com/nmap/nmap/pull/444
bonsaiviking
@ewwhite Tengo que verificar si las ACL de la red están abiertas entre el punto A y el punto B. Por ejemplo: ¿puede el servidor de aplicaciones comunicar TCP al servidor DB en el puerto 1521?
λ Jonas Gorauskas

Respuestas:

16

Bash le permite conectarse a puertos TCP y / o UDP redirigiendo a archivos especiales:

/dev/tcp/host/port Si el host es un nombre de host o una dirección de Internet válidos, y el puerto es un número de puerto entero o un nombre de servicio, Bash intenta abrir el socket TCP correspondiente.

/dev/udp/host/port Si el host es un nombre de host o una dirección de Internet válidos, y el puerto es un número de puerto entero o un nombre de servicio, Bash intenta abrir el socket UDP correspondiente.

Si no se abre o crea un archivo, la redirección falla.

Entonces, para probar si puede conectarse al puerto 80 en www.example.com, lo siguiente debería funcionar:

echo -n > /dev/tcp/www.example.com/80

Si el puerto está bloqueado, recibirá un mensaje de "conexión rechazada" o un tiempo de espera.

HBruijn
fuente
1
También puede telnet al puerto
Ryan Babchishin
Sí, pero una instalación mínima en RHEL 7 no incluye el RPM telnet donde bash siempre está presente.
HBruijn
2
De Verdad? Cómo han cambiado las cosas.
Ryan Babchishin
1
@RyanBabchishin más muchas pautas de seguridad requieren la eliminación del cliente telnet sobre la base de que usarlo para iniciar sesión en otra cosa es inseguro; ignorando sus vastos usos de solución de problemas.
Jason Martin
@JasonMartin Pfft
Ryan Babchishin
9

Aunque Ncat aún no es compatible -z, puede obtener el mismo comportamiento con la redirección de shell:

$ ncat google.com 80 </dev/null >/dev/null && echo "yes"
yes
$ ncat google.com 81 </dev/null >/dev/null && echo "yes"
Ncat: Connection timed out.
$ ncat scanme.nmap.org 1234 </dev/null >/dev/null && echo "yes"
Ncat: Connection refused.

El tiempo de espera de conexión se puede ajustar con la -wopción.

EDITAR: Ncat 7.25BETA2 introdujo la -zopción que funciona como lo hace con GNU netcat, pero solo en puertos únicos. Si necesita escanear rangos de puertos, debe usar Nmap.

bonsaiviking
fuente
2

Ni netcat, telnet ni nmap son necesarios. Bash es más simple, portátil y más eficiente.

Cheque abierto

(>/dev/tcp/example.com/80) &>/dev/null && echo "Open" 

Cheque Abierto / Cerrado

(>/dev/tcp/example.com/80) &>/dev/null && echo "Open" || echo "Closed"

Comprobación del rango de puertos

for i in $(seq 80 88); do (>/dev/tcp/example.com/80/$i) &>/dev/null && echo $i Open|| echo $i Closed; done
AGS
fuente