Пинг определенного порта


672

Просто быстрая проверка здравомыслия здесь.

Можете ли вы пропинговать конкретный порт машины, и если да, можете ли вы привести пример?

Я ищу что-то вроде ping ip address portNum.


1
для windows этот вопрос можно проверить
— нпочмака

Ответы:


720

Вы не можете пинговать порты, так как Ping использует ICMP, который не имеет понятия портов. Порты принадлежат протоколам транспортного уровня, таким как TCP и UDP. Тем не менее, вы можете использовать nmap, чтобы увидеть, открыты порты или нет

nmap -p 80 example.com

Редактировать: как уже упоминалось flokra, nmap - это больше, чем просто ping-for-ports-thingy. Это лучший друг аудиторов и хакеров безопасности, и он предлагает множество интересных вариантов. Проверьте документ на все возможные флаги.


15
Возможно, вы захотите добавить, -PNчтобы пропустить обнаружение хоста, которое обычно делает nmap перед тестированием данного порта.
— Flokra

27
Чтобы избавить некоторых людей от некоторых проблем: nmap / можно / установить на windows по ссылке (или в google nmap windows), НО он не работает через VPN. Похоже, что PaPing не может сканировать диапазон адресов. Ниже я разместил скрипт Python, который будет работать через VPN для сканирования диапазона портов по диапазону адресов.

23
Для других: nmap не существует в Mac OS X, вы можете установить nmap через homebrew brew install nmapили MacPorts.
— Highway of Life

17
nping лучше подходит для этой задачи, чем nmap. nping является частью дистрибутива nmap.
— CMCDragonkai

6
В Mac OSX есть «Network Utility», в которой есть вкладка «Сканер портов»
— Shanimal,

192

Откройте сеанс telnet для определенного порта, например:

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

Чтобы закрыть сеанс, нажмите Ctrl+ ].


23
netcatработает также отлично и менее многословно.
— петрус

3
Telnet хорошо работает для этого, если порт является портом TCP.
— Сокол Момот

6
Netcat тоже работает с UDP (nc -u)
— Цветомир Димитров

1
Для пользователей Mac - netcatтеперь встроенный MacOS HighSierra, в котором можно установить telnet из HomeBrewbrew install telnet
— sandiejat

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

10
Используйте с « timeкак в», time nc -vz www.example.com 80и вы будете иметь вид RTT тоже.
— xebeche

3
Единственное решение, которое работает на инстансах Amazon EC2 без какой-либо установки.
— Masadow

что такое -z? NCAT 6,40 на rhel7 дает это неизвестный вариант
— тагарскую

@Tagar, согласно справке в версии Ubuntu, -z - это режим Zero-I / O, который используется для сканирования.
— Бен Мордехай

89

Если у вас установлена ​​Windows с powershell v4 или новее, вы можете использовать модуль powershell test-netconnection:

Test-NetConnection <host> -port <port>

Пример: Test-NetConnection example.com -port 80

Этот командлет также имеет псевдоним tnc. Напримерtnc example.com -port 80


80

Вы можете использовать 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
Или вместо paping вы можете использовать шифрование, которое существует намного дольше и поддерживает пинг некоторых служб, а также портов.

Может ли это использоваться для проверки связи с любым портом или только с 80?
— Люк Пуплетт

@ LukePuplett просто измените число 80 в примере. Запустите его, введя paping.exe <hostname / IP> -p <номер_порта> -c <количество попыток>
— Дэвид Коста

Это прекрасно работает. использовать -c *для постоянного papinging (?).
— user2924019


26

Попробуйте curlкоманду, например:

$ curl host:port

Например:

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

Приведенная выше команда вернет Fail при ненулевых кодах выхода. В некоторых особых случаях, таких как пустой или неправильно сформированный ответ (см. man curl), Вы можете обрабатывать определенные коды выхода как успешные, поэтому просмотрите этот пост для более подробного объяснения.


3
Мне это нравится, потому что curlон присутствует по умолчанию в CentOS, поэтому мне не нужно ничего устанавливать.
— bdemarest

Керл работал над Raspberry Pi (дистрибутив Raspian)
— Джон М

1
Это, безусловно, самое элегантное и универсальное решение. Я немного подправил его, чтобы сделать его аккуратным: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."
— Левша Дж. Балог

