Сетевой экран и защита сети

Рейтинг: 48.7% · 7 голосов
Подробный курс по macOS для разработчиков и админов: архитектура и Apple Silicon, терминал и zsh, Homebrew и пакеты, launchd и автоматизация, APFS и Time Machine, безопасность (SIP, Gatekeeper, TCC, FileVault), сеть, логи и диагностика, MDM и DDM, контейнеры и виртуализация, восстановление. По официальной документации Apple, актуально на 2026 (macOS 26 Tahoe).
Ответить
Аватара пользователя
Artem_MacAdmin
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Сетевой экран и защита сети

Сообщение Artem_MacAdmin »

Оглавление курса (47)
  1. Что такое macOS: Unix под капотом и место в 2026
  2. Архитектура macOS: XNU, тома и Signed System Volume
  3. Apple Silicon: ARM, Rosetta 2 и отличия от Intel
  4. Установка, обновление и восстановление macOS
  5. Finder, рабочий стол и продуктивность
  6. Системные настройки и их управление из CLI (defaults)
  7. Пользователи и группы: учётные записи и управление
  8. Терминал и zsh: командная строка macOS
  9. CLI на macOS: BSD-команды и отличия от Linux
  10. Настройка zsh: .zshrc, prompt, плагины
  11. Файловая система и права: POSIX, ACL, атрибуты, флаги
  12. Homebrew: пакетный менеджер для macOS
  13. Homebrew глубже: tap, Brewfile, services, обслуживание
  14. Другие пакеты: MacPorts, mas, Nix и App Store
  15. Установка приложений: .app, .dmg, .pkg и Gatekeeper
  16. Управление приложениями и их данные
  17. launchd и launchctl: система запуска macOS
  18. Свои службы и периодические задачи на launchd
  19. Автоматизация: Shortcuts, AppleScript и osascript
  20. Конфигурация как код: defaults, plist и профили
  21. APFS: снапшоты, клоны, контейнеры и шифрование
  22. Управление дисками: diskutil, образы и форматирование
  23. Time Machine и резервное копирование
  24. Внешние диски, форматы и сетевые тома
  25. Модель безопасности macOS: SIP и целостность системы
  26. Gatekeeper, нотаризация и защита от вредоносов
  27. Приватность и TCC: разрешения на доступ
  28. FileVault: полнодисковое шифрование
  29. Связка ключей и управление секретами
  30. Сетевой экран и защита сети (вы здесь)
  31. Сеть в macOS: настройка и инструменты
  32. Диагностика сети на Mac
  33. Общий доступ: SSH, экран, файлы, удалённое управление
  34. Процессы и ресурсы: мониторинг производительности
  35. Логи macOS: unified logging и диагностика
  36. Производительность и энергия: powermetrics, диагностика
  37. Энергия, сон и обслуживание системы
  38. Профили конфигурации и основы MDM
  39. Управление парком Mac: MDM, DDM и zero-touch (2026)
  40. Среда разработчика на Mac: Xcode CLT, git, версии
  41. Контейнеры на Mac: Docker Desktop, OrbStack, Apple container
  42. Виртуализация: Virtualization.framework, UTM, Linux и Windows
  43. Режимы загрузки и восстановление (Apple Silicon)
  44. Сброс, NVRAM, Safe Mode и сброс настроек
  45. Траблшутинг macOS: дерево решений по симптомам
  46. Место на диске и обслуживание системы
  47. Сквозной проект: настройка Mac как у профи + куда расти
Открыл MacBook в коворкинге, поднял локальный dev-сервер на 0.0.0.0:8000 - и через минуту твой Vite или Postgres доступен любому за соседним столиком. Или наоборот: прилетел странный пакет на закрытый порт, а Mac на него вежливо ответил RST, выдав факт своего существования сканеру. Сетевой экран на macOS - это не одна галочка, а целая стопка механизмов с очень разной природой и зоной ответственности. И главная ловушка в том, что штатный firewall mac защищает совсем не то, что многие думают. Разберём по слоям: что есть, как устроено, где грабли, и почему один инструмент не закрывает все дыры.

Два разных брандмауэра: Application Firewall и pf

В macOS физически живут два независимых межсетевых экрана, и их часто путают.

Первый - Application Firewall (ALF, он же приложенческий брандмауэр mac). Тот самый из Системных настроек -> Сеть -> Брандмауэр (System Settings -> Network -> Firewall). Его логика - не по портам, а по приложениям. Когда процесс пытается слушать входящие соединения, ALF решает: пустить или нет, опираясь на подпись бинаря и твои правила. Это удобно для обычного пользователя: ты разрешаешь "Загрузкам Steam" принимать соединения, не зная, какой там порт.

