Test-NetConnection: сканирование открытых/закрытых портов из PowerShell

Test-NetConnection — готовый к использованию командлет для проверки сетевого подключения появился в PowerShell 4.0 (Windows 2012 R2, Windows 8.1 и новее). Этот командлет можно использовать для проверки ответа и доступности удалённого сервера или сетевой службы на нём, портов TCP, заблокированных брандмауэрами, проверки доступности и маршрутизации ICMP. Фактически, командлет Test-NetConnection может заменить сразу несколько стандартных инструментов сетевого администрирования: ping, traceroute, сканер TCP-портов и т. д.

Время от времени любой администратор должен проверять доступность службы на удалённом сервере, проверяя ответ удалённого TCP-порта (например, доступность электронной почты или веб-сервера). Более того, большинство администраторов используют для выполнения такой проверки порта с помощью команды telnet. Например, чтобы убедиться, что служба SMTP отвечает на почтовом сервере (по умолчанию она отвечает на TCP-порту 25), достаточно выполнить команду

telnet mail.site.com 25

Но начиная с Windows 7, клиент telnet стал функцией, которую нужно устанавливать отдельно. Давайте посмотрим, как проверить открытые/закрытые TCP-порты с помощью PowerShell.

Основное преимущество командлета Test-NetConnection заключается в том, что он уже входит в состав всех современных версий Windows, и вам не нужно устанавливать его отдельно. Командлет является частью модуля NetTCPIP (начиная с PoSh v4.0).

Подсказка: вы можете проверить текущую установленную версию PowerShell с помощью команды:

$PSVersionTable.PSVersion

Значение 7 в столбце Major означает, что на вашем компьютере установлена оболочка PowerShell 7.2.

Тестирование открытости/закрытости TCP-портов с помощью Test-NetConnection

Давайте проверим, открыт ли (доступен) TCP-порт 80 (протокол HTTP) на удалённом почтовом сервере, используя Test-NetConnection:

Test-NetConnection -ComputerName hackware-arch -Port 80

Примечание: используя командлет Test-NetConnection, вы можете проверить только подключение к порту TCP, и он не применим для проверки доступности удалённых портов UDP.

Укороченная версия той же команды выглядит так:

TNC hackware-arch -Port 80

Рассмотрим результат выполнения команды:

ComputerName     : hackware-arch
RemoteAddress    : 192.168.0.88
RemotePort       : 80
InterfaceAlias   : Ethernet
SourceAddress    : 192.168.0.101
TcpTestSucceeded : True

Как видите, командлет преобразует имя сервера в IP-адрес и проверяет доступность порта TCP. На указанном сервере TCP-порт 80 (RemotePort : 80) открыт (TcpTestSucceeded : True).

Командлет имеет специальный параметр -CommonTCPPort, который позволяет указать имя известного сетевого протокола (HTTP, RDP, SMB, WINRM).

Например, чтобы проверить доступность веб-сервера HTTP, вы можете использовать команду:

Test-NetConnection -ComputerName hackware-arch -CommonTCPPort HTTP

Или открытость порта RDP (3389):

Test-NetConnection ny-rds1 -CommonTCPPort RDP

Вы можете перечислить все параметры, которые возвращает командлет Test-NetConnection:

Test-NetConnection hackware-arch -port 80 | Format-List *

Обратите внимание на строку в выводе:

PingSucceeded            : False

Это означает следующее:

  1. Перед проверкой порта командлет пытается выполнить пинг
  2. В данном случае компьютер не ответил на пинг (такое бывает — даже включенные компьютеры не обязаны отвечать на пинг, это можно изменить в настройках файервола)
  3. Даже при неудачном пинге Test-NetConnection всё равно проверяет доступность порта

Если вам нужно только посмотреть, доступен ли порт, его можно проверить быстрее:

TNC hackware-arch -port 80 -InformationLevel Quiet

Командлет вернул True, что означает, что удалённый порт открыт.

Подсказка: в более ранних версиях PowerShell вы могли проверить доступность TCP-порта следующим образом:

(New-Object System.Net.Sockets.TcpClient).Connect('hackware-arch', 80)

