Hacer ping a un puerto específico


671

Solo un rápido chequeo de cordura aquí.

¿Puede hacer ping a un puerto específico de una máquina y, de ser así, puede proporcionar un ejemplo?

Busco algo así ping ip address portNum.


1
Para Windows, esta pregunta se puede verificar
npocmaka

Respuestas:


720

No puede hacer ping a los puertos, ya que Ping está utilizando ICMP que no tiene el concepto de puertos. Los puertos pertenecen a los protocolos de la capa de transporte como TCP y UDP. Sin embargo, podría usar nmap para ver si los puertos están abiertos o no

nmap -p 80 example.com

Editar: como se mencionó en flokra, nmap es más que un simple ping-for-ports-thingy. Es el mejor amigo de los auditores de seguridad y hackers y viene con toneladas de opciones geniales. Consulte el documento para ver todas las banderas posibles.


15
Es posible que desee agregar -PNpara omitir el descubrimiento de host que nmap generalmente hace antes de probar el puerto dado.
flokra

27
Para salvar a algunas personas algunos problemas: nmap / can / be instalado en Windows desde el enlace (o google nmap windows), PERO no funciona a través de VPN. PaPing no parecía capaz de escanear un rango de direcciones. He publicado el script de Python a continuación que funcionará a través de VPN para escanear un rango de puertos en un rango de direcciones.

23
Para otros: nmap no existe en Mac OS X, puede instalar nmap a través de homebrew brew install nmapo MacPorts.
Highway of Life

17
nping es más adecuado para esta tarea que nmap. nping es parte de la distribución nmap.
CMCDragonkai

66
Mac OSX tiene 'Network Utility' que tiene una pestaña de escáner de puertos
Shanimal

192

Abra una sesión de telnet en el puerto específico, por ejemplo:

# telnet google.com 80
Trying 74.125.226.48...
Connected to google.com.
Escape character is '^]'.

Para cerrar su sesión, presione Ctrl+ ].


23
netcattambién funciona muy bien y es menos detallado.
petrus

3
Telnet funciona bien para esto si el puerto es un puerto TCP.
Falcon Momot

66
netcat también funciona con UDP (nc -u)
Tsvetomir Dimitrov

1
Para usuarios de Mac - netcatahora está integrado en MacOS HighSierra, en donde telnet se puede instalar desde HomeBrewbrew install telnet
sandiejat

98
$ nc -vz google.com 80
Connection to google.com 80 port [tcp/http] succeeded!

10
Úselo con timelike in time nc -vz www.example.com 80y también tendrá una especie de RTT.
xebeche

3
Solución única que funciona en instancias de Amazon EC2 sin ninguna instalación.
Masadow

¿Qué es -z? ncat 6.40 en rhel7 ofrece una opción desconocida
Tagar

@Tagar según la ayuda en la versión de Ubuntu, -z es el modo Cero E / S, que se utiliza para escanear.
Ben Mordecai

89

Si está en una instalación de Windows con PowerShell v4 o posterior, puede usar el módulo PowerShell Test-Netconnection:

Test-NetConnection <host> -port <port>

Ejemplo: Test-NetConnection example.com -port 80

Este cmdlet también tiene el alias tnc. P.ejtnc example.com -port 80


80

Puedes usar PaPing:

http://code.google.com/p/paping

C:\>paping.exe www.google.com -p 80 -c 4
paping v1.5.1 - Copyright (c) 2010 Mike Lovell

Connecting to www.l.google.com [209.85.225.147] on TCP 80:

Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=25.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80

Connection statistics:
        Attempted = 4, Connected = 4, Failed = 0 (0.00%)
Approximate connection times:
        Minimum = 24.00ms, Maximum = 25.00ms, Average = 24.25ms

1
O en lugar de paping, podría usar cryping, que ha existido por mucho más tiempo y admite ping de algunos servicios y puertos.

¿Se puede usar para hacer ping a cualquier puerto o solo a 80?
Luke Puplett

@LukePuplett simplemente cambia el número 80 en el ejemplo. Ejecútelo escribiendo paping.exe <nombre de host / IP> -p <número de puerto> -c <número de intentos>
David Costa

Esto funciona muy bien. utilizar -c *para paping constante (?).
user2924019


26

Pruebe el curlcomando, como:

$ curl host:port

Por ejemplo:

$ curl -s localhost:80 >/dev/null && echo Success. || echo Fail.
Success.

El comando anterior devolverá Fallo en un código de estado de salida distinto de cero. En algunos casos particulares, como una respuesta vacía o con formato incorrecto (ver man curl), es posible que desee manejar códigos de salida específicos como exitosos, así que consulte esta publicación para obtener una explicación más detallada.


3
Me gusta porque curlestá presente por defecto en CentOS, por lo que no tengo que instalar nada.
bdemarest

curl trabajó en una Raspberry Pi (distro Raspian)
John M

1
Esta es, con mucho, la solución más elegante y universal. Lo modifiqué un poco para convertirlo en una línea ordenada:IP="<ip>" ; PORT="<port>" ; curl -s "$IP:$PORT" > /dev/null && echo "Success connecting to $IP on port $PORT." || echo "Failed to connect to $IP on port $PORT."
Lefty G Balogh

21

Encontré una solución más simple usando PsPing:

psping 192.168.2.2:5000

Es parte de Windows Sysinternals .

PsPing implementa la funcionalidad Ping, ping TCP, latencia y medición de ancho de banda.


1
También PsPing proviene del equipo de Microsoft SysInternal, por lo que podría considerarse un poco más legítimo cuando se trata con otras personas orientadas a Microsoft. (Y tiene una mejor funcionalidad que el antiguo PortQry)
martyvis

PSPing tiene la ventaja de proporcionar medición de latencia cuando se usa un puerto personalizado, algo que Test-NetConnection no puede hacer (solo informa el tiempo de respuesta de ICMP).
Jeff Miles

14

En Linux puede usar hping pero usa TCP, en lugar de ICMP.

hping example.com -S -V -p 80

1
hping (hping3 en mi ubuntu) es excelente. Repite periódicamente la sonda como hace ping, y a diferencia de muchas de las herramientas sugeridas aquí. También prueba si el paquete pasa y si el puerto está abierto. Si está abierto, obtienes flags=SA(es decir, SYN ACK), y si está cerrado, obtienes flags=SR(es decir, SYN RST). Tenga en cuenta que probablemente no necesite la -Vbandera aquí, pero sí necesita sudo / root para ejecutar hping.
mc0e

¡Excelente! A diferencia de muchas otras respuestas, esto informa latencia RTT como pingy pings hasta que se detiene.
Edward Anderson

11

Ping es muy específico, pero si desea verificar si un puerto está abierto o no, y está ejecutando un cuadro de Windows, entonces PortQry es su amigo.

Solo lo he usado para probar controladores de dominio para problemas de conectividad, pero funcionó de maravilla para eso, por lo que debería funcionar para usted.


1
PortQry fue lanzado originalmente en 1999/2000 por el equipo de MS Exchange, pero la versión reciente de MS parece haberlo atrofiado al eliminar la capacidad de consultar puertos remotos (salud y seguridad).
Luke Puplett

8

Aquí hay una aplicación de consola .NET rápida y sucia:

    static void Main(string[] args)
    {
        string addressArgument = null, portArgument = null;

        System.Net.Sockets.TcpClient tcpClient = null;

        try
        {
            addressArgument = args[0];
            portArgument = args[1];

            int portNumber;
            portNumber = Int32.Parse(portArgument);

            tcpClient = new System.Net.Sockets.TcpClient();
            tcpClient.ReceiveTimeout = tcpClient.SendTimeout = 2000;


            IPAddress address;
            if (IPAddress.TryParse(args[0], out address))
            {
                var endPoint = new System.Net.IPEndPoint(address, portNumber);
                tcpClient.Connect(endPoint);
            }
            else
            {
                tcpClient.Connect(addressArgument, portNumber);
            }

            Console.WriteLine("Port {0} is listening.", portArgument);
        }
        catch (Exception e)
        {
            if (e is SocketException || e is TimeoutException)
            {
                Console.WriteLine("Not listening on port {0}.", portArgument);
            }
            else
            {
                Console.WriteLine("Usage:");
                Console.WriteLine("    portquery [host|ip] [port]");
            }
        }
        finally
        {
            if (tcpClient != null)
                tcpClient.Close();
        }
    }

