Ping sur un port spécifique


671

Juste un rapide contrôle de santé mentale ici.

Pouvez-vous envoyer une requête ping à un port spécifique d'une machine, et si oui, pouvez-vous fournir un exemple?

Je cherche quelque chose comme ping ip address portNum.


1
pour windows cette question peut être vérifiée
npocmaka

Réponses:


720

Vous ne pouvez pas cingler les ports, car Ping utilise ICMP qui n'a pas le concept de ports. Les ports appartiennent aux protocoles de la couche de transport tels que TCP et UDP. Cependant, vous pouvez utiliser nmap pour voir si les ports sont ouverts ou non.

nmap -p 80 example.com

Edit: Comme le dit flokra, nmap est plus qu’un ping-pour-ports-thingy. C'est le meilleur ami des auditeurs de sécurité et des pirates informatiques et il propose une multitude d'options intéressantes. Vérifiez la doc pour tous les drapeaux possibles.


15
Vous voudrez peut-être ajouter -PNpour ignorer la découverte d'hôte que nmap fait généralement avant de tester le port donné.
Flokra

27
Pour éviter des ennuis à certaines personnes: nmap / can / peut être installé sur Windows à partir de link (ou google nmap windows), MAIS cela ne fonctionne pas sur les VPN. PaPing n'a pas semblé être capable de scanner une plage d'adresses. J'ai posté un script Python ci-dessous qui fonctionnera sur un réseau privé virtuel (VPN) pour analyser une plage de ports sur une plage d'adresses.

23
Pour les autres: nmap n'existe pas sous Mac OS X, vous pouvez installer nmap via homebrew brew install nmapou MacPorts.
Autoroute de la vie

17
nping convient mieux à cette tâche que nmap. nping fait partie de la distribution nmap.
CMCDragonkai

6
Mac OSX a «Utilitaire de réseau» qui a un onglet de scanner de port
Shanimal

192

Ouvrez une session telnet sur le port spécifique, par exemple:

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

Pour fermer votre session, appuyez sur Ctrl+ ].


23
netcatfonctionne aussi très bien et est moins prolixe.
Petrus

3
Telnet fonctionne bien pour cela si le port est un port TCP.
Falcon Momot

6
netcat fonctionne aussi avec UDP (nc -u)
Tsvetomir Dimitrov

1
Pour les utilisateurs de Mac - netcatMacOS HighSierra est maintenant intégré, dans lequel telnet peut être installé à partir de HomeBrewbrew install telnet
sandiejat

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

10
Utilisez avec timecomme dans time nc -vz www.example.com 80et vous aurez aussi une sorte de RTT.
xebeche

3
Solution unique fonctionnant sur les instances Amazon EC2 sans aucune installation.
Masadow

qu'est-ce que -z? ncat 6.40 sur rhel7 lui donne une option inconnue
Tagar

@Tagar selon l'aide de la version Ubuntu, -z est le mode Zero-I / O, utilisé pour la numérisation.
Ben Mordecai

89

Si vous êtes sur une installation Windows avec powershell v4 ou plus récent, vous pouvez utiliser le module test-netconnection powershell:

Test-NetConnection <host> -port <port>

Exemple: Test-NetConnection example.com -port 80

Cette cmdlet a également l'alias tnc. Par exempletnc example.com -port 80


80

Vous pouvez utiliser 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
Vous pouvez également utiliser le cryptage, qui prend beaucoup plus de temps et prend en charge le ping de certains services et ports.

Est-ce que cela peut être utilisé pour faire un ping sur n'importe quel port ou juste 80?
Luke Puplett

@LukePuplett vient de changer le nombre 80 dans l'exemple. Exécutez-le en tapant paping.exe <nomhôte / IP> -p <numéro de port> -c <nombre de tentatives>
David Costa

Cela fonctionne très bien. utiliser -c *pour le taping constant (?).
user2924019


26

Essayez la curlcommande, comme:

$ curl host:port

Par exemple:

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

La commande ci-dessus renvoie Fail sur un code d'état de sortie différent de zéro. Dans certains cas particuliers, tels que des réponses vides ou mal formées (voir man curl), vous voudrez peut-être traiter des codes de sortie spécifiques comme ayant abouti. Veuillez consulter cet article pour obtenir des explications plus détaillées.


3
J'aime cela car il curlest présent par défaut sur CentOS, je n'ai donc rien à installer.
bdemarest

curl travaillé sur une Raspberry Pi (distro Raspian)
John M

1
C'est de loin la solution la plus élégante et la plus universelle. Je l'ai légèrement modifié pour en faire un joli film: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

J'ai trouvé une solution plus simple en utilisant PsPing:

