Effettua il ping di una porta specifica


671

Solo un rapido controllo di sanità mentale qui.

Puoi eseguire il ping di una porta specifica di una macchina e, in tal caso, puoi fornire un esempio?

Sto cercando qualcosa di simile ping ip address portNum.


1
per windows questa domanda può essere verificata
npocmaka

Risposte:


720

Non è possibile eseguire il ping delle porte, poiché Ping utilizza ICMP che non ha il concetto di porte. Le porte appartengono ai protocolli del livello di trasporto come TCP e UDP. Tuttavia, è possibile utilizzare nmap per vedere se le porte sono aperte o meno

nmap -p 80 example.com

Modifica: come menzionato flokra, nmap è molto più di un semplice ping-per-porti. È il migliore amico dei revisori della sicurezza e degli hacker e offre moltissime opzioni interessanti. Controlla il documento per tutte le possibili bandiere.


15
Potresti voler aggiungere -PNper saltare la scoperta dell'host che di solito fa nmap prima di testare la data porta.
flokra

27
Per evitare problemi ad alcune persone: nmap / può / essere installato su Windows dal link (o google nmap windows), MA non funziona tramite VPN. Il PaPing non sembra essere in grado di scansionare un intervallo di indirizzi. Di seguito ho pubblicato lo script Python che funzionerà su VPN per scansionare un intervallo di porte su un intervallo di indirizzi.

23
Per altri: nmap non esiste su Mac OS X, è possibile installare nmap tramite homebrew brew install nmapo MacPorts.
Highway of Life,

17
nping è più adatto a questo compito di nmap. nping fa parte della distribuzione nmap.
CMCDragonkai,

6
Mac OSX ha "Utilità di rete" che ha una scheda per lo scanner delle porte
Shanimal,

192

Aprire una sessione telnet sulla porta specifica, ad esempio:

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

Per chiudere la sessione, premi Ctrl+ ].


23
netcatfunziona anche alla grande ed è meno prolisso.
petrus,

3
Telnet funziona bene per questo se la porta è una porta TCP.
Falcon Momot,

6
netcat funziona anche con UDP (nc -u)
Tsvetomir Dimitrov

1
Per utenti Mac: netcatora è integrato MacOS HighSierra, in cui Telnet può essere installato da HomeBrewbrew install telnet
sandiejat,

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

10
Usa con timelike in time nc -vz www.example.com 80e avrai anche una sorta di RTT.
xebeche,

3
Soluzione unica che funziona su istanze Amazon EC2 senza alcuna installazione.
Masadow,

che cos'è -z? ncat 6.40 su rhel7 offre un'opzione sconosciuta
Tagar,

@Tagar secondo l'aiuto nella versione di Ubuntu, -z è la modalità Zero-I / O, che viene utilizzata per la scansione.
Ben Mordecai,

89

Se stai eseguendo un'installazione di Windows con PowerShell v4 o più recente, puoi utilizzare il modulo PowerShell test-netconnection:

Test-NetConnection <host> -port <port>

Esempio: Test-NetConnection example.com -port 80

Questo cmdlet ha anche l'alias tnc. Per esempiotnc example.com -port 80


80

Puoi usare 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 invece di usare la carta, potresti usare la crittografia che esiste da molto più tempo e supporta il ping di alcuni servizi e delle porte.

Può essere usato per eseguire il ping di qualsiasi porta o solo 80?
Luke Puplett,

@LukePuplett cambia semplicemente il numero 80 nell'esempio. Eseguilo digitando paping.exe <nomehost / IP> -p <numeroport> -c <numero di tentativi>
David Costa

Funziona benissimo. utilizzare -c *per paping costante (?).
user2924019,


26

Prova il curlcomando, come:

$ curl host:port

Per esempio:

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

Il comando sopra restituirà Fail su codici di stato di uscita diversi da zero. In alcuni casi particolari, come risposta vuota o non valida (vedi man curl), potresti voler gestire specifici codici di uscita come riusciti, quindi controlla questo post per una spiegazione più dettagliata.


3
Mi piace perché curlè presente di default su CentOS, quindi non devo installare nulla.
bdemarest,

curl ha lavorato su un Raspberry Pi (distro Raspian)
John M,

1
Questa è di gran lunga la soluzione più elegante e universale. L'ho leggermente modificato per renderlo un perfetto osservatore: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

Ho trovato una soluzione più semplice usando PsPing:

psping 192.168.2.2:5000

