Компьютер вроде бы простаивает: ни одного скачивания, ни одной вкладки с видео, а индикатор сетевой активности всё равно мигает. Или интернет вдруг стал медленным, и никто не может объяснить, куда делась скорость. Первая мысль в такой ситуации - выяснить, какие именно программы сейчас разговаривают с внешним миром. Графических инструментов для этого хватает, но самый быстрый и прозрачный путь лежит через консоль. Встроенная утилита 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 легко найти в этом списке, и два источника сходятся в одной точке.

Накопленную статистику даёт система. В параметрах, в разделе сети и интернета, есть пункт использования данных: там по каждому приложению показан объём за последние тридцать дней. Это удобно, когда подозрение возникло не сегодня, а давно, и прямо сейчас ничего необычного не происходит. В Диспетчере задач на вкладке процессов есть столбец "Сеть", где виден текущий поток в мегабитах в секунду.

Что делать с найденным соединением и как закрыть программе доступ в сеть

Если в списке обнаружилась незнакомая программа, спешить с выводами не нужно. Сначала проверяется её происхождение: путь к файлу, цифровая подпись в свойствах файла, наличие в списке установленных приложений и в автозагрузке (вкладка "Автозагрузка" в Диспетчере задач). Если выяснилось, что программа нужная, но слишком разговорчивая, помогает правило в брандмауэре. Если же файл неизвестен и ничего полезного не делает, его удаляют через список приложений в параметрах.

Рабочий порядок действий обычно складывается из шести шагов:

  1. открыть консоль от имени администратора через Win+R с подтверждением по Ctrl+Shift+Enter;
  2. выполнить netstat -bno при простаивающем компьютере и сохранить результат в файл;
  3. выписать незнакомые программы вместе с их PID;
  4. проверить расположение файлов через Get-Process или Диспетчер задач;
  5. оценить объём трафика этих программ в Мониторе ресурсов;
  6. при необходимости завершить процесс и закрыть исходящий доступ правилом брандмауэра.

Завершить процесс по найденному 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 ничего не обвиняет и никого не разоблачает. Она добросовестно перечисляет, кто с кем сейчас соединён. Выводы делает человек, и от того, насколько внимательно прочитан список, зависит, найдётся ли среди участников разговора тот, кого здесь быть не должно. Привычка раз в пару месяцев сделать снимок на тихом компьютере и сравнить его с прошлым стоит нескольких минут.