¿Cuáles son las alternativas para verificar puertos abiertos, además de telnet?

24

Podemos usar lo siguiente para probar el puerto VIA de telnet; en el siguiente ejemplo probamos el puerto 6667:

[root@kafka03 ~]# telnet kafka02 6667
Trying 103.64.35.86...
Connected to kafka02.
Escape character is '^]'.
^CConnection closed by foreign host

Dado que en algunas máquinas no podemos usar telnet (por razones internas), ¿cuáles son las alternativas para verificar puertos, como telnet?

yael
fuente
¿Perl es una opción?
Jeff Schaller
55
Esas "razones internas" podrían impedirle usar otro software de escaneo de puertos. Conocí a un tipo que trabajaba en un banco y tenía su contrato rescindido porque tenía una copia de nmap en su PC. Lo estaba usando para fines relacionados con el trabajo, pero estaba en la lista de proscritos, por lo que fue escoltado fuera del edificio.
Roger Lipscombe
2
¿Perl es una opción? - SÍ
yael
2
Tenga en cuenta que telnet es un protocolo sofisticado. La telnetutilidad desactiva el comportamiento del protocolo si se proporciona un puerto en la línea de comando. Luego se comporta de manera similar netcat, solo con la detección de final de línea.
rexkogitans
Una pregunta más independiente del sistema operativo, que ni siquiera insinúa el escaneo de puertos, es unix.stackexchange.com/questions/499694 .
JdeBP

Respuestas:

23

Si usa Bash Shell, puede usar su función para verificar si un puerto está abierto o cerrado:

(timeout 1 bash -c '</dev/tcp/127.0.0.1/17500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT OPEN

(timeout 1 bash -c '</dev/tcp/127.0.0.1/7500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT CLOSED

Tenga en cuenta que si el servidor no responde después de 1 segundo, se alcanza el tiempo de espera, los comandos se 'interrumpen y, por lo tanto, no se imprime nada.

in2nix4life
fuente
55
Quizás debería usar el nombre de host de la pregunta (kafka02) en lugar de 127.0.0.1, lo que hace que parezca que solo funciona con el bucle invertido.
Dmitry Grigoryev
1
(timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/nullNo imprime nada para mí. (timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/nullfuncionó como se esperaba (impresiones CERRADO PUERTO). Tenga en cuenta la ubicación de la '.
thecarpy
lo que obtienes en bash -c '</ dev / tcp / kafka01 / 6667'
yael
entonces echo $? (si 0, entonces el puerto está abierto)
yael
IIRC, esta característica de bash solía estar deshabilitada en Debian hace algún tiempo. Es un buen truco, pero no siempre funciona.
AnonymousLurker
32

netcat es una opción.

nc -zv kafka02 6667
  • -z = establece nc para simplemente escanear en busca de demonios, sin enviarles ningún dato
  • -v = habilita el modo detallado
Steve
fuente
¿Es posible obtener una salida estándar del nc? porque quiero escribir en mi script de bash
yael
2
¡Lee la documentación! Sin opciones se nccomporta mucho como telnet.
Henrik - deja de lastimar a Monica el
sí, leí los documentos, pero la bandera -w no funciona como tiempo de espera
yael
ejemplo - c -v -w 1 kafka01 6667 (no tenemos tiempo de espera)
yael
nc -v -w 3 kafka01 6667 Ncat: Versión 6.40 ( nmap.org/ncat ) Ncat: Conectado a 10.164.235.85:6667. (esto todavía cuelga)
yael
23

El estándar de oro es, sin duda, nmap( nmap.org ), pero generalmente requiere root para "mejores resultados". Sin embargo, hay binarios independientes disponibles y es posible ejecutarlo como un usuario sin privilegios, solo con capacidades degradadas. Por ejemplo, en lugar de una synexploración oculta ( -sS), recurre a una exploración de conexión TCP estándar (-sT ). Esto es funcionalmente equivalente a netcat, pero con las buenas capacidades aceleradas de múltiples hosts que tiene.

Un ejemplo:

not-root$ nmap -sT google.com
Starting Nmap 7.70 ( https://nmap.org ) at 2018-11-04 21:01 GMT
Nmap scan report for google.com (172.217.23.14)
Host is up (0.12s latency).
rDNS record for 172.217.23.14: lhr35s01-in-f14.1e100.net
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https
Landak
fuente
1
En la mayoría de las organizaciones, nmap se considera una herramienta de escaneo y no se puede usar nmap sin la autorización adecuada. Además, si se trata de una instancia EC2, también se requiere autorización de AWS.
al mamun
4

Si Perl es una opción, puede usar su IO::Socketmódulo para probar una conexión a un host y puerto en particular; la secuencia de comandos a continuación codifica TCP como protocolo (que es lo que usaría telnet):

#!/usr/bin/perl -w

# tries to connect to the given IP and port (tcp)

use strict;
use IO::Socket;

my $desthost = shift or die "Usage: $0 host port\n";
my $destport = shift or die "Usage: $0 host port\n";

gethostbyname($desthost) || die "Invalid host given\n";

my $handle = IO::Socket::INET->new(
        PeerAddr => $desthost,
        PeerPort => $destport,
        Proto    => 'tcp')
    or die "can't connect to $desthost:$destport: $!\n";
close $handle;
print "Success!\n"

Salida de muestra desde un puerto cerrado:

$ ./above-script kafka02 6667
can't connect to kafka02:6667: Connection refused

Salida de muestra de un puerto abierto:

$ ./above-script kafka02 4200
Success!
Jeff Schaller
fuente
2

Se puede usar el archivo de dispositivo / dev / tcp y / dev / udp en lugar de telnet. Ejemplo: echo 0> /dev/tcp/103.64.35.86/6667. Luego verifique el estado de salida usando #echo $? . Si el estado de salida es 0, el puerto está abierto. Si el estado de salida no es cero, el puerto está cerrado. Para verificar los paquetes udp, use echo 0> /dev/udp/103.64.35.86/6667.

al mamun
fuente
en mi redhat 7 bajo / dev /, no tenemos tcp
yael
ls / dev / tcp / ls: no se puede acceder / dev / tcp /: No existe tal archivo o directorio
yael
en qué sistema operativo lo prueba?
yael
@yael, no obtendrás / dev / tcp o / dev / udp mientras ls. pruebe exactamente el mismo comando en su shell y obtendrá el resultado. por cierto, lo uso con frecuencia en RHEL6,7
al mamun
0
ss -lt 

Este es otro comando que puedes usar.

Dileep Jayasundara
fuente
Funciona solo para máquinas locales, creo que la pregunta es sobre verificar los puertos abiertos de un host remoto.
Alex Baranowski el