21

Я нашел более простое решение с помощью PsPing:

psping 192.168.2.2:5000

Это часть Windows Sysinternals .

PsPing реализует функциональность Ping, TCP ping, задержку и измерение пропускной способности.


1
Кроме того, PsPing исходит от команды Microsoft SysInternal, поэтому его можно считать немного более законным, когда имеешь дело с другими людьми, ориентированными на Microsoft. (И имеет лучшую функциональность, чем очень старый PortQry)
— martyvis

Преимущество PSPing заключается в обеспечении измерения задержки при использовании пользовательского порта, чего не может сделать Test-NetConnection (он только сообщает время ответа ICMP).
— Джефф Майлз

14

В Linux вы можете использовать hping, но он использует TCP, а не ICMP.

hping example.com -S -V -p 80

1
hping (hping3 в моем Ubuntu) отлично. Он периодически повторяет зондирование, как это делает пинг, и в отличие от многих инструментов, предложенных здесь. Он также проверяет, проходит ли пакет и открыт ли порт. Если он открыт, вы получаете flags=SA(т.е. SYN ACK), а если он закрыт, вы получаете flags=SR(т.е. SYN RST). Обратите внимание, что вам, вероятно, здесь не нужен -Vфлаг, но вам нужен sudo / root для запуска hping.
— mc0e

Отлично! В отличие от многих других ответов, это сообщает о задержке RTT, как pingи пингует до остановки.
— Эдвард Андерсон

11

Ping очень специфичен, но если вы хотите проверить, открыт порт или нет и работает ли Windows-бокс, то PortQry - ваш друг.

Я использовал его только для тестирования контроллеров домена на наличие проблем с подключением, но это помогло, так что должно сработать для вас.


1
PortQry был первоначально выпущен в 1999/2000 годах командой MS Exchange, но последняя версия MS, похоже, отстала от него, убрав возможность запрашивать удаленные порты (здоровье и безопасность).
— Люк Пуплетт

8

Вот быстрое и грязное консольное приложение .NET:

    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

Нет.

Там нет никакой гарантии, что служба, работающая на порту, понимает пинг. Это также открывает вопрос о том, какой «вкус» порта вы хотите пинговать, TCP или UDP? Поскольку пинг «протокол» не использует ни один (пинг реализован с использованием ICMP ), это не имеет большого смысла.


4

Я совершенно уверен, что Nagios check_tcp делает то, что вы хотите. Их можно найти здесь, и хотя они предназначены для использования в контексте Nagios, все они являются автономными программами.

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

Это единственное решение, которое работает для VPN с клиентским компьютером под управлением Windows Vista или Windows 7 , поскольку другие перечисленные ответы просто не работают. Этот ответ был ранее удален и не должен был быть, поскольку это единственное решение для реального общего случая. Поскольку для удаления нет апелляции, я делаю это повторно, чтобы избавить других от разочарования, связанного с попыткой использовать другие ответы.

В приведенном ниже примере показано, какие IP-адреса в VPN с открытым VNC / портом 5900 с клиентом, работающим в Windows 7.

Короткий скрипт Python (v2.6.6) для сканирования заданного списка IP-адресов и портов:

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

Результаты выглядели так:

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.

Четыре переменные в верхней части необходимо изменить, чтобы они соответствовали требуемому времени ожидания, сети, хостам и портам. 5,0 секунд на моем VPN было достаточно для правильной работы, меньшее не всегда давало точные результаты. В моей локальной сети 0,5 было более чем достаточно.


2
Отлично работает на клиенте Win 7 XP Pro / Win Server 2008 R2 для диагностики закрытого порта. (Мне пришлось использовать 30-секундный порог тайм-аута, но это может быть проблемой с конкретной серверной средой, а не с этим кодом)
— Дэвид Земенс


1

В оболочке Bash вы можете использовать файл псевдоустройства TCP , например:

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

Вот версия, реализующая время ожидания в 1 секунду:

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

0

Если вы работаете с операционной системой * nix, попробуйте установить и использовать «zenmap», это графический интерфейс для nmap и несколько полезных профилей сканирования, которые очень помогут новому пользователю.


Zenmap также доступен для Windows.
— Ник Янг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.