В процессе разворачивания и эксплуатации информационных систем часто требуется проверка доступности порта того или иного ресурса. Это может быть сервер приложений 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)
Заключение
Заметка не предполагает исчерпывающего списка и анализа всех возможных способов. Приведены три варианта, которые можно было бы охарактеризовать как "традиционный", "портабельный" и "встроенный". Каждый из них имеет свою область применения, в зависимости от системы, на которой необходимо выполнить проверку.
Полагаю, опытные администраторы смогут добавить еще несколько способов. Каким способом пользуетесь Вы и почему?