Respuestas:
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.
-PN
para omitir el descubrimiento de host que nmap generalmente hace antes de probar el puerto dado.
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.
brew install nmap
o MacPorts.
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+ ].
netcat
también funciona muy bien y es menos detallado.
netcat
ahora está integrado en MacOS HighSierra, en donde telnet se puede instalar desde HomeBrewbrew install telnet
$ nc -vz google.com 80
Connection to google.com 80 port [tcp/http] succeeded!
time
like in time nc -vz www.example.com 80
y también tendrá una especie de RTT.
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
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
-c *
para paping constante (?).
No, no puedes, porque ping
usa el protocolo ICMP , que ni siquiera tiene un concepto de puertos.
Pruebe el curl
comando, 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.
curl
está presente por defecto en CentOS, por lo que no tengo que instalar nada.
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."
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.
En Linux puede usar hping pero usa TCP, en lugar de ICMP.
hping example.com -S -V -p 80
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 -V
bandera aquí, pero sí necesita sudo / root para ejecutar hping.
ping
y pings hasta que se detiene.
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.
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();
}
}
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
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.
Hay una herramienta ligera para ello, llamada tcping: http://www.linuxco.de/tcping/tcping.html
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
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.