Заблокирует ли ваш сетевой выключатель приложение, которое вы исключили из туннеля?
Исключённое приложение может намеренно идти напрямую, а защищённое должно при сбое оставаться закрытым. Сначала опишите политику для каждого приложения, затем проверьте, что именно применяет клиент.
Сетевой выключатель включён, приложение намеренно исключено из туннеля, и два требования теперь противоречат друг другу. Одно говорит, что наружу можно только через туннель, другое — что эта программа должна идти напрямую. Каждый клиент решает этот конфликт по-своему, а страница настроек редко объясняет, какое правило побеждает. Опишите политику для каждого приложения, прежде чем доверять любой надписи.
Две политики, одна машина
Сетевой выключатель — обещание о сбое: когда туннель не защищает трафик, трафик останавливается. Разделённый туннель — обещание о выборе: эти программы или адресаты используют туннель, а те нет. Второе обещание создаёт трафик, о котором должно решить первое. Ни одно обещание не ошибочно; просто их писали разные люди для разных угроз.
Возможны три исхода, и только один из них задуман при развёртывании. Исключённое приложение может остаться прямым во время сбоя, что соблюдает разделение и нарушает выключатель. Его могут заблокировать вместе со всем остальным, что соблюдает выключатель и нарушает разделение. Или его блокируют только иногда, в зависимости от того, как платформа оценивает правило после исчезновения интерфейса. Именно последний случай и порождает обращения.
Сначала список приложений, потом правило
Перечислите программы, которые должны использовать туннель, те, которые должны идти напрямую, и имена или адресаты, которые не должны появляться ни в одном списке. Отдельно укажите поведение резолвера и сторону IPv6, потому что оба могут следовать иной политике, чем трафик страниц.
Правила для приложений обычно соответствуют исполняемому файлу или пакету, а не профилю внутри него. Профиль браузера, приватное окно и расширение не имеют собственной сетевой идентичности, поэтому наследуют то, что получил процесс. Вспомогательный процесс, запущенный этим браузером, может вообще не унаследовать то же правило.
Нужны два списка, а не один: что туннель должен нести и что ни при каких условиях не должно уходить за его пределы. Приложение, которое есть в обоих, — это конфликт требований, а не деталь реализации, и его нужно разрешить до настройки клиента.
Что делает клиент во время сбоя
Одни реализации блокируют исключённые приложения во время сбоя и возвращают им доступ при переподключении. Другие сохраняют прямой путь всё время, что согласуется с разделением и слабее как свойство безопасности. Блокировка на уровне платформы может полностью перекрыть собственный выбор клиента по приложениям. Эта разница не косметическая, потому что решает, является ли исключённое приложение исключением из политики или дырой.
Постоянно включённый VPN в Android с параметром блокировки подключений без VPN — самый ясный случай, потому что блокировку применяет платформа, а не клиент, и исключённый пакет блокируется вместе со всем остальным, пока туннель выключен. Настольный клиент, который применяет исключения по приложениям в собственном драйвере, обычно оставляет исключённый процесс на физическом интерфейсе, потому что никогда не владел его трафиком. Оба поведения защитимы, и только одно соответствует требованию, что исключённое приложение должно оставаться рабочим. Спросите, какой компонент применяет правило, прежде чем толковать результат.
Читайте поведение той операционной системы, которая перед вами, а не настройку с тем же названием в другом месте. API применения различаются, и один флажок может означать строго разные вещи на настольном компьютере и на телефоне. Версия тоже важна, потому что управление блокировкой переезжало между экранами в разных выпусках Android, а список исключений на стороне клиента — не то же самое управление, что блокировка платформы.
Три момента: туннель включён, туннель выключен, переподключение
Используйте безвредные запросы в три момента: пока туннель работает, во время интересующего вас сбоя и после переподключения. Один результат браузера не может установить поведение исключённого приложения.
curl -sS --max-time 8 https://api.ipify.org
curl -sS --max-time 8 --interface tun0 https://api.ipify.org
dig +short example.com
Адрес выхода показывает, какой путь выбран, а явный тест интерфейса показывает, что происходит, когда туннель — единственный доступный выход. Запишите ожидаемый результат рядом с каждой строкой, прежде чем запускать любую из них, иначе вывод будет истолкован задним числом.
Если исключённое приложение остаётся без сети, проверьте приоритет политик, прежде чем добавлять широкое разрешение в брандмауэре, потому что такая правка уничтожает различие, которое вы проверяли. Если оно остаётся прямым, подтвердите, что это было документированное исключение, а не случайный откат. При строгом требовании для всего устройства сократите список исключений, пока его нельзя будет проверить вручную.