В Windows 10/Windows Server 2016 вы можете использовать командлет Test-NetConnection для отслеживания маршрута к удалённому серверу с помощью параметра -TraceRoute (аналог команды tracert в Windows). Параметр -Hops позволяет ограничить максимальное количество хопов (узлов) при проверке маршрута.

Test-NetConnection suip.biz -TraceRoute

Связанная статья: Трассировка сетевого маршрута

Командлет вернул суммарную задержку сети при доступе к серверу в миллисекундах (PingReplyDetails (RTT) : 36 ms) и все IP-адреса маршрутизаторов на пути к целевому серверу.

Test-NetConnection в скриптах мониторинга PowerShell

Следующая команда позволяет вам проверить доступность определённого порта на нескольких серверах, список которых хранится в текстовом файле list_servers.txt (расположен в папке c:\PS\). Нам нужны серверы, на которые не отвечает указанный сервис:

Get-Content c:\PS\list_servers.txt | where { -NOT (Test-Netconnection $_ -Port 25 -InformationLevel Quiet)}| Format-Table -AutoSize

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

Например, вы можете проверить доступность базовых служб на всех контроллерах домена (список контроллеров домена можно получить с помощью командлета Get-ADDomainController). Давайте проверим следующие службы на DC (инструмент PortQry имеет аналогичное правило «Domain and trusts»):

  • RPC – TCP/135
  • LDAP – TCP/389
  • LDAP – TCP/3268
  • DNS – TCP/53
  • Kerberos – TCP/88
  • SMB – TCP/445

Скрипт проверит указанные TCP-порты на контроллерах домена, и, если один из портов недоступен, он выделит его красным цветом (вы можете запустить этот скрипт PowerShell как службу Windows).

$Ports  = "135","389","636","3268","53","88","445","3269", "80", "443"
$AllDCs = Get-ADDomainController -Filter * | Select-Object Hostname,Ipv4address,isGlobalCatalog,Site,Forest,OperatingSystem
ForEach($DC in $AllDCs)
{
	Foreach ($P in $Ports){
		$check=Test-NetConnection $DC -Port $P -WarningAction SilentlyContinue
		If ($check.tcpTestSucceeded -eq $true)
			{Write-Host $DC.name $P -ForegroundColor Green -Separator " => "}
		else
			{Write-Host $DC.name $P -Separator " => " -ForegroundColor Red}
	}
}

А это чуть модифицированная версия скрипта, в которой список серверов считывается из файла C:\Users\MiAl\Documents\list_servers.txt, а также выводятся имена хостов, чтобы было понятно, чьи именно порты проверяются:

$Ports  = "135","389","636","3268","53","88","445","3269", "80", "443"
$AllHosts = Get-Content C:\Users\MiAl\Documents\list_servers.txt
ForEach($Hosts in $AllHosts)
{
	$Hosts
	Foreach ($P in $Ports){
		$check=Test-NetConnection $Hosts -Port $P -WarningAction SilentlyContinue
		If ($check.tcpTestSucceeded -eq $true)
			{Write-Host $Hosts.name $P -ForegroundColor Green -Separator " => "}
		else
			{Write-Host $Hosts.name $P -Separator " => " -ForegroundColor Red}
	}
}

Код скрипта сохранён в файл port_checker.ps1, пример запуска:

C:\Users\MiAl\Documents\port_checker.ps1

Простой сканер IP-сетей/портов с помощью PowerShell

Вы также можете реализовать простой сетевой сканер портов и IP-подсетей для сканирования удалённых серверов или подсетей на предмет открытых/закрытых TCP-портов.

Просканируем диапазон IP-адресов в поисках открытого порта 80:

foreach ($ip in 100..150) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}

А этот пример просканирует диапазон TCP-портов от 1 до 1024 на указанном удалённом сервере:

foreach ($port in 1..1024) {If ((Test-NetConnection 192.168.0.88 -Port $port -WarningAction SilentlyContinue).tcpTestSucceeded -eq $true){ "TCP port $port is open!"}}

Скорость проверки, конечно, оставляет желать лучшего.

Test-NetConnection в Linux

На момент написания, в Linux командлет Test-NetConnection отсутствует

Но старый способ проверки открытых портов работает:

(New-Object System.Net.Sockets.TcpClient).Connect('suip.biz', 80)

Рекомендуется Вам:

Добавить комментарий

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