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

672

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

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

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

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

Ответы:

720

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

nmap -p 80 example.com

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

sfussenegger
источник
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

Нет, вы не можете, потому что pingиспользует протокол ICMP , который даже не имеет понятия портов.

Бальтазар
источник
47
Я почти уверен, что использование «ping» было метафорическим.
Люк Пуплетт
26

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

$ curl host:port

Например:

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

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

kenorb
источник
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
c4f4t0r
источник
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
kenorb
источник
0

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


источник
Zenmap также доступен для Windows.
Ник Янг