5

No.

No hay garantía de que el servicio que se ejecuta en el puerto entienda el ping. También abre la pregunta de qué "sabor" del puerto desea hacer ping, TCP o UDP? Como el "protocolo" de ping no usa ninguno (el ping se implementa usando ICMP ), no tiene mucho sentido.


4

Estoy bastante seguro de que la sonda Nagios check_tcp hace lo que quieres. Se pueden encontrar aquí y, aunque están diseñados para usarse en un contexto de Nagios, todos son programas independientes.

$ ./check_tcp -H host -p 22
TCP OK - 0.010 second response time on port 22|time=0.009946s;0.000000;0.000000;0.000000;10.000000

4

Esta es la única solución que funciona para las VPN con la máquina cliente siendo Windows Vista o Windows 7 , ya que otras respuestas enumeradas simplemente no funcionan. Esta respuesta se eliminó anteriormente y no debería haberse eliminado, ya que esta es la única solución para un caso común del mundo real. Como no hay una apelación disponible para la eliminación, la vuelvo a publicar para salvar a otros la frustración que tenía al intentar usar las otras respuestas.

El siguiente ejemplo encuentra qué IP en la VPN que tienen VNC / puerto 5900 abierto con el cliente que se ejecuta en Windows 7.

Un breve script de Python (v2.6.6) para escanear una lista dada de IP y puertos:

from socket import *

fTimeOutSec = 5.0
sNetworkAddress = '192.168.1'
aiHostAddresses = range(1,255)
aiPorts = [5900]

setdefaulttimeout(fTimeOutSec)
print "Starting Scan..."
for h in aiHostAddresses:
    for p in aiPorts:
        s = socket(AF_INET, SOCK_STREAM)
        address = ('%s.%d' % (sNetworkAddress, h))
        result = s.connect_ex((address,p))
        if ( 0 == result ):
            print "%s:%d - OPEN" % (address,p)
        elif ( 10035 == result ):
            #do nothing, was a timeout, probably host doesn't exist
            pass
        else:
            print "%s:%d - closed (%d)" % (address,p,result)

        s.close()
print "Scan Completed."

Los resultados parecían:

Starting Scan...
192.168.1.1:5900 - closed (10061)
192.168.1.7:5900 - closed (10061)
192.168.1.170:5900 - OPEN
192.168.1.170:5900 - closed (10061)
Scan Completed.

Las cuatro variables en la parte superior tendrían que cambiarse para que sean apropiadas para cualquier tiempo de espera, red, hosts y puertos que se necesiten. 5.0 segundos en mi VPN parecían ser suficientes para funcionar correctamente de manera consistente, menos (no siempre) dio resultados precisos. En mi red local, 0.5 fue más que suficiente.


2
Funciona perfectamente en el cliente Win 7 XP Pro / Win Server 2008 R2 para diagnosticar el puerto cerrado. (Tuve que usar un umbral de tiempo de espera de 30 segundos, pero eso puede ser un problema con un entorno de servidor específico, no un problema con este código)
David Zemens


1

En el shell Bash, puede usar el archivo pseudodispositivo TCP , por ejemplo:

</dev/tcp/serverfault.com/80 && echo Port open || echo Port closed

Aquí está la versión que implementa un tiempo de espera de 1 segundo:

timeout 1 bash -c "</dev/tcp/serverfault.com/81" && echo Port open || echo Port closed

0

Si está ejecutando un sistema operativo * nix, intente instalar y usar "zenmap", es una GUI para nmap y tiene varios perfiles de escaneo útiles que son de gran ayuda para el nuevo usuario.


Zenmap también está disponible para Windows.
Nick Young el