Компьютер вроде бы простаивает: ни одного скачивания, ни одной вкладки с видео, а индикатор сетевой активности всё равно мигает. Или интернет вдруг стал медленным, и никто не может объяснить, куда делась скорость. Первая мысль в такой ситуации - выяснить, какие именно программы сейчас разговаривают с внешним миром. Графических инструментов для этого хватает, но самый быстрый и прозрачный путь лежит через консоль. Встроенная утилита netstat с ключом b выводит обычный текстовый список: какое соединение открыто, куда оно ведёт и какая программа его создала. Список можно прочитать глазами, сохранить в файл и сравнить с тем, что было час назад. Правда, у метода есть границы, и о них лучше знать заранее, чтобы не ждать от него больше, чем он умеет.
Что именно показывает netstat с ключом b и чего он принципиально не умеет
Утилита netstat живёт в Windows с давних времён. Она показывает активные TCP-соединения, порты, которые компьютер прослушивает, статистику сетевого адаптера, таблицу маршрутизации и сводки по протоколам. Ключ b появился позже, в Windows XP с пакетом обновления SP2, и стал любимым инструментом тех, кто хочет связать сетевую активность с конкретными программами. Он выводит исполняемый файл, который создал соединение или открыл прослушиваемый порт.
Бывает, что внутри одной программы работает сразу несколько независимых компонентов. Тогда выводится целая цепочка: имя исполняемого файла стоит в квадратных скобках внизу, над ним название компонента, который этот файл вызвал, и так далее вверх, до самого сетевого стека TCP/IP.
Теперь о границах. Команда отвечает на вопрос "кто держит соединение", но молчит на вопрос "сколько данных через него прошло". Колонки с объёмом трафика в выводе нет. Нет и пометки, куда течёт поток: к компьютеру или от него. Программа с открытым соединением может в этот самый момент скачивать файл, а может просто ждать команды и не передавать ни байта. Поэтому правильнее считать утилиту подробным списком участников разговора, а не счётчиком скорости. Именно здесь чаще всего ошибаются: по длинному списку соединений делают выводы о нагрузке на канал, хотя список о нагрузке ничего не знает. Инструменты для объёмов разобраны чуть ниже.
Как правильно запустить команду от имени администратора и ускорить её работу ключом n
Без прав администратора ключ b отказывается работать: утилита сообщает, что запрошенная операция требует повышения прав. Консоль с нужными правами открывается так: Win+R, ввод cmd и подтверждение сочетанием Ctrl+Shift+Enter вместо обычного Enter. Подойдёт и меню на Win+X, где есть пункт с терминалом или PowerShell от имени администратора. В заголовке окна при этом появится слово "Администратор".
В голом виде команда выглядит так: netstat -b. Но запускать её без дополнительных ключей редко имеет смысл. Работает она медленно. Для каждого соединения нужно определить владельца, а для каждого адреса попытаться выяснить имя узла через службу имён. В описании ключа прямо сказано, что операция может занять много времени. Первое ускорение - ключ n: адреса и порты выводятся числами, без запросов имён. Вместо слова https в столбце появится 443, вместо имени сервера - IP-адрес. Второе - ключ o, который добавляет номер процесса, PID. В современных версиях Windows при одном ключе b этого столбца нет, а он пригодится в дальнейшем. Рабочая команда складывается из трёх букв:
netstat -bno
Порядок ключей не важен: вариант netstat -nob даст тот же результат. Если интересует только TCP, добавляется ключ -p tcp. Если нужны ещё и порты, которые компьютер просто прослушивает в ожидании чужих обращений, добавляется ключ a. Ключ f выводит полные доменные имена внешних адресов. Он удобен, но замедляет работу, поэтому для быстрой проверки обычно не используется.
Как читать вывод, столбцы, состояния соединений и квадратные скобки с названием программы
Типичный фрагмент выглядит примерно так (адреса здесь условные, взятые из диапазонов, зарезервированных для примеров):
Активные подключения
Имя Локальный адрес Внешний адрес Состояние PID
TCP 192.168.1.5:50234 203.0.113.10:443 ESTABLISHED 4120
[msedge.exe]
TCP 192.168.1.5:50261 198.51.100.7:443 ESTABLISHED 7388
[OneDrive.exe]
TCP 192.168.1.5:50410 203.0.113.25:443 ESTABLISHED 1560
CDPSvc
[svchost.exe]
TCP 192.168.1.5:50302 192.0.2.44:80 SYN_SENT 9120
[updater.exe]
Первый столбец - протокол. Второй - локальный адрес и порт: адрес самого компьютера в домашней сети и номер порта, который система выдала программе. Третий - внешний адрес и порт, то есть то, к чему программа подключилась. Четвёртый - состояние. Пятый - номер процесса. Под каждой строкой в квадратных скобках стоит имя программы, а в третьем примере над скобками виден ещё и компонент: за общим процессом svchost.exe скрывается конкретная служба, которая и устроила соединение.
Одна подсказка помогает с первого взгляда понять направление. Порты выше 49152 система по умолчанию выдаёт исходящим соединениям. Если в локальном адресе такой порт, а во внешнем 443 или 80, значит, программа сама пошла в сеть. Если же порт низкий, вроде 135 или 445, а состояние LISTENING, программа ждёт, пока к ней обратятся. Адреса 127.0.0.1 и ::1 означают разговор компьютера с самим собой, интернет здесь ни при чём. Адреса вида 192.168.x.x и 10.x.x.x принадлежат домашней или рабочей сети.
Состояний встречается несколько. ESTABLISHED означает живое установленное соединение. SYN_SENT говорит о попытке подключиться, которая пока не завершилась. TIME_WAIT - соединение только что закрыто, и система ещё немного держит запись о нём. CLOSE_WAIT - удалённая сторона уже завершила разговор, а локальная программа ещё не закрыла свой конец. Если в этом состоянии зависло много соединений, виновата обычно неаккуратная программа, а не сеть.
Иногда вместо имени программы стоит сообщение о невозможности получить сведения о владельце. Чаще всего это системные соединения, чьих хозяев утилита видеть не может, и паниковать из-за одной такой строки не стоит.
Сохранение результатов в файл и повторный опрос через заданные промежутки времени
Одиночный снимок легко пропустит короткое соединение: программа подключилась на секунду, передала немного и закрыла сокет, а на момент запуска команды её уже нет. Поэтому для наблюдений используется интервал. Вызов netstat -bno 5 повторяет вывод каждые пять секунд, пока не будет нажато Ctrl+C.
Чтобы результат не улетел за верхний край экрана, его перенаправляют в файл:
netstat -bno 5 > "%USERPROFILE%\Desktop\netlog.txt"
Знак > перезаписывает файл при каждом запуске, а знаки >> дописывают в конец. Остановка по Ctrl+C сохраняет всё, что успело накопиться.
Есть и вариант для пакетного файла, который делает сто снимков с паузой в пять секунд:
for /L %%X in (1,1,100) do (netstat -bno >> "%USERPROFILE%\connections.txt" & timeout /t 5 /nobreak >nul)
Сто снимков по пять секунд - это 500 секунд, чуть больше восьми минут наблюдения. Этого хватает, чтобы поймать большинство периодических обращений за обновлениями.
Разбирать накопленный файл проще всего в два приёма. Команда findstr /c:"[" "%USERPROFILE%\connections.txt" | sort оставит только строки с названиями программ и расставит их по алфавиту. Одинаковые имена пойдут подряд, и сразу станет ясно, кто чаще всех появлялся в списке. Лучше делать снимок на "тихом" компьютере: закрыть браузер, остановить загрузки и дать системе минуту успокоиться. Тогда всё, что осталось в списке, работает по своей инициативе.
Как связать PID с программой, проверить расположение файла и оценить подозрительность соединения
Имя программы в скобках - только первый шаг. Следующий вопрос: что это за файл и где он лежит. Номер процесса из столбца PID позволяет ответить быстро. Команда tasklist /fi "pid eq 7388" покажет имя образа и объём памяти. В PowerShell можно получить ещё и полный путь:
Get-Process -Id 7388 | Select-Object Name, Path
Тот же путь виден в Диспетчере задач: на вкладке "Подробности" включается столбец PID, а контекстное меню процесса содержит пункт открытия расположения файла.
Для тех, кому удобнее сразу получить компактный список, в PowerShell есть отдельный командлет:
Get-NetTCPConnection -State Established | ForEach-Object {
$p = Get-Process -Id $_.OwningProcess
"$($p.Name) $($_.RemoteAddress):$($_.RemotePort)"
}
Права администратора ему не нужны. В выводе будет пара "программа и внешний адрес", правда, без цепочки компонентов, как у ключа b.
Остаётся научиться отличать обычное от странного. Настораживают несколько признаков: системное имя вроде svchost.exe у файла, лежащего не в папке System32; программа из временной папки или из каталога AppData, которая постоянно держит соединение с незнакомым адресом; приложение, которому сеть вообще не нужна, например Блокнот или Калькулятор, с состоянием ESTABLISHED; десятки соединений с разными адресами одновременно.
Одновременно нужна и трезвость. Обновления системы, облачная синхронизация, антивирус, почтовый клиент, служебные отчёты программ - всё это нормальные обитатели списка. Незнакомый внешний адрес сам по себе ничего не доказывает: крупные сервисы раздают контент через сети с сотнями адресов, у которых нет ничего общего с названием программы. Помогает команда nslookup 203.0.113.10: чаще всего она возвращает имя провайдера или сервиса, и картина проясняется.
Как узнать реальный объём трафика, когда netstat перечисляет только участников
Для ответа на вопрос "сколько" существуют другие инструменты, и вместе с netstat они дают полную картину: первый называет участников, вторые считают байты.
Самый простой счётчик встроен в ту же утилиту. Команда netstat -e выводит статистику сетевого адаптера: в строке байтов две цифры, принято и отправлено с момента запуска системы. Единственный вывод мало что говорит, зато разность двух замеров превращается в скорость. Пусть за минуту счётчик принятых байтов вырос на 120 000 000. Тогда средняя скорость около 2 000 000 байт в секунду, то есть примерно 2 МБ/с, или 16 Мбит/с. Если компьютер при этом "простаивает", значит, кто-то активно тянет данные, и самое время сверяться со списком из netstat.
Сразу по программам объём показывает Монитор ресурсов. Он запускается через Win+R командой resmon, вкладка "Сеть". В таблице процессов с сетевой активностью видны столбцы отправленных и принятых байтов в секунду, а ниже есть отдельный список TCP-подключений. Отметка рядом с процессом оставляет в нижних таблицах только его соединения. Тот самый PID из netstat легко найти в этом списке, и два источника сходятся в одной точке.
Накопленную статистику даёт система. В параметрах, в разделе сети и интернета, есть пункт использования данных: там по каждому приложению показан объём за последние тридцать дней. Это удобно, когда подозрение возникло не сегодня, а давно, и прямо сейчас ничего необычного не происходит. В Диспетчере задач на вкладке процессов есть столбец "Сеть", где виден текущий поток в мегабитах в секунду.
Что делать с найденным соединением и как закрыть программе доступ в сеть
Если в списке обнаружилась незнакомая программа, спешить с выводами не нужно. Сначала проверяется её происхождение: путь к файлу, цифровая подпись в свойствах файла, наличие в списке установленных приложений и в автозагрузке (вкладка "Автозагрузка" в Диспетчере задач). Если выяснилось, что программа нужная, но слишком разговорчивая, помогает правило в брандмауэре. Если же файл неизвестен и ничего полезного не делает, его удаляют через список приложений в параметрах.
Рабочий порядок действий обычно складывается из шести шагов:
- открыть консоль от имени администратора через Win+R с подтверждением по Ctrl+Shift+Enter;
- выполнить netstat -bno при простаивающем компьютере и сохранить результат в файл;
- выписать незнакомые программы вместе с их PID;
- проверить расположение файлов через Get-Process или Диспетчер задач;
- оценить объём трафика этих программ в Мониторе ресурсов;
- при необходимости завершить процесс и закрыть исходящий доступ правилом брандмауэра.
Завершить процесс по найденному PID помогает команда taskkill /pid 7388, а при отсутствии реакции к ней добавляется ключ /f. Закрыть программе дорогу в сеть можно одной строкой в консоли администратора:
netsh advfirewall firewall add rule name="BlockUpdater" dir=out action=block program="C:\Users\Name\AppData\Local\Temp\updater.exe"
Параметр dir=out означает исходящее направление, action=block - запрет, а в program указывается полный путь к файлу. Убрать правило можно командой netsh advfirewall firewall delete rule name="BlockUpdater". Блокировать стоит только то, в чём уверен. Закрытый доступ для svchost.exe или других системных процессов оставит без обновлений, без разрешения имён, а порой и вовсе без интернета, и найти причину потом будет непросто.
Утилита netstat ничего не обвиняет и никого не разоблачает. Она добросовестно перечисляет, кто с кем сейчас соединён. Выводы делает человек, и от того, насколько внимательно прочитан список, зависит, найдётся ли среди участников разговора тот, кого здесь быть не должно. Привычка раз в пару месяцев сделать снимок на тихом компьютере и сравнить его с прошлым стоит нескольких минут.