Pregunta ¿Es posible hacer ping a una dirección: puerto?


No me gustan las redes, y tengo la siguiente pregunta relacionada con Linux silbido mando.

¿Solo puedo hacer ping a una dirección? Por ejemplo:

miner@raspberrypi ~ $ ping onofri.org
PING onofri.org (67.222.36.105) 56(84) bytes of data.
64 bytes from onofri.org (67.222.36.105): icmp_req=1 ttl=47 time=202 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=2 ttl=47 time=206 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=3 ttl=47 time=215 ms

O también puedo hacer ping dirección: puerto, por ejemplo: onofri.org:80?

Si pruebo esto, no funciona:

miner@raspberrypi ~ $ ping onofri.org:80
ping: unknown host onofri.org:80

¿Es posible hacer ping a algo así como dirección: puerto? Si es posible, ¿por qué no funciona lo que probé?


193


origen


¿Qué está tratando de lograr? Verificar la operación correcta del servicio requiere que realmente consultes el servicio y evalúes la respuesta. Un servidor web, por ejemplo, podría aceptar su conexión, pero devolver un error debido a una configuración incorrecta. - Daniel B
Eso es parte de lo que me gusta de Telnet. puedes conectarte a un servidor web y escribir GET /index.html HTTP\1.1 y vea la respuesta 200 (o código de error) junto con el marcado resultante. - Frank Thomas
@FrankThomas HTTP\1.1? De Verdad? - glglgl
@Navin Maybe HTTP/1.1... - glglgl
@glglgl; ¿Qué? ¿Nunca pones un truco donde debería ir una barra oblicua? pero tienes razón, debería ser una barra. - Frank Thomas


Respuestas:


Puedes usar Paping, una prueba de puerto TCP multiplataforma, emulando la funcionalidad de ping (puerto ping)

(ver también Github como code.google.com se ha depreciado)

paping -p 80 google.com

18



Alguna explicación de lo que hace este programa sería útil. - David Schwartz
para cualquiera que encuentre esta respuesta, como yo lo hice, solo para encontrar que la papada no está en ningún repositorio y es un código antiguo que ni siquiera compilará en ARM - desplácese hacia abajo más allá de la respuesta 'hping'. Es un complemento perfecto para hacer ping cuando necesita probar un puerto y es fácilmente accesible en varios repositorios (es decir, Ubuntu, Arch) incluido ARM. - Mark


Los puertos son un concepto de UDP y TCP. Los mensajes de ping se conocen técnicamente como Solicitud de eco ICMP y ICMP Echo Reply que son parte de ICMP. ICMP, TCP y UDP son "hermanos"; no se basan entre sí, sino que son tres protocolos separados que se ejecutan sobre IP.

Por lo tanto, no puedes ping un puerto. Lo que tu poder hacer, es usar un escáner de puerto como nmap.

nmap -p 80 onofri.org

También puedes usar telnet onofri.org 80, como se sugiere en una de las otras respuestas (dará un error si el puerto está cerrado o filtrado).


297



+1 lo entiendes bien ICMP está construido sobre IP, que tiene un concepto de direcciones IP pero no puertos. TCP y UDP también están en la parte superior de IP, y son esos protocolos los que agregan "puertos". ICMP, TCP y UDP están todos en el mismo "nivel" en términos del protocolo por el que son llevados. - Jason C
+1. Mucha, mucha gente piensa que si no pueden hacer ping a algo que no pueden conectarse ... pero como dices, ICMP es diferente a TCP y UDP: si piensas publicar, por ejemplo, una página web en TCP 80, de lo que solo necesita abrir el TCP 80 en el firewall, nada más (por lo que se puede bloquear Ping a la misma IP (... debería!), por ejemplo) - Olivier Dulac
Solo para mantener la información precisa, ICMP no es un protocolo de capa de transporte como TCP o UDP. Al igual que una serie de protocolos, no encaja del todo en los modelos conceptuales de red, pero generalmente se considera un protocolo de capa de red / internetwork como lo es IP. También se ha denominado a veces protocolo L3.5. - YLearn
@BenjiWiebe, estuvo de acuerdo, pero una vez más, para la precisión de la declaración debe hacerse y por eso lo agregué. Todo lo que se dice hasta ahora es que ICMP, TCP y UDP están relacionados. El comentario más votado incluso llega a decir que todos están en el mismo "nivel". Si bien esto no hace ninguna diferencia para el usuario promedio, hay muchos usuarios no promedio que visitan este sitio. - YLearn
@OlivierDulac No sé si debería bloquearlo La mayoría de los servidores web que conozco lo dejan abierto. ICMP hace que internet funcione. ¿Por qué querrías que las personas pensaran que no pueden contactarlo si pueden? - Cruncher


yo suelo Telnet, ya que está integrado en muchas plataformas sin descargas adicionales.

Simplemente use el comando telnet para conectarse al puerto que desea probar. Si recibe el mensaje a continuación, o un mensaje del servicio en sí, entonces el puerto está activo.

Minty16 ~ $ telnet localhost 139
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Si conoce la secuencia de comandos para el servicio al que se está conectando, puede escribir un comando (HTTP / FTP GET por ejemplo) y observar la respuesta y la salida en la terminal. Esto es muy útil para probar el servicio en sí, ya que le mostrará la información de error enviada al cliente, como los errores HTTP 500.

Si recibe un mensaje de que se rechazó la conexión, el puerto se cierra.

Minty16 ~ $ telnet localhost 5000
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

77



Además, si la pantalla se vuelve completamente negra, es señal de que estás conectado también. - Tensigh
Excelente sugerencia. Solía ​​usar esto para probar si un servidor web estaba activo cuando un navegador web no era una opción fácil. - Brandon
@Brandon gusta cuando sshing en máquinas de desarrollo ^. ^ - Cruncher
Las herramientas de desarrollador en los navegadores son mucho más fáciles, porque aún enviarán todos los encabezados de solicitud HTTP adecuados, pero puede inspeccionar la respuesta HTTP completa. Por otra parte, si desea adaptar la solicitud también, telnet es el camino a seguir. - Lightness Races in Orbit
Creo que todas las respuestas aquí omiten la información más crucial. Técnicamente, ¿no sería posible "hacer ping" a un puerto de la siguiente manera? Puede establecer una conexión TCP / UDP y contar cuántos milisegundos tomó establecer esa conexión. - David


Sí, use HPing Para hacer eso:

$ sudo hping -S -p 80 google.com
HPING google.com (p5p1 77.237.27.37): S set, 40 headers + 0 data bytes
len=46 ip=77.237.27.37 ttl=58 id=25706 sport=80 flags=SA seq=0 win=29200 rtt=7.5 ms
len=46 ip=77.237.27.37 ttl=58 id=25707 sport=80 flags=SA seq=1 win=29200 rtt=7.4 ms
len=46 ip=77.237.27.37 ttl=58 id=25708 sport=80 flags=SA seq=2 win=29200 rtt=8.5 ms
len=46 ip=77.237.27.37 ttl=58 id=25709 sport=80 flags=SA seq=3 win=29200 rtt=7.8 ms
^C
--- google.com hping statistic ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 7.4/7.8/8.5 ms

Tenga en cuenta que necesita privilegios de root (o capacidades de SELinux) para crear paquetes de IP sin procesar, al igual que ping (que probablemente sea suid en su sistema).


40



Desearía que esta fuera la "respuesta aceptada". hping se podía encontrar fácilmente en varios repositorios, a diferencia de paping, que es un código antiguo y complejo que no se compila en ARM. Además, a diferencia de NMAP, haping devuelve un código de estado que es fácilmente detectable a partir de un script de shell, por lo que es un sustituto perfecto de lo que de otro modo utilizaría ping. Gracias por esta respuesta, es una pena que no me haya desplazado lo suficiente para verla y haya tenido que encontrarla en otro sitio web. - Mark


Puede usar netcat para conectarse a un puerto específico para ver si obtiene una conexión. La bandera -v aumentará la verbosidad para mostrar si el puerto está abierto o cerrado. La bandera -z hará que netcat se cierre una vez que tenga una conexión. ¿Entonces puede usar los códigos de salida a través de $? para ver si la conexión fue establecida o no.