Fa parte di Windows Sysinternals .

PsPing implementa la funzionalità Ping, ping TCP, latenza e misurazione della larghezza di banda.


1
Anche PsPing proviene dal team Microsoft SysInternal, quindi potrebbe essere considerato un po 'più legittimo quando si tratta di altre persone orientate a Microsoft. (E ha una funzionalità migliore rispetto all'antichissimo PortQry)
martyvis,

PSPing ha il vantaggio di fornire la misurazione della latenza quando si utilizza una porta personalizzata, cosa che Test-NetConnection non può fare (riporta solo i tempi di risposta dell'ICMP).
Jeff Miles il

14

Su Linux puoi usare hping ma usa TCP, piuttosto che ICMP.

hping example.com -S -V -p 80

1
hping (hping3 nel mio ubuntu) è eccellente. Ripete periodicamente la sonda come fa il ping, e diversamente da molti degli strumenti suggeriti qui. Verifica inoltre se il pacchetto passa e se la porta è aperta. Se è aperto ottieni flags=SA(cioè SYN ACK), e se è chiuso ottieni flags=SR(cioè SYN RST). Nota che probabilmente non hai bisogno della -Vbandiera qui, ma hai bisogno di sudo / root per eseguire l'hping.
mc0e

Eccellente! A differenza di molte altre risposte, questo segnala latenza RTT pinge ping fino a quando non viene interrotto.
Edward Anderson,

11

Il ping è molto specifico, ma se vuoi verificare se una porta è aperta o meno e se stai eseguendo una finestra di Windows, PortQry è tuo amico.

L'ho usato solo per testare i controller di dominio per problemi di connettività, ma ha funzionato a meraviglia, quindi dovrebbe funzionare per te.


1
PortQry è stato originariamente rilasciato nel 1999/2000 dal team di MS Exchange, ma la versione recente di MS sembra averlo rallentato rimuovendo la possibilità di interrogare le porte remote (salute e sicurezza).
Luke Puplett,

8

Ecco un'app console .NET veloce e sporca:

    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.

Non è garantito che il servizio in esecuzione sulla porta comprenda il ping. Si apre anche la domanda su quale "sapore" di porta si desidera eseguire il ping, TCP o UDP? Dal momento che il ping "protocollo" utilizza né (ping è implementato usando ICMP ), non fa un sacco di senso.


4

Sono abbastanza sicuro che la sonda Nagios check_tcp fa quello che vuoi. Possono essere trovati qui e sebbene progettati per essere utilizzati in un contesto Nagios, sono tutti programmi autonomi.

$ ./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

Questa è l' unica soluzione che funziona per le VPN con il computer client Windows Vista o Windows 7 , poiché le altre risposte elencate semplicemente non funzionano. Questa risposta è stata precedentemente eliminata e non avrebbe dovuto essere, in quanto questa è l'unica soluzione per un caso comune nel mondo reale. Poiché non è disponibile alcun appello per l'eliminazione, lo ripubblico per salvare agli altri la frustrazione che ho avuto nel cercare di utilizzare le altre risposte.

L'esempio seguente trova quali IP sulla VPN che hanno VNC / porta 5900 si aprono con il client in esecuzione su Windows 7.

Un breve script Python (v2.6.6) per scansionare un determinato elenco di IP e porte:

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."

I risultati sembravano:

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.

Le quattro variabili in alto dovrebbero essere modificate per essere appropriate a qualsiasi timeout, rete, host e porte necessari. 5,0 secondi sulla mia VPN sembravano sufficienti per funzionare correttamente in modo coerente, meno non ha (sempre) dato risultati accurati. Sulla mia rete locale, 0,5 era più che sufficiente.


2
Funziona perfettamente su client Win 7 XP Pro / Win Server 2008 R2 per diagnosticare la porta chiusa. (Ho dovuto usare una soglia di timeout di 30 secondi, ma potrebbe essere un problema con un ambiente server specifico non un problema con questo codice)
David Zemens


1

Nella shell Bash, è possibile utilizzare il file pseudo-dispositivo TCP , ad esempio:

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

Ecco la versione che implementa un timeout di 1 secondo:

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

0

Se stai eseguendo un sistema operativo * nix, prova a installare e utilizzare "zenmap", è una GUI per nmap e ha diversi utili profili di scansione che sono di grande aiuto per il nuovo utente.


Zenmap è disponibile anche per Windows.
Nick Young,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.