Способы проверки доступности TCP-портов

Как проверить доступен ли порт сервера? Или внешний веб-сервис? Приведены несколько способов для использования на Windows-системах.

В процессе разворачивания и эксплуатации информационных систем часто требуется проверка доступности порта того или иного ресурса. Это может быть сервер приложений 1С, к которому не удается подключиться пользователю. Или же это внешний веб-ресурс, к которому происходит обращение. Или что-то еще.

Для проверки доступности самого сервера обычно используется команда ping. Но, в силу того, что данная утилита работает с ICMP-пакетами, для конкретного порта проверить доступ таким образом невозможно. Кроме того, на ресурсе в целях безопасности может быть заблокирован ответ на ICMP-пакеты, соответственно, результат доступности нельзя считать однозначным, если ресурс "не пингуется".

Как проверить доступен ли порт?

 
Традиционный способ.

Первое, что приходит на ум — использовать "старый добрый" telnet.

Для примера проверять будем доступность менеджера кластера:

C:>telnet ks-app-02 2141

Получили в ответ "кракозябру" — значит доступ есть

Осталось выйти сначала из кракозябры по ‘CTRL+]’ и затем из самого telnet-а 

Microsoft Telnet> q

Загвоздка в том, что в большинстве современных Windows-систем telnet-клиент не установлен по-умолчанию, и требуется доустанавливать этот компонент. Что не всегда возможно, т.к. компьютер может быть и не своим и/или нет соответствующих прав.

 

Способ без инсталляции программ.

Хотелось бы иметь какой-то инструмент, не требующий установки, портабельный, чтобы можно было  его просто скопировать и пользоваться, а при необходимости, легко удалить после использования.

В качестве такого инструмента удобно использовать утилиту psping от Sysinternals.

Эту утилиту можно скачать как отдельно, так и в составе пакета SysinternalsSuite, который содержит  множество других необходимых инструментов.

C:>psping ks-app-02:2141

 

Еще один портабельный инструмент, позволяющий решить задачу:

tcping (https://elifulkerson.com/projects/tcping.php)

C:>tcping ks-app-02 2141

 

Встроенный инструментарий.

Однако есть возможность обойтись и совсем без сторонних утилит. В Windows есть встроенный инструмент, позволяющий выполнить такую проверку.

Это powershell-командлет Test-NetConnection

PS C:> Test-NetConnection ks-app-02 -Port 2141

В ответе нас интересует последняя строка — TcpTestSucceeded: True.  В данном случае — доступ есть.

Также, в ответе может содержаться еще значение PingSucceeded  — это "обычный" ping по ICMP.

У командлета есть очень удобный для запоминания и быстрого ввода альяс tnc, а также ключ позволяющий ограничить вывод только результатом.

C:>tnc ks-app-02 -Port 2141 -InformationLevel Quiet

Разумеется, запускать командлет необходимо в окне PowerShell, а не "командной строки".

Хотя, из командной строки тоже можно, вызвав PowerShell:

C:>powershell tnc ks-app-02 -port 2141

Следует заметить, что командлет доступен в версиях PowerShell от 4.0 и выше, т.е. начиная с Windows Server 2012 R2 и Windows 8.1

Документация: Test-NetConnection (Microsoft, eng)

 

Заключение

Заметка не предполагает исчерпывающего списка и анализа всех возможных способов. Приведены три варианта, которые можно было бы охарактеризовать как "традиционный", "портабельный" и "встроенный". Каждый из них имеет свою область применения, в зависимости от системы, на которой необходимо выполнить проверку.

Полагаю, опытные администраторы смогут добавить еще несколько способов. Каким способом пользуетесь Вы и почему?

9 Comments

  1. i_lo

    Спасибо за psping и powershell tnc!

    Сам чаще всего пользуюсь PortQryUI — https://www.microsoft.com/en-US/download/details.aspx?id=24009. Легко скачивается. Не требует установки. Командная строка или графический интерфейс. Можно тестировать набор портов.

    Reply
  2. -vito-

    (1) Александр, спасибо и Вам!

    Протестировал, дейтвительно удобная штука. Возможность тестирования по списку или диапазону портов — просто клад!

    Reply
  3. starik-2005

    https://www.shellhacks.com/ru/20-nmap-examples/

    не благодарите…

    https://habr.com/ru/post/399375/ — очень интересная статейка для настоящих кулхацкерофф.

    Reply
  4. -vito-

    (3) Сергей, я прямо ждал, что nmap будет упомянут.

    Насколько я понимаю, ему требуется инсталляция. По крайней мере в Windows. Или есть портабельный?

    Reply
  5. starik-2005

    (4) предположу, что если его статически слинковать, то он вполне себе портабельный будет — он же опенсорсный и Вы можете творить с ним что угодно…

    Reply
  6. user1243696

    (4) Не nmap конечно https://portscaner.ru/tools-open-local-ports но программы использующие порты покажет и портабельна!

    Reply
  7. fd34

    tcping

    https://www.elifulkerson.com/projects/tcping.php

    Аналог стандартного ping-а, но для tcp.

    ……..>tcping -t ya.ru 443
    
    ** Pinging continuously.  Press control-c to stop **
    
    Probing 87.250.250.242:443/tcp — Port is open — time=28.584ms
    Probing 87.250.250.242:443/tcp — Port is open — time=16.356ms
    Probing 87.250.250.242:443/tcp — Port is open — time=15.093ms
    Probing 87.250.250.242:443/tcp — Port is open — time=26.543ms
    Probing 87.250.250.242:443/tcp — Port is open — time=21.468ms
    Probing 87.250.250.242:443/tcp — Port is open — time=15.896ms
    Probing 87.250.250.242:443/tcp — Port is open — time=18.567ms
    Control-C
    
    Ping statistics for 87.250.250.242:443
    7 probes sent.
    7 successful, 0 failed.  (0.00% fail)
    Approximate trip times in milli-seconds:
    Minimum = 15.093ms, Maximum = 28.584ms, Average = 20.358ms

    Показать

    Reply
  8. ManyakRus

    1) очень полезно написано 🙂

    «в ответ «кракозябру» — значит доступ есть»

    крякозябру я видел раньше, но не думал что это «доказательство»

    2) а как можно свой компьютер проверить ?

    (без постороннего компьютера)

    на наличие открытых портов 1540-15хх

    ато отладка в 1С не работала без портов,

    чтоб сисадминам в морду тыкнуть 🙂

    Reply
  9. -vito-

    (8)

    Свой компьютер проверяется точно так же, как и любой другой. Только вместо имени удаленного компьютера подставляете «localhost» или имя, которое Вам отобразит команда hostname.

    Например:

    psping localhost:1540

    или

    powershell tnc mycompname -p 1540

    Вопрос только в том, что такая проверка даст. Она ведь осуществляется «изнутри». Поэтому внешние ограничения (на уровне сетевой инфраструктуры) на неё не влияют.

    При этом, нужно учитывать, что на проверяемом порту что-то должно работать, чтобы был положительный ответ.

    Т.е. если установлен сервер 1С предприятия, но служба не запущена, то результат проверки будет такой же как и при недоступном порту.

    Это относится ко всем проверкам, а не только локального компьютера.

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

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *