Где должно находиться правило брандмауэра Android, когда включён VPN
Активным может быть только один VpnService, поэтому приложение-брандмауэр и VPN-приложение не выстраиваются в цепочку. Пройдите один рабочий запрос и поместите каждое правило туда, где трафик действительно проходит.
У вас есть одно предложение политики: это приложение может обращаться к рабочему сервису и ни к чему больше. Следующий вопрос похож на выбор продукта, но это вопрос о месте, потому что каждая возможная точка применения видит свою часть трафика телефона. Шлюз видит только то, что входит в туннель. Фильтр на телефоне видит только то, что ему разрешено наблюдать. Если провести один запрос через обе точки, ответ становится очевидным.
Начните с фразы, а не с продукта
Разверните требование, прежде чем что-либо выбирать. Это значит пакет и профиль, в котором он работает, потому что приложение в рабочем профиле — это другой пользователь, чем то же приложение в личном профиле. Это значит место назначения: хост, порт и протокол, а не имя сервиса. Это значит путь DNS, который разрешает это имя, и то, что должно произойти, когда туннель недоступен.
В записанном виде политика для примера состоит из четырёх строк: рабочее приложение может обращаться к рабочему сервису; рабочее приложение не может обращаться ни к чему другому; остальные приложения не меняются; без туннеля рабочему приложению отказано, а не разрешён прямой обход. У каждой строки есть владелец, и это не все один и тот же владелец.
Шаг 1: что может обеспечить сам телефон
Брандмауэр Android без root — это VpnService, который перехватывает трафик локально, даже когда за ним нет удалённого туннеля. Android разрешает только один активный VPN-сервис на профиль пользователя, поэтому второе приложение-брандмауэр не встраивается за первым. Оно заменяет его, и интерфейс, который фильтровало первое приложение, исчезает.
Поэтому установка брандмауэра рядом с VPN-клиентом редко даёт ту комбинацию, которую люди ожидают. Если брандмауэр запускается, а VPN отключается, ничего не объединилось; они просто поменялись местами. Замена интерфейса — не сотрудничество, а симптом — туннель, который постоянно падает при открытии второго приложения.
Поддерживаемые схемы всё же существуют: фильтрация, встроенная в VPN-клиент, который вы уже используете, управляемые средства платформы через контроллер политик устройства или рабочий профиль, либо архитектура, описанная производителем. Всё остальное — эксперимент, который нужно перепроверять после каждого обновления приложения.
Шаг 2: что может обеспечить шлюз
После расшифровки трафика на дальнем конце шлюз может ограничить пересылаемые пакеты одобренными адресами, сервисами или аутентифицированными идентичностями VPN. Это настоящее применение правил для всего, что выходит через него, и правильное место для ограничения доступа к частным подсетям.
Чего он не получает, так это идентичности приложения телефона, привязанной к каждому обычному IP-пакету. Несколько приложений, использующих один адрес туннеля, для шлюза — один субъект, если только архитектура не даёт им отдельные адреса или отдельные аутентифицированные идентичности. Поэтому правило на пользователя на шлюзе не является правилом на приложение на телефоне, как бы его ни называла консоль управления.
Шаг 3: перечислите то, что никогда не доходит
Приложение, исключённое из VPN и обращающееся к устройству поблизости, никогда не попадает на шлюз, поэтому выходной брандмауэр не может отклонить пакет, который он не получает. То же относится к непреднамеренному прямому маршруту во время сбоя и к входящей экспозиции в локальной сети доступа. Это локальные границы по определению.
Верно и обратное: локальное правило, разрешающее соединение, не даёт доступа через ACL частной сети шлюза. Один запрос может подчиняться обеим границам, и выполнение одной ничего не говорит о другой.
Шаг 4: назначьте каждому правилу путь
Поместите решение в таблицу до того, как что-то настраивать, потому что пустые ячейки — это места, где схемы ломаются.
| Path | Who can enforce it | Blind spot |
|---|---|---|
| Work app to the work service, tunnel up | Gateway ACL on address and service, plus a local block on other paths | The gateway cannot see which app sent the packet |
| Work app to other destinations, tunnel up | Local app-aware filter, or the gateway if those destinations are addressed there | The local filter must be the active VpnService |
| Work app with no tunnel | Local deny, so the app cannot take a direct path | Requires the filter to survive the tunnel going away |
| Nearby LAN device | Local policy only | The gateway never sees it |
Рабочая форма — две границы с двумя задачами. Локальная граница, учитывающая приложения, управляет поведением телефона, включая прямой обход, а граница шлюза управляет удалёнными ресурсами. Сторона шлюза может разрешить рабочий сервис и отклонить любую другую частную подсеть, тогда как политика на телефоне сама решает, как поступить с прямым маршрутом, который приложение могло бы иначе выбрать.
Шаг 5: держите транспорт живым, затем проверяйте
Какой бы локальной политики вы ни придерживались, она должна пропускать транспорт, который устанавливает и поддерживает VPN. Блокировка этого транспорта оставляет телефон без туннеля и без политики, что ничего не применяет согласованно и трудно диагностируется, потому что у приложения просто нет сети.
Затем проверяйте каждую строку исходного предложения, а не общее впечатление: рабочее приложение достигает рабочего сервиса, то же приложение отклоняется в другом месте назначения, нерабочее приложение ведёт себя как раньше, а при остановленном туннеле рабочее приложение не переходит на прямое соединение. Проверьте отдельно путь DNS, потому что частный DNS или шифрованный резолвер могут обойти фильтр, который проверяет только адреса.
Если какой-то из этих шагов нельзя выполнить на телефоне, требование становится вопросом архитектуры, а не настройкой брандмауэра. Разделение политики между устройством, которым вы управляете, и шлюзом, которым вы управляете, обычно и есть честный ответ, а документация по подключениям VPN для Android — то место, где можно подтвердить, что платформа позволит и не позволит делать одному сервису.