Второй - pf (Packet Filter), полноценный BSD-фаервол, перенесённый из OpenBSD. Это сетевой экран macos уровня пакетов: фильтрует по IP, портам, протоколам, интерфейсам, направлению, умеет NAT, нормализацию (scrub), очереди трафика. Управляется через pfctl и конфиг /etc/pf.conf. Это инструмент для продвинутых - им пользуются VPN-клиенты, "Общий интернет" (Internet Sharing), сам ALF подвешивает в pf свои якоря.

Ключевое различие на пальцах:
  • Application Firewall - простой, по приложениям, только входящие, GUI-управляемый, для всех.
  • pf - гибкий, по пакетам и портам, входящие и исходящие, конфиг-управляемый, для тех, кто понимает что делает.
Они работают одновременно и не конфликтуют: ALF фильтрует на уровне сокетов и приложений, pf - на уровне сетевого стека. Можно держать ALF выключенным, а pf нагрузить жёсткими правилами, и наоборот.

Изображение

Application Firewall и socketfilterfw из терминала

GUI - это вершина айсберга. Под капотом ALF обслуживает демон socketfilterfw, а управляющая утилита лежит по непривычному пути - не в /usr/bin, а в /usr/libexec/ApplicationFirewall/socketfilterfw. Запоминай этот путь, в PATH его нет.

Посмотрим текущее состояние:

Код: Выделить всё

sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate --getstealthmode --getblockall
Firewall is enabled. (State = 1)
Stealth mode disabled
Block all DISABLED!
Разбор. State = 1 - брандмауэр включён. Stealth mode disabled - режим невидимости выключен: Mac отвечает на ping и на стук в закрытые порты, то есть палит себя сканерам вроде nmap. Block all DISABLED - режим "блокировать всё" выключен, значит работают индивидуальные правила по приложениям.

Включаем защиту целиком (нужен sudo, изменения требуют прав администратора):

Код: Выделить всё

sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on
Stealth mode - очень полезная штука для публичных сетей. С ним macOS молча дропает пакеты на порты, где никто не слушает, и не отвечает на ICMP echo. Для сканера твоя машина выглядит как "хоста нет". Это не делает тебя невидимым полностью (открытые порты всё равно ответят), но убирает лишний шум и фингерпринтинг.

Полезные ключи socketfilterfw:
  • --listapps - показать список приложений с их правилами и путями.
  • --add /path/to/app и --remove - добавить/убрать приложение в список правил.
  • --blockapp / --unblockapp - заблокировать или разрешить входящие конкретному бинарю.
  • --setallowsigned on|off - автоматически пускать входящие для встроенных подписанных Apple-приложений.
  • --setallowsignedapp on|off - то же для скачанных подписанных приложений (валидный Developer ID).
  • --setloggingmode on и --setloggingopt detail - включить детальный лог.
Важная тонкость про подпись. Когда ты собираешь свой dev-бинарь (тот же python из Homebrew или самосборный сервер) и он впервые пытается слушать порт, ALF при включённых allow-signed может молча его пустить, если бинарь подписан и в системе доверен, либо показать диалог "разрешить принимать входящие". А неподписанный бинарь система предложит подписать ad-hoc. Это объясняет странность: иногда твой сервер ловит коннекты без единого вопроса, а иногда macOS пристаёт с запросом при каждом пересборе - потому что меняется подпись, и правило ALF, привязанное к ней, инвалидируется.

Лог ALF читается через unified logging:

Код: Выделить всё

log show --predicate 'process == "socketfilterfw"' --last 1h --info
pf: пакетный фаервол для продвинутых правил

Когда нужен контроль по портам и направлениям, выходит на сцену pf mac. Управление - утилитой pfctl.

Состояние и статистика:

Код: Выделить всё

sudo pfctl -s info
Status: Enabled for 3 days 04:11:22           Debug: Urgent

State Table                          Total             Rate
  current entries                       87
  searches                         9241003         33.4/s
  inserts                           284551          1.0/s
Status: Enabled - pf включён (его мог поднять VPN или ты сам). Если видишь Disabled - правила в конфиге есть, но не применяются.

Главный конфиг - /etc/pf.conf. И тут первая большая грабля: не вычищай якоря Apple. Дефолтный /etc/pf.conf выглядит так:

Код: Выделить всё

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
Эти anchor (якоря) - точки, куда системные сервисы (AirDrop, Internet Sharing, тот же ApplicationFirewall) динамически вставляют свои правила. Если ты загрузишь свой конфиг через pfctl -f и снесёшь главный ruleset, ты сломаешь AirDrop и общий доступ. Правильный путь - свой отдельный anchor-файл, подключённый к основному, а не переписывание /etc/pf.conf начисто.