psping 192.168.2.2:5000

Cela fait partie de Windows Sysinternals .

PsPing implémente la fonctionnalité Ping, le ping TCP, la latence et la mesure de la bande passante.


1
PsPing provient également de l'équipe Microsoft SysInternal et pourrait donc être considéré comme un peu plus légitime lorsqu'il traite avec d'autres personnes orientées Microsoft. (Et a une meilleure fonctionnalité que le très vieux PortQry)
martyvis

PSPing présente l'avantage de fournir une mesure de latence lors de l'utilisation d'un port personnalisé, ce que Test-NetConnection ne peut pas faire (il ne signale que le temps de réponse ICMP).
Jeff Miles le

14

Sous Linux, vous pouvez utiliser hping mais il utilise TCP plutôt que ICMP.

hping example.com -S -V -p 80

1
hping (hping3 dans mon Ubuntu) est excellent. Il répète périodiquement la sonde comme le fait le ping, et contrairement à la plupart des outils suggérés ici. Il teste également si le paquet passe et si le port est ouvert. Si c'est ouvert, vous obtenez flags=SA(c'est-à-dire SYN ACK) et s'il est fermé, vous obtenez flags=SR(c'est-à-dire SYN RST). Notez que vous n'avez probablement pas besoin du -Vdrapeau ici, mais que vous avez besoin de sudo / root pour exécuter hping.
mc0e

Excellent! Contrairement à de nombreuses autres réponses, cela indique une latence du RTT similaire pinget des pings jusqu’à l’arrêt.
Edward Anderson

11

Ping est très spécifique, mais si vous voulez vérifier si un port est ouvert et que vous utilisez une boîte Windows, alors PortQry est votre ami.

Je ne l'ai utilisé que pour tester les contrôleurs de domaine afin de détecter les problèmes de connectivité, mais cela a fonctionné à merveille et devrait donc fonctionner pour vous.


1
PortQry a été initialement publié en 1999/2000 par l'équipe MS Exchange, mais la version récente de MS semble l'avoir retardé en supprimant la possibilité d'interroger les ports distants (santé et sécurité).
Luke Puplett

8

Voici une application de console .NET rapide et sale:

    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

Non.

Rien ne garantit que le service exécuté sur le port comprend le ping. Cela pose également la question de la "saveur" du port que vous voulez utiliser, TCP ou UDP? Etant donné que le protocole "protocole" n'utilise aucun des deux (le ping est implémenté via ICMP ), cela n'a pas beaucoup de sens.


4

Je suis à peu près sûr que la sonde Nagios check_tcp fait ce que vous voulez. Ils peuvent être trouvés ici et bien que conçus pour être utilisés dans un contexte Nagios, ils sont tous des programmes autonomes.

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

C’est la seule solution qui fonctionne pour les VPN dont l’ordinateur client est Windows Vista ou Windows 7 , les autres réponses répertoriées ne fonctionnant tout simplement pas. Cette réponse avait été précédemment supprimée et n'aurait pas dû l'être car il s'agit de la seule solution pour un cas commun réel. Puisqu'il n'y a pas de recours disponible pour la suppression, je le republie pour éviter aux autres la frustration que j'ai éprouvée à essayer d'utiliser les autres réponses.

L'exemple ci-dessous recherche les adresses IP sur le VPN ayant VNC / port 5900 ouvertes avec le client s'exécutant sur Windows 7.

Un court script Python (v2.6.6) pour analyser une liste donnée d'adresses IP et de ports:

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

Les résultats ressemblaient à:

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.

Les quatre variables du haut doivent être modifiées pour s'adapter aux délais, au réseau, aux hôtes et aux ports nécessaires. 5,0 secondes sur mon VPN semblent suffire pour fonctionner correctement, moins de résultats ne sont pas (toujours) exacts. Sur mon réseau local, 0,5 était plus que suffisant.


2
Fonctionne parfaitement sur le client Win 7 XP Pro / Win Server 2008 R2 pour diagnostiquer le port fermé. (J'ai dû utiliser un seuil de délai d'expiration de 30 secondes, mais cela peut poser un problème avec un environnement de serveur spécifique et non pas un problème avec ce code)
David Zemens


1

Dans le shell Bash, vous pouvez utiliser le fichier de pseudo-périphérique TCP , par exemple:

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

Voici la version implémentant un délai d'expiration de 1 seconde:

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

0

Si vous utilisez un système d’exploitation * nix, essayez d’installer et d’utiliser «zenmap», c’est une interface graphique pour nmap et plusieurs profils d’analyse utiles qui aident beaucoup le nouvel utilisateur.


Zenmap est également disponible pour Windows.
Nick Young
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.