Главная

Monday, 11 December 2017

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

Всем привет.

Каждому сетевому администратору периодически приходится проверять доступность службы на  удаленном сервере. Это выполняется путем проверки ответа от удаленного порта. Традиционно такую проверку быстрее всего выполнить с помощью команды telnet. Например, для проверки доступности SMTP службы (по умолчанию ожидается ответ от 25-го порта) на почтовом сервере достаточно выполнить команду telnet mailserver 25.

Но начиная с Windows 7 клиент telnet выделен в отдельный компонент, который нужно устанавливать отдельно. В сети масса инкструкций на эту тему, но я право не понимаю зачем им следовать если можно просто подкинуть telnet.exe в папку Windows и пользоваться.

Еще один  бесплатный способ проверки удаленного порта - это использование  утилиты  portqry.exe от Microsoft.  Хотя сама Microsoft ее особо не рекламирует.

Простой пример проверки:
portqry -n mailserver -e 25
или
portqry -n 10.0.0.1 -e 25 -p TCP -i

Эта утилита имеет вариант с интерфейсом Port Query UI tool (portqueryui.exe). This is a tool to query open ports on remote or local machine. Рortqueryui.exe только надстройка, она использует для своей работы ту же portquery.exe.



И конечно наша любимая PowerShell тоже умеет делать это. Посмотрим, как выполнить аналогичное действие в PowerShell. Тут все просто.

Для начала вспомним что есть такой командлет как Test-Connection, который используется для отправки пакетов эхо-запроса ICMP (ping) одному или нескольким удаленным хостам.

Это простой и быстрый способ проверки, достпен ли хост. Для пинга одного компьютера, вы просто можете набрать:
Test-Connection -ComputerName localhost

Командлет Test-Connection по умолчанию отправляет 4 эхо-запроса. Вы можете изменить это значение на 1, указав параметр Count:
Test-Connection -ComputerName localhost -Count 1

Попытка пропинговать отсутствующий компьютер приведет к ошибке:
Test-Connection -ComputerName MyPC -Count 1
Test-Connection : Testing connection to computer ‘MyPC’ failed: No such host is known

Если вы не хотите, чтобы сообщение об ошибке отображалось, вы можете установить параметр ErrorAction в значение SilentlyContinue (или использовать структуру Try/Catch для обработки ошибок):
Test-Connection -ComputerName MyPC -Count 1 -ErrorAction SilentlyContinue

Один автор умной книги по PowerShell утверждал что Test-Connection отработает даже по тем хостам у которых ответ по Ping-у запрещен. Я не проверял.

Иначе, стоп, но нам же нужно проверить 25й ТСР-порт. 

Есть в PowerShell готовый командлет и для этого: Test-NetConnection который появился в PowerShell 4.0 (Windows 2012 R2, Windows 8.1 и выше). Входит он в модуль NetTCPIP.

Проверим, открыт ли порт TCP 25 на почтовом сервере с помощью Test-NetConnection:
Test-NetConnection -ComputerName mailserver -Port 25

Ответ может быть таким
ComputerName           : mailserver
RemoteAddress          : 10.168.1.7
RemotePort             : 25
InterfaceAlias         : CORPS
SourceAddress          : 10.168.1.45
PingSucceeded          : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : True

Т.е. Test-NetConnection одновременно проверяет доступность хоста и по Ping.

Если нужна только информация по доступности порта, в более лаконичном виде проверка может быть выполнена так:
TNC mailserver -Port 25 -InformationLevel Quiet
При доступности порта ответом будет True.

С помощью командлета Test-NetConnection можно проверить только TCP соединение, для проверки доступности UDP порта он не применим.

Мы можем проверить порты SMB, HTTP, RDP и PING c ключом -CommonTCPPort:
Test-NetConnection CorpWebServer -CommonTCPPort HTTP

Ответ может быть таким
ComputerName           : CorpWebServer
RemoteAddress          : 10.168.1.10
RemotePort             : 80
InterfaceAlias         : CORPS
SourceAddress          : 10.168.1.45
PingSucceeded          : False
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : True

По умолчанию командлета Test-NetConnection в Windows 7 нет. Ранее я писал что можно поднять версию PowerShell для Windows 7 до 4.0. Однако даже  в этом случае командлет Test-NetConnection у нас не появится. Так как модуль NetTCPIP надо импортировать дополнительно.

Например с ПК где установленa Windows 8.1:
$rsession = New-PSSession -ComputerName MyPCWin81
Import-Module NetTCPIP -PSSession $rsession

Или вот как пишут здесь. Хотя есть сомнения, так как версия PowerShell 5.0 в Windows 7 не поддерживается. Надо бы проверить.

Успехов.

No comments:

Post a Comment

А что вы думаете по этому поводу?