Введение / Зачем это нужно
Понимание, какие сетевые порты открыты на вашем Mac, критически важно для:
- Диагностики сетевых проблем: Почему приложение не может подключиться? Возможно, порт занят.
- Безопасности: Обнаружение неавторизованных служб, которые могут слушать сеть.
- Разработки: Проверка, что ваш веб-сервер (например, на порту 3000 или 8000) действительно запущен и доступен.
- Администрирования: Управление брандмауэром и настройкой правил доступа.
После выполнения этого гайда вы сможете быстро получить точный список активных сетевых соединений и процессов, их использующих.
Требования / Подготовка
- macOS (актуальная версия, инструкция проверена на Monterey, Ventura, Sonoma).
- Доступ к Терминалу (Terminal) в папке
Программы/Утилитыили через Spotlight (Cmd+Пробел, введитеTerminal). - Базовые навыки работы с командной строкой (ввод команд, понимание вывода).
- Для некоторых команд требуются права администратора (пароль пользователя при запросе
sudo). - (Опционально) Установленный Homebrew для установки
nmap.
Пошаговая инструкция
Шаг 1: Использование команды lsof (рекомендуемый способ)
lsof (list open files) — мощнейшая утилита, показывающая все открытые файлы, включая сетевые сокеты. Это самый информативный способ.
Откройте Терминал и выполните команду:
sudo lsof -i -P | grep LISTEN
Что делает команда:
sudo— запрашивает права суперпользователя, чтобы видеть системные процессы.lsof -i— фильтрует вывод только по сетевым соединениям.-P— показывает номера портов в числовом виде (например,:80вместо:http), что удобнее для точности.| grep LISTEN— оставляет только строки, где состояние сокетаLISTEN(порт открыт и ожидает подключений).
Пример вывода:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Python 1234 user 3u IPv4 0xabc 0t0 TCP *:8080 (LISTEN)
nginx 5678 root 6u IPv6 0xdef 0t0 TCP *:80 (LISTEN)
Здесь видно, что Python-процесс (PID 1234) слушает порт 8080, а nginx (PID 5678) — порт 80.
Шаг 2: Фильтрация по протоколу и конкретному порту
Часто нужно искать не все порты, а только TCP или UDP, или конкретный сервис.
Показать все TCP-порты (LISTEN и установленные соединения):
sudo lsof -i tcp
Показать все UDP-порты:
sudo lsof -i udp
Проверить, открыт ли конкретный порт (например, 3306 для MySQL):
sudo lsof -i :3306
Если порт занят, вы увидите процесс. Если вывод пуст — порт свободен для прослушивания на локальном интерфейсе. Это не означает, что удалённый хост не слушает этот порт.
Показать соединения, установленные извне (например, ваш Mac подключился к удалённому серверу):
lsof -i -a -p <PID_вашего_приложения>
Замените <PID_вашего_приложения> на идентификатор процесса.
Шаг 3: Альтернативный способ — команда netstat
netstat показывает статистику по сетевым интерфейсам, таблицы маршрутизации и, что нас интересует, список сокетов.
Показать все слушающие TCP-порты (без имён процессов):
netstat -an | grep LISTEN
-a — все сокеты, -n — числовой вывод (не преобразовывать порты в имена сервисов).
Чтобы увидеть процесс вместе с портом, netstat на macOS по умолчанию этого не показывает. Лучше использовать lsof из шага 1.
Шаг 4: Расширенный анализ с помощью nmap
nmap — это сетевой сканер, который может проводить более глубокий анализ открытых портов, определять версии служб и ОС.
- Установите nmap (если ещё не установлен):
brew install nmap - Просканируйте локальный хост (localhost):
nmap -sT -O localhost-sT— сканирование полным соединением (TCP connect scan), более медленное, но не требует специальных прав.-O— попытка определить операционную систему.localhost— сканируем свой компьютер. Для сканирования другого хоста укажите его IP.
Результат будет содержать список открытых портов, их состояние (open, closed, filtered) и, если удалось, имя службы.
Шаг 5: Графический способ — Activity Monitor
Если предпочитаете GUI:
- Откройте Activity Monitor (Монитор активности) через
Программы/Утилитыили Spotlight. - Перейдите на вкладку Сеть (Network).
- Внизу окна нажмите кнопку Открытые порты (Open Ports).
- Появится таблица с портами, протоколом (TCP/UDP) и именем процесса.
Недостаток: этот способ не показывает все детали (например, конкретный IP-адрес, к которому открыт порт), и список может обновляться не в реальном времени.
Проверка результата
После выполнения шагов вы должны получить:
- Список процессов (имена, PID), которые слушают сетевые порты.
- Номера портов и протоколы (TCP/UDP).
- Тип адреса (
*:— все интерфейсы,127.0.0.1:— только localhost).
Пример корректного результата для веб-разработчика:
Вы видите в выводе lsof строку с вашим процессом (например, node, python3, ruby) и портом 3000 (или 8000, 8080). Это значит ваш сервер работает и доступен на http://localhost:3000.
Возможные проблемы
⚠️ Проблема 1: Команда
sudo lsofне показывает некоторые процессы.Решение: Убедитесь, что вы ввели пароль правильно. Некоторые системные процессы (особенно в SIP-защищённых областях) могут не отображаться даже сsudo. В таком случае используйтеsudo lsof -i -P -nдля отключения преобразования имён (-n).
⚠️ Проблема 2: Вижу много строк с
*:ippили*:mdns. Это нормально?Решение: Да, это стандартные системные службы (Bonjour, IPP для принтеров). Не все из них являются уязвимостями. Изучайте только те процессы, которые вы не узнаёте или которые используют нестандартные порты (например, выше 1024, если это не ваш софт).
⚠️ Проблема 3: Порт явно открыт, но приложение не может к нему подключиться.Решение: Проверьте, на каком интерфейсе открыт порт. Если в выводе
lsofуказан127.0.0.1:3000, то к нему можно подключиться только с самого Mac. Для доступа из сети порт должен быть открыт на0.0.0.0:3000или на конкретном локальном IP (например,192.168.1.10:3000). Также проверьте настройки брандмауэра (System Preferences -> Network -> Firewall).
💡 Совет: Сохраните вывод в файл для анализа. Добавьте
> ports.txtв конец любой команды, например:sudo lsof -i -P | grep LISTEN > ~/Desktop/ports_$(date +%Y-%m-%d).txt. Это создаст файл с временной меткой на Рабочем столе.
⚠️ Проблема 4:
nmapпоказывает порт какfiltered.Решение: Это значит, что между вами и целью есть файрвол (брандмауэр), который блокирует пакеты. На локальном хосте (localhost) такого быть не должно. Если сканируете удалённый хост, это ожидаемо. Убедитесь, что локальный брандмауэр macOS разрешает соединения для нужного приложения (System Preferences -> Network -> Firewall -> Firewall Options...).