PowerShell предоставляет мощные инструменты для проверки открытых портов и анализа сетевой доступности в Windows. Командлет Test-NetConnection позволяет тестировать доступность TCP-портов, проверять маршруты, выполнять ICMP-запросы (аналог ping) и заменяет такие утилиты, как ping, tracert, telnet и сканеры портов. В этой статье мы разберем, как использовать PowerShell для проверки открытых портов, анализа сетевых служб и создания простых сценариев мониторинга сети.
Проверка TCP-портов с помощью Test-NetConnection
Командлет Test-NetConnection предназначен для проверки доступности TCP-портов на удаленных или локальных хостах. Он не поддерживает тестирование UDP-портов, но идеально подходит для анализа TCP-соединений, таких как SMTP (порт 25), HTTP (порт 80), RDP (порт 3389) и других.
Пример проверки порта SMTP (TCP/25) на сервере:
Test-NetConnection -ComputerName msk-msg01 -Port 25
Сокращенная форма команды:
TNC msk-msg01 -Port 25
Результат команды включает:
— ComputerName: имя проверяемого сервера.
— RemoteAddress: IP-адрес сервера.
— RemotePort: проверяемый порт.
— PingSucceeded: результат ICMP-запроса (true — сервер отвечает на ping).
— TcpTestSucceeded: статус порта (true — порт открыт).
Пример результата:
ComputerName : msk-msg01
RemoteAddress : 10.10.1.7
RemotePort : 25
InterfaceAlias : CORP
SourceAddress : 10.10.1.70
PingSucceeded : True
PingReplyDetails : 0 ms
TcpTestSucceeded : True
Если PingSucceeded=False, но TcpTestSucceeded=True, это указывает, что ICMP-запросы (ping) заблокированы, но порт доступен. Для проверки подключения к интернету без указания параметров выполните:
Test-NetConnection
Эта команда тестирует доступность узла internetbeacon.msedge.net.
Детальная информация о порте
Для получения подробных данных добавьте параметр -InformationLevel Detailed:
TNC 192.168.31.102 -Port 3389 -InformationLevel Detailed
Это покажет расширенную информацию, включая интерфейс, маршруты и задержки.
Проверка популярных служб
Для проверки стандартных служб Windows используйте параметр -CommonTCPPort. Например, для HTTP (порт 80):
Test-NetConnection -ComputerName winitpro.ru -CommonTCPPort HTTP
Или для RDP (порт 3389):
Test-NetConnection msk-rds01 -CommonTCPPort RDP
Для вывода всех свойств командлета:
Test-NetConnection msk-man01 -Port 445 | Format-List *
Для лаконичного результата (только true/false) используйте:
TNC msk-msg01 -Port 25 -InformationLevel Quiet
Альтернатива для старых версий PowerShell
В версиях PowerShell до 4.0 используйте объект System.Net.Sockets.TcpClient:
(New-Object System.Net.Sockets.TcpClient).Connect('msk-msg01', 25)
Трассировка маршрута с Test-NetConnection
Командлет поддерживает трассировку маршрута (аналог tracert) с параметром -TraceRoute:
Test-NetConnection msk-man01 -TraceRoute
Результат включает задержку (RTT) и список IP-адресов маршрутизаторов. Для ограничения числа хопов добавьте параметр -Hops:
Test-NetConnection msk-man01 -TraceRoute -Hops 10
Проверка портов на нескольких хостах
Для проверки порта на нескольких компьютерах создайте текстовый файл servers.txt со списком IP-адресов или имен хостов. Пример проверки порта TCP/25:
Get-Content C:\PS\servers.txt | Where-Object { -NOT (Test-NetConnection $_ -Port 25 -InformationLevel Quiet) } | Format-Table -AutoSize
Этот скрипт выведет хосты, где порт 25 закрыт или недоступен.
Мониторинг служб на контроллерах домена
Для проверки ключевых служб Active Directory (AD) на всех контроллерах домена выполните скрипт, который тестирует порты, такие как RPC (135), LDAP (389, 3268), DNS (53), Kerberos (88) и SMB (445):
$Ports = "135", "389", "636", "3268", "53", "88", "445", "3269", "80", "443"
$AllDCs = Get-ADDomainController -Filter * | Select-Object Hostname, Ipv4Address
ForEach ($DC in $AllDCs) {
ForEach ($P in $Ports) {
$check = Test-NetConnection $DC.Ipv4Address -Port $P -WarningAction SilentlyContinue
If ($check.TcpTestSucceeded -eq $true) {
Write-Host $DC.Hostname $P -ForegroundColor Green -Separator " => "
} else {
Write-Host $DC.Hostname $P -ForegroundColor Red -Separator " => "
}
}
}
Этот скрипт проверяет указанные порты на всех контроллерах домена, выделяя доступные порты зеленым цветом, а недоступные — красным. Для автоматизации мониторинга скрипт можно настроить как службу Windows.
Сканирование IP-диапазона или портов
PowerShell позволяет создать простой IP-сканер для проверки портов в подсети или диапазона портов на одном хосте.
Сканирование диапазона IP-адресов
Для проверки порта 3389 в диапазоне IP-адресов (например, 10.10.10.5–10.10.10.30):
ForEach ($ip in 5..30) { Test-NetConnection -Port 3389 -InformationLevel Detailed "10.10.10.$ip" }
Сканирование диапазона портов
Для проверки портов 1–1024 на одном сервере:
ForEach ($port in 1..1024) {
If ((Test-NetConnection srvfs01 -Port $port -WarningAction SilentlyContinue).TcpTestSucceeded -eq $true) {
"TCP port $port is open!"
}
}
Просмотр открытых портов на локальном компьютере
Для получения списка открытых портов на локальном компьютере используйте командлет Get-NetTCPConnection (аналог netstat):
Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort | Sort-Object -Property LocalPort | Format-Table
Чтобы узнать, какой процесс использует определенный порт (например, 443):
Get-Process -Id (Get-NetTCPConnection -LocalPort 443).OwningProcess | Format-Table Id, ProcessName, UserName, Path
Рекомендации по использованию
— Используйте параметр -InformationLevel Quiet для автоматизированных скриптов, где нужен только результат (true/false).
— Для мониторинга критических служб настройте запуск скриптов через Планировщик задач Windows или как службу.
— При сканировании больших диапазонов IP или портов добавляйте -WarningAction SilentlyContinue для подавления предупреждений.
— Убедитесь, что Windows Firewall или сторонние брандмауэры не блокируют тестируемые порты.
PowerShell с командлетом Test-NetConnection предоставляет гибкий и мощный инструмент для проверки открытых портов, диагностики сетевых подключений и мониторинга служб. От простых проверок TCP-портов до сложных сценариев сканирования подсетей и контроллеров домена — PowerShell позволяет администраторам эффективно управлять сетевой безопасностью и доступностью. Регулярное использование этих команд поможет выявить проблемы с доступностью служб и повысить надежность инфраструктуры.