Минимальный пример: блокируем все входящие на dev-порт 8000, кроме localhost. Кладём правила в отдельный файл /etc/pf.anchors/dev.local:

Код: Выделить всё

block in proto tcp from any to any port 8000
pass in proto tcp from 127.0.0.1 to any port 8000
Проверяем синтаксис, не применяя (-n - dry run, обязательная привычка):

Код: Выделить всё

sudo pfctl -n -f /etc/pf.anchors/dev.local
Загружаем и включаем pf:

Код: Выделить всё

sudo pfctl -f /etc/pf.anchors/dev.local
sudo pfctl -e
Здесь -e (enable) и -d (disable). Apple-специфика: компоненты системы включают и выключают pf флагами -E и -X (с подсчётом ссылок), чтобы не подраться за состояние - поэтому VPN-клиент может держать pf включённым, даже если ты сделал -d. Посмотреть загруженные правила:

Код: Выделить всё

sudo pfctl -s rules
sudo pfctl -s nat
Чтобы правила переживали перезагрузку, заворачивай их в свой LaunchDaemon с pfctl при старте - тема прошлых уроков про launchd. Просто дописать в /etc/pf.conf тоже можно, но грязно и легко затереть обновлением.

Lockdown Mode, VPN и встроенный VPN по требованию

Режим блокировки (Lockdown Mode) - это не фаервол, а резкое сокращение поверхности атаки для тех, кому реально грозит наёмное шпионское ПО (журналисты, активисты, дипломаты). Включается в Системные настройки -> Конфиденциальность и безопасность -> Режим блокировки (System Settings -> Privacy and Security -> Lockdown Mode), в самом низу. Что он отключает на macOS 26 Tahoe: JIT-компиляцию JavaScript в WebKit (сайты грузятся медленнее), большинство типов вложений в Сообщениях, превью ссылок, входящие приглашения FaceTime от незнакомцев, проводные соединения с аксессуарами при заблокированном экране, часть профилей конфигурации MDM. Большинству людей он не нужен и мешает работе - это инструмент для конкретной модели угроз, а не "максимальная безопасность для всех". Сверяйся с support.apple.com, набор ограничений Apple расширяет от версии к версии.

VPN. macOS умеет встроенные клиенты IKEv2, L2TP/IPsec, и через сторонние профили - WireGuard/OpenVPN (NetworkExtension). Настройка - Системные настройки -> Сеть -> добавить VPN, либо импортом профиля .mobileconfig (для парка Mac - через MDM, это норма в DDM-мире 2026). Killer-фича для безопасности - VPN по требованию (On-Demand): туннель поднимается автоматически по правилам - например, всегда, кроме доверенного домашнего Wi-Fi, или для конкретных доменов. Настраивается это в профиле конфигурации (ключи OnDemandRules), GUI такого не даёт. Под капотом VPN-клиенты обычно вешают правила в pf, поэтому после подключения корпоративного VPN ты увидишь в pfctl -s rules чужие строки - это нормально.

Главная грабля: исходящие соединения и брандмауэр разработчика

Запомни накрепко, это ловит даже опытных: Application Firewall не фильтрует исходящие соединения. Совсем. Он контролирует только входящие коннекты к слушающим сокетам. Если зловред или болтливая аналитика в каком-нибудь Electron-приложении стучится наружу на свой сервер - штатный брандмауэр mac это пропустит молча, даже в режиме stealth и при включённом "блокировать всё" (block all тоже про входящие).

Чтобы контролировать исходящий трафик по приложениям, нужен сторонний инструмент:
  • LuLu от Objective-See - бесплатный, открытый, блокирует неизвестные исходящие соединения, спрашивая разрешения. Хороший дефолт.
  • Little Snitch - платный, более гранулярный: правила, профили, карта соединений, тонкая настройка по доменам и портам.
Технически можно резать исходящее и через pf (block out proto tcp from any to any port ...), но pf фильтрует по IP/портам, а не по приложениям, и не покажет диалог "процессу Foo заблокирован доступ к bar.com". Для приложенческого контроля исходящих pf неудобен.

Брандмауэр для разработчика. Локальные сервисы - частый источник дыр. Практические правила:
  • Биндь dev-сервер на 127.0.0.1, а не на 0.0.0.0. Vite, Next, Flask, Postgres по умолчанию иногда слушают все интерфейсы - проверь. Тогда никакой firewall вообще не нужен, сервис недоступен извне физически.
  • Проверяй, кто реально слушает: lsof -nP -iTCP -sTCP:LISTEN покажет процесс, порт и адрес. Если в колонке адреса *:8000 - ты открыт наружу, если 127.0.0.1:8000 - только локально.
  • Docker и colima пробрасывают порты в обход ALF через свою сеть - помни, что -p 8000:8000 может выставить контейнер на все интерфейсы.

Код: Выделить всё

lsof -nP -iTCP -sTCP:LISTEN
COMMAND   PID USER   FD  TYPE  DEVICE NODE NAME
node    44120  dev   23u IPv4  0x...  TCP  127.0.0.1:5173 (LISTEN)
postgres 6610 dev    7u  IPv6  0x...  TCP  *:5432 (LISTEN)
Здесь Vite (node) слушает только loopback - безопасно. А postgres висит на *:5432, то есть доступен из сети - вот это надо чинить: либо listen_addresses в конфиге Postgres, либо правилом pf.

Мини-лаба: собери защиту руками

Повтори на своей машине (всё откатывается):
  • 1. Сними слепок состояния ALF: sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate --getstealthmode.
  • 2. Включи брандмауэр и stealth mode теми же командами с --set...on. Проверь, что состояние изменилось.
  • 3. Подними тестовый сервер: python3 -m http.server 8000 --bind 0.0.0.0. С другого устройства в сети попробуй открыть http://твой-ip:8000 - откроется (ALF пускает входящие подписанному python или спросит разрешение).
  • 4. Теперь dry-run своего pf-правила, блокирующего порт 8000: положи block in proto tcp from any to any port 8000 в файл и прогони sudo pfctl -n -f файл. Загрузи, включи pf через -e, снова постучись извне - соединение должно отвалиться по таймауту.
  • 5. Откати: sudo pfctl -d (или -f /etc/pf.conf чтобы вернуть дефолт), верни stealth mode и брандмауэр в исходное состояние из шага 1.
  • 6. Бонус: поставь LuLu, запусти любое приложение с сетью и поймай диалог про исходящее соединение - почувствуй разницу с ALF.
Контрольные вопросы
  • 1. Почему включённый Application Firewall в режиме "блокировать всё" не остановит зловред, отправляющий данные на чужой сервер? Что нужно добавить?
  • 2. Чем отличается фильтрация в ALF от фильтрации в pf - по какому признаку каждый принимает решение?
  • 3. Зачем нельзя удалять строки anchor "com.apple/*" из /etc/pf.conf и что сломается?
  • 4. Что делает stealth mode и почему он полезен именно в публичной Wi-Fi сети?
Итог

Защита сети на Mac - это слои с разной природой. Application Firewall (socketfilterfw) - простой контроль входящих по приложениям плюс stealth mode, твой базовый минимум в публичных сетях. pf (pfctl, /etc/pf.conf) - мощный BSD-фаервол для правил по портам и направлениям, для продвинутых сценариев, но не трогай якоря Apple. Lockdown Mode - крайняя мера против таргетированных атак, не для всех. VPN, особенно по требованию, закрывает транзит. А главную дыру - исходящие соединения - штатный брандмауэр не видит вообще, тут нужен LuLu или Little Snitch. И самое дешёвое правило безопасности для разработчика: бинди локальные сервисы на 127.0.0.1 и регулярно смотри lsof, кто там реально слушает наружу.
👍4 ❤️3 🔥1 😄 🤔3
Аватара пользователя
ejames
Сообщения: 1
Зарегистрирован: 13 май 2026, 06:43

Re: Сетевой экран и защита сети

Сообщение ejames »

Долго не мог понять почему мой Flask на 0.0.0.0 видно с телефона хотя брандмауэр включён - оказалось ALF про входящие пускает python, а реально надо было бить на 127.0.0.1. Спасибо за lsof, теперь первым делом смотрю кто слушает.
👍 ❤️ 🔥 😄 🤔3
Аватара пользователя
kebpark
Сообщения: 1
Зарегистрирован: 23 май 2026, 23:05

Re: Сетевой экран и защита сети

Сообщение kebpark »

А можно как-то совместить: pf режет порты, а LuLu исходящие по приложениям - они друг другу не мешают? И правда что VPN-клиент сам в pf лезет, у меня после подключения корпоративного туннеля в pfctl -s rules какие-то левые строки появились.
👍3 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Связка ключей и управление секретами
Следующая глава →
Сеть в macOS: настройка и инструменты

Все главы курса «macOS для профи: администрирование, терминал и Homebrew»

Поделиться темой: ✈ Telegram VK
Похожие запросы: Настройка сети на Mac

Вернуться в «macOS для профи: администрирование, терминал и Homebrew»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя