Какой инструмент macOS может заставить одно приложение ходить только через VPN?
Границе «только через VPN» нужны и путь, и отказ. Сравните профили для приложений, прокси, фильтры и PF, а затем проверьте то самое приложение, которое вам важно.
Одна строка в документе требований — «этому приложению разрешено использовать VPN и ничего больше» — тихо требует двух механизмов, которых не даёт ни один переключатель. Трафику нужен путь через предназначенный туннель, а трафик, который иначе ушёл бы напрямую, должен быть отклонён. Инструменты, которые одно из этого делают хорошо, а другое совсем нет, встречаются часто, поэтому сравнение, спрашивающее только «умеет ли что-то блокировать», уверенно отвечает на половину вопроса. Сначала запишите границу, затем выберите компоненты, покрывающие обе её половины.
Два требования, спрятанные в одном предложении
Направление — это часть, которая помещает соединение в туннель или прокси. Отказ — это часть, которая не даёт тому же соединению выйти любым другим путём. Их реализуют разные компоненты, они отказывают по-разному, и продукт может быть превосходен в одном, ничего не говоря о другом:
| Approach | Steers traffic | Refuses direct egress | Knows the app identity |
|---|---|---|---|
| Per-app VPN profile | Yes, for the apps it names | Only if a filter or firewall also blocks | Yes, within its own rules |
| Application proxy setting | Partly, for requests that honour it | No | No |
| Content filter | No | Yes | Yes, if the filter is written that way |
| Local PF ruleset | No | Yes, by address and port | Not reliably |
Читайте таблицу как контрольный список, а не как рейтинг. Ни одна строка не заполняет оба средних столбца, а строки, которые их покрывают, — это два сотрудничающих компонента: один владеет путём, другой отказом. Столбец идентичности важен по другой причине: правило, которое не может назвать приложение, не может применить правило об этом приложении. Что бы вы ни внедряли, оно должно отвечать на все три, иначе граница в документе требований — не граница на машине.
Одно лишь направление оставляет выход
Настройка прокси для приложения — самый ясный пример направления без отказа. Она может направлять запросы приложения, уважающего системный прокси, и ничего другого не покрывает: вспомогательный процесс, обновлятор, фоновая служба или другой протокол могут пойти своим путём, ни разу не прочитав эту настройку. Поэтому выбор конечной точки SOCKS в одной панели не создаёт политику запрета прямого выхода для приложения. Если требование касается приложения в целом, спросите, какие компоненты правило действительно определяет.
Профиль VPN для отдельного приложения направляет лучше прокси, потому что платформа решает, какие приложения попадают в туннель вместо того чтобы каждое приложение решало само. И всё же он ничего не отклоняет: профиль даёт путь, а трафик, который ему не соответствует, идёт обычным маршрутом. Именно этот разрыв — место, где второй компонент заслуживает своё место, и поэтому продукты, выглядящие как один переключатель, обычно состоят из двух.
Один лишь отказ ломает приложение
Документация Apple о фильтрах содержимого описывает вердикт разрешить-или-заблокировать для трафика, пока он проходит через сетевой стек. Этот вердикт не туннель и не прокси-соединение, потому что решает, может ли что-то продолжиться, а не куда оно идёт. Один фильтр прекрасно обеспечивает отказ и оставляет приложение непригодным, с чистыми журналами и без объяснений. Вердикт фильтра может остановить соединение, но никогда не даёт туннель, поэтому сочетание его с направлением — это проектное решение, а не необязательное дополнение.
Локально управляемый набор правил PF находится на другом конце этого спектра. Это законное решение поддержки на машине, которой владеет администратор, и оно не становится автоматически основой распространяемого продукта, потому что владелец набора правил владеет и его взаимодействием с другими пользователями межсетевого экрана, путём обновления и восстановлением, когда правило ошибочно. Добавление PF в продукт не снимает этот вопрос владения; оно его определяет.
Развёртывание решает, будет ли правило существовать и завтра
То, как Network Extension развёртывается на платформах Apple, зависит от типа поставщика, упаковки и версии ОС перед вами. Расширение приложения в macOS работает в контексте пользователя и завершается, когда этот пользователь выходит, тогда как системное расширение имеет глобальный контекст, не зависящий от сеанса. Если защита должна пережить выход, это различие и есть весь дизайн, а не сноска. Подтвердите путь развёртывания, прежде чем обещать поведение, потому что один и тот же код приземляется по-разному в зависимости от того, какой тип расширения поставляется.
Доступность исходного кода — отдельный вопрос от применения. Чтение репозитория говорит, как что-то реализовано, а не что установленный бинарный файл имеет право делать на этой машине. Подписывание, установка и авторизация по-прежнему действуют, а инструкции, построенные вокруг устаревшего расширения ядра или трюка с инъекцией библиотеки, описывают другую платформу и другое отношение к риску, как бы хорошо они ни работали когда-то.
Приёмочный случай, который называет приложение
Выберите одно действие, которое приложение выполняет само, отметьте адрес, которого оно должно достичь, и является ли этот адрес IPv4 или IPv6, затем повторите то же действие в утверждённом состоянии без туннеля. Второй запуск должен дать заявленный отказ, а не тихую прямую повторную попытку. Это та половина, которую люди оставляют неуточнённой, и единственная половина, доказывающая, что отказ вообще существует. Запустите его сначала при доступном туннеле, чтобы разница между двумя результатами могла происходить только из отсутствующего туннеля.
Затем пройдите переходы, которые называет требование: перезапуск приложения, срабатывание вспомогательного процесса, повторное подключение туннеля, смена сетей машиной и выход или перезагрузка там, где это применимо. Страница публичного IP в браузере не является проверкой сокетов другого приложения, поэтому не может её заменить. Там, где ни одно поддерживаемое развёртывание не покрывает реальное поведение приложения, авторизованная изолированная среда с явным шлюзом и без альтернативного выхода — это решение об удержании с собственными затратами на управление, а не замена флажка.
Завершите, записав четыре пункта: из каких компонентов состоит приложение, кто владеет направлением, кто владеет отказом и состояния, в которых правило должно по-прежнему действовать. Публичный репозиторий может быть одним критерием выбора, но он не один из четырёх, и именно эти пункты решают, соответствует ли данный инструмент сетевому требованию.