# Проверьте, что отправляет ваш Mac, за 10 минут из терминала > Десятиминутный аудит только штатными средствами macOS: lsof, nettop, log stream, scutil --dns, dig, tcpdump — что каждый показывает и чего не покажет ни один из них. HisnLabs Security & Research Team · Published 2026-09-14 Canonical: https://hisnlabs.com/ru/blog/audit-mac-network-terminal Чтобы получить реальную, актуальную картину того, с кем разговаривает ваш Mac, не нужно ничего устанавливать. Каждый инструмент в этой подборке уже входит в состав macOS. Ни один из них не требует доверять свой трафик третьей стороне, а все шесть вместе, если знать команды, занимают около десяти минут. Чего они не сделают — и это важно — так это не скажут вам, какие из этих соединений в порядке, а какие нет: для этого всё равно нужен контекст, и в конце статьи мы честно скажем, где эти инструменты останавливаются. ## 1. lsof — все открытые соединения прямо сейчас В Unix сетевой сокет — это файл, а `lsof` (list open files) перечисляет открытые файлы. Man-страница macOS описывает флаг `-i` как выбор файлов, чей интернет-адрес соответствует заданной спецификации — если ничего не задано, выводятся все интернет-сокеты. Добавьте `-n`, чтобы не преобразовывать адреса в имена хостов, и `-P`, чтобы не преобразовывать порты в имена служб; оба флага делают команду быстрее, а вывод — точным, а не приблизительным. *Терминал — все открытые сетевые сокеты* ```console $ sudo lsof -i -n -P # example output, trimmed to a few representative lines COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Mail 612 alice 9u IPv4 0x... 0t0 TCP 192.168.1.10:54321->17.57.145.13:993 (ESTABLISHED) Slack 980 alice 22u IPv4 0x... 0t0 TCP 192.168.1.10:54400->35.186.224.25:443 (ESTABLISHED) mDNSResp 88 root 4u IPv4 0x... 0t0 UDP *:5353 ``` Читайте слева направо: имя процесса и PID, локальный адрес и порт, `->` и удалённый адрес и порт, и состояние соединения. `ESTABLISHED` означает активное, двустороннее соединение прямо сейчас. Без `sudo` вы всё равно увидите свои собственные процессы; для процессов, принадлежащих root, `sudo` нужен. Чего эта команда не покажет: `lsof` — это снимок того момента, когда вы нажали Enter. Соединение, которое открылось, передало несколько килобайт и закрылось за полсекунды до того, как вы запустили команду, просто не попадёт в список — чтобы это поймать, нужно запускать команду повторно или перейти к следующему инструменту. ## 2. nettop — тот же обзор, но в реальном времени nettop — это та же идея, но в реальном времени. Его man-страница описывает его как отображение «списка сокетов или маршрутов» с периодически обновляемой статистикой. `-m route` переключает вывод со списка сокетов на представление таблицы маршрутизации; `-m tcp` или `-m udp` ограничивают вывод одним протоколом. *Терминал — активные соединения, обновление каждую секунду* ```console $ nettop -m route # interactive; press q to quit, or use -l N to print N samples and exit # example output, trimmed time interface state bytes_in bytes_out 23:41:02.123 Mail.612 en0 Established 4.2K 1.1K 23:41:02.123 Slack.980 en0 Established 18.6K 6.4K ``` Добавьте `-l 5`, чтобы снять пять замеров и завершить работу вместо интерактивной сессии, — удобно, если вы хотите перенаправить вывод куда-то ещё. nettop решает проблему «снимка» у lsof: можно увидеть, как соединение появляется, передаёт данные и закрывается, — но у него тот же потолок: имя процесса и PID, ничего о том, кем подписан бинарный файл, и никакой памяти после закрытия терминала. ## 3. log stream — что сама система говорит о сети macOS ведёт единый структурированный журнал того, чем занимается каждый процесс, и `log stream` позволяет наблюдать за ним в реальном времени, с фильтрацией. Man-страница описывает `--predicate` как фильтрацию записей с помощью условий в стиле NSPredicate по подсистеме, категории, процессу и содержимому сообщения. *Терминал — потоковый вывод записей журнала, связанных с сетью* ```console $ log stream --predicate 'eventMessage contains "network" or subsystem == "com.apple.network"' --info # live stream; Ctrl-C to stop. Example line, trimmed: 2026-09-14 23:41:05.001 process=nesessionmanager subsystem=com.apple.network "TCP Connection ... state changed to Ready" ``` Это самый труднодоступный из шести инструментов — объём вывода огромен, а синтаксис predicate требует привыкания, — но это также единственный инструмент, который показывает изменения сетевого состояния на уровне системы и события жизненного цикла соединений в момент их появления, на (почти) понятном языке, с указанием ответственной подсистемы. Относитесь к нему как к тому, что нужно фильтровать через grep, а не читать построчно: пропустите вывод через `grep` по имени интересующего вас процесса или по ключевому слову вроде `"Wi-Fi"` или `"VPN"`. ## 4. scutil --dns и dig — что на самом деле разрешает ваш Mac Перед тем как произойдёт соединение, обычно выполняется DNS-запрос. `scutil --dns`, согласно его man-странице, «сообщает текущую конфигурацию DNS»: какие резолверы настроены, какой из них используется по умолчанию, а какие применяются только к определённым доменам (раздельный DNS, обычное явление на VPN). *Терминал — текущая конфигурация DNS-резолвера* ```console $ scutil --dns # example output, trimmed DNS configuration resolver #1 nameserver[0] : 192.168.1.1 if_index : 12 (en0) flags : Request A records, Request AAAA records reach : 0x00020002 (Reachable,Directly Reachable Address) ``` `dig` напрямую отвечает на один вопрос: во что прямо сейчас разрешается это имя. Его man-страница называет его «гибким инструментом для опроса DNS-серверов имён», ценимым за «гибкость, простоту использования и ясность вывода». *Терминал — разрешение одного имени хоста* ```console $ dig example.com +short # example output 93.184.216.34 ``` Ни один из этих инструментов не скажет, какое приложение вызвало запрос или что произошло дальше, — DNS даёт лишь адрес, к которому приложение собирается (или уже успело) подключиться; само соединение показывают lsof, nettop или журнал файрвола. ## 5. tcpdump — истина в последней инстанции, и единственный инструмент, которому нужен sudo Всё описанное выше читает состояние, которое операционная система уже хранит. `tcpdump` устроен иначе: он перехватывает пакеты прямо на интерфейсе, поэтому его собственная документация прямо говорит о требовании — «для чтения пакетов с сетевого интерфейса может потребоваться наличие особых привилегий» — на практике, в macOS это `sudo`. Используйте `-i`, чтобы выбрать интерфейс, `-n`, чтобы адреса оставались в числовом виде, и выражение-фильтр вроде `port 53`, чтобы выделить DNS-трафик: *Терминал — наблюдение за DNS-запросами, покидающими машину* ```console $ sudo tcpdump -i en0 -n port 53 # example output, trimmed 23:41:10.221331 IP 192.168.1.10.54812 > 192.168.1.1.53: 41213+ A? example.com. (30) 23:41:10.244109 IP 192.168.1.1.53 > 192.168.1.10.54812: 41213 1/0/0 A 93.184.216.34 (46) ``` > **Warning:** Эта команда требует повышенных привилегий, потому что читает пакеты прямо с сетевого интерфейса — тот же уровень доступа, который в принципе может перехватить куда больше, чем DNS, если расширить фильтр или вовсе его убрать. Держите фильтр узким, запускайте команду на короткое время и закрывайте терминал по окончании. Не оставляйте широкий, нефильтрованный перехват работать без присмотра. Обратите внимание на закономерность: запрос уходит на порт 53, и сразу же приходит ответ. Если запустить `dig` в одном терминале, пока в другом работает `tcpdump`, можно увидеть точный запрос и ответ, порождённые вашей же командой, — хороший способ действительно убедиться в том, что говорят man-страницы, а не просто принять это на веру. ## Бесплатный седьмой инструмент: Мониторинг системы Стоит назвать и единственный графический вариант в этом списке, ведь не всё требует терминала. Вкладка «Сеть» в Мониторинге системы показывает итоговые цифры — объём данных, отправленных и полученных каждым процессом, и график пропускной способности в реальном времени, — что отлично подходит для случая «что-то жуёт канал, и я не знаю что». Это также самая наглядная иллюстрация потолка, общего для всех инструментов этой статьи: он скажет вам, что вспомогательный процесс за ночь передал два гигабайта, но у него нет столбца, куда эти два гигабайта ушли. Объём и адресат — два разных вопроса, и macOS отвечает на них двумя разными инструментами. ## Собираем десять минут воедино 1. `sudo lsof -i -n -P` — получить текущий список открытых сокетов, один проход, тридцать секунд. 2. `nettop -m route -l 5` — снять несколько живых замеров, чтобы поймать то, что упустил снимок lsof. 3. `scutil --dns` — убедиться, каким резолвером вы пользуетесь на самом деле, особенно если вы на VPN или в публичной Wi-Fi-сети. 4. `dig <имя> +short` — для всего незнакомого из шага 1, чтобы увидеть, во что оно сейчас разрешается. 5. `sudo tcpdump -i en0 -n port 53`, в течение шестидесяти секунд, чтобы увидеть «сырой» DNS-трафик, пока приложения занимаются своими делами. 6. `log stream --predicate` с фильтрацией по ключевому слову — если что-то из предыдущих шагов подняло вопрос, на который первые пять не ответили. ## Разбор на примере Допустим, шаг 1 выявил процесс с именем `helperd`, у которого открыто соединение с незнакомым вам адресом. Не останавливайтесь на этом. Запустите `dig -x <адрес>` для обратного разрешения — оно не всегда даёт что-то читаемое, но когда даёт, имя хоста вроде `ads.example-cdn.net` скажет вам за пять секунд больше, чем голый IP-адрес когда-либо скажет. Запустите `nettop -m tcp -l 3` и посмотрите, остаётся ли то же соединение открытым спустя несколько секунд и действительно ли по нему идут байты или оно простаивает. Если оно простаивает и открывается заново через фиксированный интервал — это форма периодической проверки связи, а не разовой передачи данных: стоит это запомнить, но не обязательно сразу тревожиться, поскольку обычные проверки обновлений ведут себя точно так же. Затем проверьте `scutil --dns`, чтобы убедиться, что резолвер, выдавший адрес, к которому подключился `helperd`, был именно тем, которого вы ожидали, — особенно если вы в чужой Wi-Fi-сети. Пять команд, один процесс — и вы прошли путь от «я это не узнаю» до «вот что конкретно я знаю и чего не знаю об этом», а это и есть настоящая цель такого аудита, важнее, чем вердикт «хорошо» или «плохо». ## Чего не скажет ни один из этих инструментов Пройдите все шесть шагов — и всё равно останутся три реальных пробела. Во-первых, идентификация за пределами имени процесса: ничто здесь не проверяет, действительно ли бинарный файл с именем «Mail» — это Apple Mail, или же что-то переименовавшее себя, и подписан ли он вообще, — это отдельная проверка с помощью `codesign` и `spctl`. Во-вторых, память: как только окно терминала закрывается, вместе с ним исчезает всё, что вы узнали; журнала «к чему подключался мой Mac в прошлый вторник» не существует, если вы не создадите его сами. В-третьих, суждение: ни один из этих инструментов не имеет мнения о том, ожидаемо ли соединение. Приложение для заметок, подключающееся к адресу, к которому оно никогда раньше не обращалось, в `lsof` выглядит точно так же, как подключение к его обычному серверу синхронизации, — отличить одно от другого приходится либо вам самим, распознавая закономерности, либо инструменту, который должен делать это за вас. ## Какое место здесь занимают FireAI и HisnLabs Everything in this lab is free and built into macOS, and none of it names the process behind a connection or remembers it after the terminal closes — which is the specific, narrow gap FireAI’s per-app rules and connection history are built to close. FireAI — это собственный продукт HisnLabs: ИИ-файрвол, работающий прямо на вашем Mac. Он показывает простым языком каждое соединение, которое устанавливают ваши приложения, и позволяет вам решать, что покидает ваш Mac, — его ИИ работает локально, поэтому ваш трафик никогда не отправляется ни нам, ни кому-либо ещё. Команда исследователей безопасности HisnLabs — это те, кто поддерживает точность этих решений: они каталогизируют, какие домены являются обычной телеметрией, а какие — реальным сервисом, отслеживают страну и сеть, стоящие за соединением, и обучают локальную модель (функцию FireAI Pilot) на реальных шаблонах трафика — и ничего из этого не покидает ваш Mac. Вы можете прочитать о технических решениях, лежащих в его основе, или попробовать FireAI в течение 17 дней на странице [FireAI от HisnLabs](https://hisnlabs.com/fireai/ru/download). ## Sources - [SS64: lsof man page for macOS](https://ss64.com/mac/lsof.html) - [nettop(1) man page (Xcode man pages mirror)](https://keith.github.io/xcode-man-pages/nettop.1.html) - [log(1) man page (Xcode man pages mirror)](https://keith.github.io/xcode-man-pages/log.1.html) - [scutil(8) man page (Xcode man pages mirror)](https://keith.github.io/xcode-man-pages/scutil.8.html) - [dig(1) man page (Xcode man pages mirror)](https://keith.github.io/xcode-man-pages/dig.1.html) - [SS64: tcpdump man page for macOS](https://ss64.com/mac/tcpdump.html)