En los viejos tiempos, solíamos telnet
ver si un puerto en un host remoto estaba abierto: telnet hostname port
intentaría conectarse a cualquier puerto en cualquier host y le daría acceso a la transmisión TCP sin procesar.
En estos días, los sistemas en los que trabajo no tienen telnet instalado (por razones de seguridad), y todas las conexiones salientes a todos los hosts están bloqueadas de forma predeterminada. Con el tiempo, es fácil perder la noción de qué puertos están abiertos para qué hosts.
¿Hay otra forma de probar si un puerto en un sistema remoto está abierto, usando un sistema Linux con un número limitado de paquetes instalados y telnet
no está disponible?
linux
networking
port
Steve HHH
fuente
fuente
brew install telnet
. Así que espero que los usuarios de Linux puedan hacer lo mismo conyum
yapt-get
.Respuestas:
Bash ha podido acceder a los puertos TCP y UDP por un tiempo. Desde la página del manual:
Entonces podrías usar algo como esto:
Taa Daa!
fuente
cat < /dev/tcp/localhost/22
, deberías obtener tu encabezado sshd. Evidentemente, su proceso en el puerto 18080 espera que entre algo antes de enviar algo. El puerto 22 ( ssh ) te saluda con su versión y demás. ¡Pruébalo!Agradable y detallado! De las páginas del manual.
Puerto único:
Múltiples puertos:
Rango de puertos:
fuente
nc -zv 127.0.0.1 22,80,8080,20-30,443-446
(nc Versión: 1.107-4).Netcat es una herramienta útil:
nc 127.0.0.1 123 &> /dev/null; echo $?
Saldrá
0
si el puerto 123 está abierto y1
si está cerrado.fuente
telnet
también ocultarannc
(aunque, curiosamente, nocurl
owget
).FOR
comiencen las declaraciones!-G 2
sería más apropiado para el tiempo de espera de TCPEl método más simple, sin utilizar otra herramienta, como
socat
, es como se describe en la respuesta de @ lornix anterior. Esto es solo para agregar un ejemplo real de cómo se haría uso del dispositivo psuedo/dev/tcp/...
dentro de Bash si quisiera, por ejemplo, probar si otro servidor tenía un puerto determinado accesible a través de la línea de comando.Ejemplos
Digamos que tengo un host en mi red llamado
skinner
.La razón por la que desea envolver el
echo > /dev/...
paréntesis de esta manera(echo > /dev/...)
es porque si no lo hace, con las pruebas de conexiones inactivas, aparecerá este tipo de mensajes.Estos no pueden simplemente ser redirigidos
/dev/null
ya que provienen del intento de escribir datos en el dispositivo/dev/tcp
. Entonces capturamos toda esa salida dentro de un subcomando, es decir,(...cmds...)
y redirigimos la salida del subcomando.fuente
Descubrí que
curl
puede hacer el trabajo de una manera similartelnet
ecurl
incluso le dirá qué protocolo espera el oyente.Construya un URI HTTP a partir del nombre de host y el puerto como primer argumento para
curl
. Sicurl
puede conectarse, informará una falta de coincidencia de protocolo y saldrá (si el oyente no es un servicio web). Sicurl
no puede conectarse, se agotará el tiempo de espera.Por ejemplo, el puerto 5672 en el host 10.0.0.99 está cerrado o bloqueado por un firewall:
Sin embargo, desde un sistema diferente, se puede acceder al puerto 5672 en el host 10.0.0.99, y parece estar ejecutando un escucha AMQP.
Es importante distinguir entre los diferentes mensajes: el primer error fue porque
curl
no se pudo conectar al puerto. La segunda falla es una prueba de éxito, aunque securl
esperaba un escucha HTTP en lugar de un escucha AMQP.fuente
wget -qS -O- http://ip.add.re.ss:port
efectivamente debería hacer lo mismo.curl myhost:22
.Espero que resuelva tu problema :)
fuente
Aquí hay una frase:
usando la sintaxis de Bash explicada en @lornix answer .
Para obtener más información, consulte: Guía avanzada de secuencias de comandos Bash: Capítulo 29.
/dev
y/proc
.fuente
Estuve luchando durante todo un día porque ninguna de estas respuestas parecía funcionar para mí. El problema es que la versión más reciente de
nc
ya no tiene la-z
bandera, mientras que el acceso directo a través de TCP (según @lornix y @slm) falla cuando no se puede acceder al host. Finalmente encontré esta página , donde finalmente encontré no uno sino dos ejemplos de trabajo:nc -w1 127.0.0.1 22 </dev/null
(la
-w
bandera se encarga del tiempo de espera y la</dev/null
reemplaza-z
)timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'
(el
timeout
comando se encarga del tiempo de espera y el resto es de @slm)Luego, simplemente use
&&
y / o||
(o incluso$?
) para extraer el resultado. Con suerte, alguien encontrará útil esta información.fuente
Combinando las respuestas de @kenorb y @Azukikuru, podría probar el puerto abierto / cerrado / cortafuegos.
Otro enfoque con rizo para llegar a cualquier puerto
fuente
Aquí hay una función que elegirá uno de los métodos dependiendo de lo que esté instalado en su sistema:
fuente
No debería estar disponible en su caja, pero intente con
nmap
.fuente
nmap
es una buena herramienta, pero no está disponible en estos sistemas. En lugar de descargarlonmap
, compilarlo, instalarlo en mi directorio de inicio y luego copiarlo en todos los demás sistemas, esperaba encontrar una manera utilizando las herramientas existentes disponibles en la mayoría de las instalaciones de Linux.como referencia, ampliando la respuesta de @peperunas:
La forma de usar nmap para probar es:
(el ejemplo anterior usa localhost para fines de demostración)
fuente
Si tiene que probar más que en el sistema, puede usar nuestra herramienta de prueba dda-serverpec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) para tales tareas. Puedes definir tus expectativas
y pruebe estas expectativas ya sea contra localhost o contra hosts remotos (conectarse mediante ssh). Para las pruebas remotas, debe definir un objetivo:
Puede ejecutar la prueba con
java -jar dda-serverspec.jar --targets targets.edn serverspec.edn
Debajo del capó estamos usando netcat como se propuso arriba ...
fuente