Одна строка в документе требований — «этому приложению разрешено использовать VPN и ничего больше» — тихо требует двух механизмов, которых не даёт ни один переключатель. Трафику нужен путь через предназначенный туннель, а трафик, который иначе ушёл бы напрямую, должен быть отклонён. Инструменты, которые одно из этого делают хорошо, а другое совсем нет, встречаются часто, поэтому сравнение, спрашивающее только «умеет ли что-то блокировать», уверенно отвечает на половину вопроса. Сначала запишите границу, затем выберите компоненты, покрывающие обе её половины.

Два требования, спрятанные в одном предложении

Направление — это часть, которая помещает соединение в туннель или прокси. Отказ — это часть, которая не даёт тому же соединению выйти любым другим путём. Их реализуют разные компоненты, они отказывают по-разному, и продукт может быть превосходен в одном, ничего не говоря о другом:

ApproachSteers trafficRefuses direct egressKnows the app identity
Per-app VPN profileYes, for the apps it namesOnly if a filter or firewall also blocksYes, within its own rules
Application proxy settingPartly, for requests that honour itNoNo
Content filterNoYesYes, if the filter is written that way
Local PF rulesetNoYes, by address and portNot reliably

Читайте таблицу как контрольный список, а не как рейтинг. Ни одна строка не заполняет оба средних столбца, а строки, которые их покрывают, — это два сотрудничающих компонента: один владеет путём, другой отказом. Столбец идентичности важен по другой причине: правило, которое не может назвать приложение, не может применить правило об этом приложении. Что бы вы ни внедряли, оно должно отвечать на все три, иначе граница в документе требований — не граница на машине.

Одно лишь направление оставляет выход

Настройка прокси для приложения — самый ясный пример направления без отказа. Она может направлять запросы приложения, уважающего системный прокси, и ничего другого не покрывает: вспомогательный процесс, обновлятор, фоновая служба или другой протокол могут пойти своим путём, ни разу не прочитав эту настройку. Поэтому выбор конечной точки SOCKS в одной панели не создаёт политику запрета прямого выхода для приложения. Если требование касается приложения в целом, спросите, какие компоненты правило действительно определяет.

Профиль VPN для отдельного приложения направляет лучше прокси, потому что платформа решает, какие приложения попадают в туннель вместо того чтобы каждое приложение решало само. И всё же он ничего не отклоняет: профиль даёт путь, а трафик, который ему не соответствует, идёт обычным маршрутом. Именно этот разрыв — место, где второй компонент заслуживает своё место, и поэтому продукты, выглядящие как один переключатель, обычно состоят из двух.

Один лишь отказ ломает приложение

Документация Apple о фильтрах содержимого описывает вердикт разрешить-или-заблокировать для трафика, пока он проходит через сетевой стек. Этот вердикт не туннель и не прокси-соединение, потому что решает, может ли что-то продолжиться, а не куда оно идёт. Один фильтр прекрасно обеспечивает отказ и оставляет приложение непригодным, с чистыми журналами и без объяснений. Вердикт фильтра может остановить соединение, но никогда не даёт туннель, поэтому сочетание его с направлением — это проектное решение, а не необязательное дополнение.

Локально управляемый набор правил PF находится на другом конце этого спектра. Это законное решение поддержки на машине, которой владеет администратор, и оно не становится автоматически основой распространяемого продукта, потому что владелец набора правил владеет и его взаимодействием с другими пользователями межсетевого экрана, путём обновления и восстановлением, когда правило ошибочно. Добавление PF в продукт не снимает этот вопрос владения; оно его определяет.

Развёртывание решает, будет ли правило существовать и завтра

То, как Network Extension развёртывается на платформах Apple, зависит от типа поставщика, упаковки и версии ОС перед вами. Расширение приложения в macOS работает в контексте пользователя и завершается, когда этот пользователь выходит, тогда как системное расширение имеет глобальный контекст, не зависящий от сеанса. Если защита должна пережить выход, это различие и есть весь дизайн, а не сноска. Подтвердите путь развёртывания, прежде чем обещать поведение, потому что один и тот же код приземляется по-разному в зависимости от того, какой тип расширения поставляется.

Доступность исходного кода — отдельный вопрос от применения. Чтение репозитория говорит, как что-то реализовано, а не что установленный бинарный файл имеет право делать на этой машине. Подписывание, установка и авторизация по-прежнему действуют, а инструкции, построенные вокруг устаревшего расширения ядра или трюка с инъекцией библиотеки, описывают другую платформу и другое отношение к риску, как бы хорошо они ни работали когда-то.

Приёмочный случай, который называет приложение

Выберите одно действие, которое приложение выполняет само, отметьте адрес, которого оно должно достичь, и является ли этот адрес IPv4 или IPv6, затем повторите то же действие в утверждённом состоянии без туннеля. Второй запуск должен дать заявленный отказ, а не тихую прямую повторную попытку. Это та половина, которую люди оставляют неуточнённой, и единственная половина, доказывающая, что отказ вообще существует. Запустите его сначала при доступном туннеле, чтобы разница между двумя результатами могла происходить только из отсутствующего туннеля.

Затем пройдите переходы, которые называет требование: перезапуск приложения, срабатывание вспомогательного процесса, повторное подключение туннеля, смена сетей машиной и выход или перезагрузка там, где это применимо. Страница публичного IP в браузере не является проверкой сокетов другого приложения, поэтому не может её заменить. Там, где ни одно поддерживаемое развёртывание не покрывает реальное поведение приложения, авторизованная изолированная среда с явным шлюзом и без альтернативного выхода — это решение об удержании с собственными затратами на управление, а не замена флажка.

Завершите, записав четыре пункта: из каких компонентов состоит приложение, кто владеет направлением, кто владеет отказом и состояния, в которых правило должно по-прежнему действовать. Публичный репозиторий может быть одним критерием выбора, но он не один из четырёх, и именно эти пункты решают, соответствует ли данный инструмент сетевому требованию.

Похожие статьи