$ nc -zv localhost 22
localhost [127.0.0.1] 22 (ssh) open
$ echo $?
0
$ nc -zv localhost 23
localhost [127.0.0.1] 23 (telnet) : Connection refused
$ echo $?
1

Además, puede usar mtr con el indicador -T para tcp y el indicador -P para especificar un puerto. Esto hará algo similar a un traceroute sobre TCP en lugar de solo ICMP. Sin embargo, esto puede ser excesivo.

suspiro  Tengo que editar para agregar este bit, ya que no podemos poner el código en los comentarios. Knoppix puede estar haciendo algo diferente con su versión de netcat, pero esto es lo que obtengo de Linux Mint

$ date;nc -z -w 1 www.google.com 8000;date
Fri Jun 20 15:55:26 PDT 2014
Fri Jun 20 15:55:27 PDT 2014
$ date;nc -z -w 4 www.google.com 8000;date
Fri Jun 20 15:55:33 PDT 2014
Fri Jun 20 15:55:37 PDT 2014

$ nc -h
[v1.10-40]

39



problema es si intentas nc -z www.google.com 8000  puede llevar mucho tiempo, 5 segundos más. Si lo hago -w 1 luego toma 5 segundos. Si lo hago -w 3 luego toma como 3 veces más tiempo ... 15 destellos del cursor, 15 segundos. -w 1 está destinado a ser un segundo, pero probado en cygwin.,. 5 segundos. Es superrápido cuando hay un servidor en el puerto pero un poco lento cuando no lo hay. - barlop
no maldiciones nuevas líneas en los comentarios ... Eso parece ser un error con cygwin. La prueba con Linux Mint muestra un retraso de los segundos especificados. ejecutó esto para probar: date; nc-zw5 www.google.com 8000; date - Falsenames
También voté en contra de @BenjiWiebe con las solicitudes de nmap. nc es más fácil de poner en una secuencia de comandos, pero es MUCHO más fácil de usar nmap visualmente. - Falsenames
Probándolo en knoppix. nc -zv -w 1 www.google.com ¿Cómo hace para que solo intente una vez? Cuando lo intento sí, el -w 1 funciona, pero cada segundo lo reintenta hasta que lo haga Ctrl-C. - barlop
No estoy seguro de qué está haciendo la versión de Knoppix de 'nc -zv -w 1 www.google.com 80'. Eso funciona bien en mi sistema, preguntando una vez y bajando como se supone que debe hacerlo. Además, sin el número de puerto especificado, el mío falla diciendo que no hay un puerto especificado. - Falsenames


También podrías usar nping (parte de nmap)

$ nping -p 80 localhost

Starting Nping 0.6.00 ( http://nmap.org/nping ) at 2014-06-23 11:57 CEST
SENT (0.0015s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (0.0016s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (1.0027s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (1.0027s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (2.0038s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (2.0039s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (3.0050s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (3.0050s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (4.0061s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (4.0062s) Handshake with localhost:80 (127.0.0.1:80) completed

Max rtt: 0.032ms | Min rtt: 0.008ms | Avg rtt: 0.012ms
TCP connection attempts: 5 | Successful connections: 5 | Failed: 0 (0.00%)
Tx time: 4.00575s | Tx bytes/s: 99.86 | Tx pkts/s: 1.25
Rx time: 4.00575s | Rx bytes/s: 49.93 | Rx pkts/s: 1.25
Nping done: 1 IP address pinged in 4.01 seconds

15



nping --tcp -p 80 localhost - K-Gun


Puedes hacer esto en šhell con Python como un trazador de líneas no tan corto:

$ portping() { python <<<"import socket; socket.setdefaulttimeout(1); socket.socket().connect(('$1', $2))" 2> /dev/null && echo OPEN || echo CLOSET; }
$ portping 8.8.8.8 54
CLOSET
$ portping 8.8.8.8 53
OPEN

5



No pegues esto en el ganso tonto de Python. Pégalo en bash. - AXE-Labs
Sí, soy un idiota, comentario eliminado, gracias, funcionó perfectamente. - rob
CLOSET, loooool - srghma