Как определить, какой процесс слушает определенный TCP или UDP порт в Windows?
Вы можете определить, какой процесс прослушивает определенный TCP или UDP порт в Windows с помощью нескольких методов, включая традиционную команду netstat с фильтрацией, современные командлеты PowerShell, такие как Get-NetTCPConnection и Get-NetUDPEndpoint, или путем комбинации этих инструментов с tasklist для получения подробной информации о процессе. Наиболее эффективный подход зависит от версии Windows и вашего знакомства с инструментами командной строки, при этом PowerShell обычно предлагает более структурированные и удобные для фильтрации результаты.
Содержание
- Использование команды netstat
- Использование командлетов PowerShell
- Использование Tasklist с идентификаторами процессов
- Скрипты PowerShell и продвинутые методы
- Советы по устранению неполадок
- Лучшие практики
Использование команды netstat
Традиционная команда netstat доступна в Windows уже несколько десятилетий и остается надежным методом для определения процессов, прослушивающих порты. Чтобы найти, какой процесс прослушивает определенный порт, можно использовать следующие команды:
Базовый netstat с PID
netstat -aon | findstr ":80"
Эта команда показывает все подключения, связанные с портом 80, включая идентификатор процесса (PID) в последнем столбце. Параметр -a показывает все подключения, -o - идентификатор процесса, а -n - адреса в числовом формате.
Фильтрация прослушиваемых портов
netstat -aon | findstr "LISTENING" | findstr ":80"
Для совместимости с PowerShell v2.0 нужно добавить пробел после критерия поиска:
netstat -aon | find /i "listening" | find "1234 "
Полный вывод netstat
Команда netstat -aon отображает comprehensive список всех активных TCP-подключений, включая:
- Тип протокола (TCP/UDP)
- Локальный адрес и порт
- Внешний адрес и порт
- Состояние (Установлено, Прослушивается и т.д.)
- Идентификатор процесса (PID)
Примечание: Формат вывода netstat может незначительно отличаться между версиями Windows, но PID всегда отображается в последнем столбце при использовании параметра
-o.
Использование командлетов PowerShell
PowerShell предоставляет более современные и структурированные подходы для определения прослушивающих процессов. В операционной системе Windows включены специализированные командлеты для этой цели.
Get-NetTCPConnection для TCP-портов
Для TCP-портов используйте командлет Get-NetTCPConnection:
# Получить все прослушиваемые TCP-подключения
Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess
# Получить процесс, прослушивающий определенный порт
Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess
Get-NetUDPEndpoint для UDP-портов
Для UDP-портов используйте командлет Get-NetUDPEndpoint:
# Получить все UDP-конечные точки
Get-NetUDPEndpoint | Select-Object -Property LocalAddress, LocalPort, CreationTime, OwningProcess
# Получить процесс, прослушивающий определенный UDP-порт
Get-Process -Id (Get-NetUDPEndpoint -LocalPort 53).OwningProcess
Расширенная фильтрация в PowerShell
Вы можете создавать более комплексные запросы:
# Получить TCP-подключения с именами процессов
Get-NetTCPConnection -State Listen |
Select-Object LocalAddress, LocalPort, State, OwningProcess,
@{Name="ProcessName"; Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}
# То же самое для UDP
Get-NetUDPEndpoint |
Select-Object LocalAddress, LocalPort, CreationTime, OwningProcess,
@{Name="ProcessName"; Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}
Примечание: Согласно документации Microsoft Learn,
Get-NetTCPConnectionподдерживает различные параметры, включая-LocalPort,-State,-RemoteAddressи-OwningProcessдля точной фильтрации.
Использование Tasklist с идентификаторами процессов
После определения идентификатора процесса из netstat или командлетов PowerShell можно использовать tasklist для получения подробной информации о процессе:
Базовое использование tasklist
tasklist /fi "pid eq 16876"
Отображение всех процессов с PID
tasklist /v
Подход PowerShell с деталями процесса
# Получить детали процесса после нахождения PID
$tcpConnection = Get-NetTCPConnection -LocalPort 80
$process = Get-Process -Id $tcpConnection.OwningProcess
$process | Select-Object ProcessName, Id, Path, CPU, WorkingSet
Полная информация о процессе
# Комплексная информация о процессе для прослушиваемых портов
Get-NetTCPConnection -State Listen | ForEach-Object {
$process = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
[PSCustomObject]@{
LocalPort = $_.LocalPort
LocalAddress = $_.LocalAddress
ProcessName = $process.ProcessName
PID = $_.OwningProcess
Path = $process.Path
CPU = $process.CPU
Memory = $process.WorkingSet
}
}
Скрипты PowerShell и продвинутые методы
Для более сложных сценариев можно создавать скрипты PowerShell, которые комбинируют эти методы для получения лучших результатов.
Скрипт полного мониторинга портов
function Get-ListeningProcess {
param(
[Parameter()]
[ValidateSet("TCP", "UDP", "Both")]
[string]$Protocol = "Both",
[Parameter()]
[int]$Port
)
$results = @()
if ($Protocol -eq "TCP" -or $Protocol -eq "Both") {
$tcpConnections = Get-NetTCPConnection -State Listen
if ($Port) {
$tcpConnections = $tcpConnections | Where-Object { $_.LocalPort -eq $Port }
}
foreach ($connection in $tcpConnections) {
$process = Get-Process -Id $connection.OwningProcess -ErrorAction SilentlyContinue
$results += [PSCustomObject]@{
Protocol = "TCP"
LocalPort = $connection.LocalPort
LocalAddress = $connection.LocalAddress
ProcessName = $process.ProcessName
PID = $connection.OwningProcess
Path = $process.Path
StartTime = $process.StartTime
}
}
}
if ($Protocol -eq "UDP" -or $Protocol -eq "Both") {
$udpEndpoints = Get-NetUDPEndpoint
if ($Port) {
$udpEndpoints = $udpEndpoints | Where-Object { $_.LocalPort -eq $Port }
}
foreach ($endpoint in $udpEndpoints) {
$process = Get-Process -Id $endpoint.OwningProcess -ErrorAction SilentlyContinue
$results += [PSCustomObject]@{
Protocol = "UDP"
LocalPort = $endpoint.LocalPort
LocalAddress = $endpoint.LocalAddress
ProcessName = $process.ProcessName
PID = $endpoint.OwningProcess
Path = $process.Path
StartTime = $process.StartTime
}
}
}
return $results | Sort-Object LocalPort
}
# Примеры использования:
# Get-ListeningProcess -Protocol TCP -Port 80
# Get-ListeningProcess -Protocol UDP
# Get-ListeningProcess
Однострочник для быстрой идентификации
# Быстрый способ увидеть, что прослушивается на порту 80
Get-NetTCPConnection -LocalPort 80 | Select-Object LocalPort, LocalAddress, OwningProcess | ForEach-Object {
$process = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
$_ | Add-Member -MemberType NoteProperty -Name ProcessName -Value $process.ProcessName -PassThru
}
Расширенная фильтрация по имени процесса
# Найти все прослушиваемые порты для определенного процесса
$processName = "node"
Get-Process -Name $processName | ForEach-Object {
$tcpPorts = Get-NetTCPConnection -State Listen -OwningProcess $_.Id
$udpPorts = Get-NetUDPEndpoint -OwningProcess $_.Id
foreach ($port in $tcpPorts) {
[PSCustomObject]@{
Process = $_.ProcessName
PID = $_.Id
Protocol = "TCP"
Port = $port.LocalPort
Address = $port.LocalAddress
}
}
foreach ($port in $udpPorts) {
[PSCustomObject]@{
Process = $_.ProcessName
PID = $_.Id
Protocol = "UDP"
Port = $port.LocalPort
Address = $port.LocalAddress
}
}
}
Советы по устранению неполадок
Распространенные проблемы и решения
Проблемы с разрешениями: Некоторые процессы могут требовать повышенных привилегий для просмотра их сетевых подключений. Всегда выполняйте команды от имени администратора.
Процесс не найден: Если PID отображается в netstat, но Get-Process не работает, процесс мог завершиться между командами. Используйте -ErrorAction SilentlyContinue для корректной обработки этой ситуации.
Конфликты портов: Несколько процессов могут пытаться привязаться к одному и тому же порту. Windows обычно разрешает это только в том случае, если адреса различаются (например, 127.0.0.1 против 0.0.0.0).
IPv6 против IPv4: Некоторые процессы могут прослушивать как IPv4, так и IPv6 адреса. Проверяйте наличие как 0.0.0.0, так и :: в поле локального адреса.
Проверка доступности порта
После определения прослушивающего процесса можно проверить доступность порта:
telnet localhost 80
Или в PowerShell:
Test-NetConnection -ComputerName localhost -Port 80
Мониторинг изменений портов
Для мониторинга изменений портов в реальном времени:
# Мониторинг TCP-подключений в реальном времени
Get-NetTCPConnection -State Listen | Select-Object LocalPort, LocalAddress, OwningProcess |
Format-Table -AutoSize -Wrap
# Мониторинг каждые 5 секунд
while ($true) {
Clear-Host
Get-NetTCPConnection -State Listen | Sort-Object LocalPort | Format-Table -AutoSize
Start-Sleep -Seconds 5
}
Лучшие практики
Соображения безопасности
- Регулярный мониторинг: Регулярно проверяйте непредвиденные прослушиваемые порты на критических системах
- Проверка процессов: Всегда проверяйте, что процессы, прослушивающие чувствительные порты, являются легитимными
- Минимальные привилегии: Запускайте инструменты мониторинга с минимально необходимыми привилегиями
- Ведение журналов: Рассмотрите возможность ведения журнала информации о портах для аудита безопасности
Оптимизация производительности
- Конкретные запросы: Всегда фильтруйте по порту или протоколу, когда это возможно, для сокращения объема вывода
- Пакетная обработка: Используйте возможности конвейера PowerShell для эффективной обработки
- Обработка ошибок: Реализуйте правильную обработку ошибок для надежных скриптов
- Планирование: Используйте планировщик задач для регулярного мониторинга портов
Совместимость между версиями
- netstat против PowerShell: Используйте
netstatдля старых версий Windows (до Windows 8/Server 2012) - Версия PowerShell: Современные командлеты PowerShell требуют Windows 8/Server 2012 или более поздние версии
- Резервные методы: Всегда имейте резервные методы для разных версий Windows
Документирование и отчетность
- Документация скриптов: Тщательно комментируйте ваши скрипты PowerShell
- Форматирование вывода: Используйте единообразное форматирование для удобного чтения
- Системы оповещений: Рассмотрите интеграцию с системами мониторинга для критических портов
- Исторический анализ: Сохраняйте журналы для анализа паттернов использования портов со временем
Заключение
Определение процессов, прослушивающих определенные TCP или UDP порты в Windows, можно выполнить с помощью нескольких эффективных методов. Традиционная команда netstat остается надежной для быстрых проверок, в то время как командлеты PowerShell, такие как Get-NetTCPConnection и Get-NetUDPEndpoint, предлагают более структурированные и удобные для фильтрации результаты. Для комплексного анализа комбинация этих инструментов с tasklist или пользовательскими скриптами PowerShell предоставляет наиболее подробную информацию о прослушивающих процессах.
Для получения оптимальных результатов используйте командлеты PowerShell на современных системах Windows благодаря их превосходным возможностям фильтрации, сохраняя netstat в качестве резервного варианта для совместимости. Всегда учитывайте возможность выполнения команд с повышенными привилегиями и реализуйте правильную обработку ошибок для надежных решений мониторинга портов.
Регулярный мониторинг портов должен быть частью лучших практик администрирования систем для обеспечения безопасности и оптимальной производительности, помогая быстро выявлять несанкционированную сетевую активность или проблемы конфигурации, которые могут повлиять на стабильность системы.
Источники
-
Stack Overflow - Как определить, какой процесс прослушивает TCP или UDP порт в Windows?
-
Windows OS Hub - Как узнать, какая программа прослушивает определенный порт в Windows
-
CloudHadoop - Как найти идентификатор процесса и имя, прослушивающие TCP/UDP порты в Windows
-
Medium - Определение процесса Windows, использующего определенный TCP или UDP порт
-
TechnoFossy - Идентификация процессов, использующих определенные TCP/UDP порты в Windows
-
TempMail - Определение процесса Windows, использующего определенный TCP или UDP порт