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
Это означает следующее:
- Перед проверкой порта командлет пытается выполнить пинг
- В данном случае компьютер не ответил на пинг (такое бывает — даже включенные компьютеры не обязаны отвечать на пинг, это можно изменить в настройках файервола)
- Даже при неудачном пинге 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)
Связанные статьи:
- Как в PowerShell просмотреть открытые порты. Как узнать, какая программа прослушивает порт (100%)
- Как в PowerShell просмотреть открытые порты UDP (72%)
- Использование PortQry для проверки открытых портов TCP/UDP (сканер портов) (64%)
- Как в PowerShell установить IP, маску сети, шлюз по умолчанию и DNS для сетевого интерфейса (58%)
- Как в PowerShell настроить сетевой интерфейс на использование динамичного IP адреса (DHCP) (58%)
- Как настроить Windows Server 2022 с помощью PowerShell (RANDOM - 8%)
Подскажите, что за атрибут IsAdmin, если можно — с примером использования.
Где вы это взяли? Может быть вы путаете с командлетом Test-IsAdmin?