Почему Android показывает значок VPN, хотя никакой VPN-сервис не включён

2862
Почему Android показывает значок VPN, хотя никакой VPN-сервис не включён

Я включаю блокировщик рекламы или сетевой фильтр, а Android внезапно рисует в строке состояния ключ или надпись VPN. Первая мысль вполне логична. Значит, телефон подключился к какому-то VPN-серверу и теперь гонит через него весь интернет. Но Android сообщает немного другое. Значок говорит, что приложение заняло системный VPN-интерфейс. Удалённого сервера при таком подключении может вообще не быть.

Почему Android показывает значок VPN

Причина путаницы называется VpnService. Android разрешает приложению создать виртуальный сетевой интерфейс и направить в него IP-пакеты с телефона. Обычный VPN забирает пакеты, шифрует и отправляет на удалённый сервер. Локальный файрвол, блокировщик рекламы или анализатор трафика может получить те же пакеты, проверить прямо на смартфоне и выпустить в интернет через обычное Wi-Fi или мобильное соединение. Android использует один системный механизм в обоих случаях, поэтому и показывает одинаковый индикатор.

Мой главный совет простой. Не надо пугаться самого значка VPN, но и считать локальный VPN автоматически безопасным я бы тоже не стала. Значок показывает технический механизм, а не маршрут ваших данных. Маршрут зависит от конкретного приложения.

Что на самом деле делает VpnService

В Android есть системный класс VpnService. Он появился ещё в API 14 и позволяет приложению создать виртуальный сетевой интерфейс. Обычно такой интерфейс называют TUN-интерфейсом.

Можно представить сеть смартфона как развилку. Без VpnService приложение отправляет пакет в сетевой стек Android, а дальше пакет уходит через Wi-Fi или мобильную сеть. После запуска VpnService система может изменить маршрут и сначала направить пакет в виртуальный интерфейс.

Приложение
     |
     v
 сетевой стек Android
     |
     v
 виртуальный интерфейс VpnService
     |
     v
 программа получает IP-пакет

Дальше начинается самое интересное. Android уже передал пакет приложению, но не диктует, что с ним делать дальше.

Классический удалённый VPN строит такую цепочку.

Браузер или приложение
         |
         v
      VpnService
         |
         v
 шифрование пакетов
         |
         v
 интернет
         |
         v
 удалённый VPN-сервер
         |
         v
 нужный сайт

Удалённый сервер становится промежуточной точкой. Сайт обычно видит внешний адрес VPN-сервера, а оператор связи видит соединение телефона с VPN-инфраструктурой вместо обычных соединений со множеством сайтов.

Локальный сетевой фильтр способен использовать тот же системный интерфейс совершенно иначе.

Браузер или приложение
         |
         v
      VpnService
         |
         v
 локальная проверка на телефоне
         |
         +-- разрешить
         |
         +-- заблокировать
         |
         v
 обычное Wi-Fi или мобильное соединение
         |
         v
 нужный сервер

Фильтр может сравнивать обращения с правилами, блокировать некоторые домены, разрешать или запрещать сеть отдельным приложениям, считать объём трафика либо перенаправлять DNS-запросы. Сам VPN-интерфейс при таком сценарии остаётся внутри телефона.

Разработчик создаёт интерфейс через VpnService.Builder. Упрощённо код выглядит примерно так.

val tunnel = VpnService.Builder()
     .addAddress("10.10.10.1", 32)
     .addRoute("0.0.0.0", 0)
     .establish()

Метод establish() возвращает приложению файловый дескриптор виртуального интерфейса. Чтение из него даёт исходящие IP-пакеты, а запись позволяет вернуть пакет обратно в сетевой стек как входящий. Именно поэтому программа получает достаточно удобную точку для контроля сетевого обмена без прав root.

У обычного приложения Android нет универсальной кнопки «перехвати весь сетевой трафик остальных программ». VpnService решает такую задачу штатным способом, но Android специально делает работу интерфейса заметной пользователю. В документации Android прямо сказано, что система показывает собственное уведомление на протяжении работы VPN-соединения. Отсюда ключ или надпись VPN.

Что локальный VPN способен видеть и чего он не умеет

Фраза «локальный VPN видит весь трафик» звучит страшнее, чем реальная картина. VpnService действительно способен получать IP-пакеты тех приложений, которые направлены через созданный интерфейс. Но получение пакета не означает автоматический доступ ко всему содержимому.

Если приложение открывает обычное HTTPS-соединение, содержимое страницы, пароль, сообщение или банковская операция защищены шифрованием TLS. Локальный фильтр может видеть технические параметры соединения и анализировать часть сетевых метаданных, но не получает расшифрованный HTTPS-текст просто потому, что использует VpnService.

Для полноценной расшифровки HTTPS потребовалась бы отдельная схема с перехватом TLS и доверенным сертификатом на устройстве. Современные приложения дополнительно могут проверять сертификаты самостоятельно, поэтому подобный перехват работает далеко не всегда. Сам значок VPN никак не доказывает, что приложение расшифровывает HTTPS.

У DNS-фильтра всё ещё проще. Программа может интересоваться главным образом запросами вида «какой IP соответствует такому домену». Если домен попал в список рекламы или трекеров, фильтр возвращает пустой ответ либо подменяет маршрут. Саму страницу фильтр при таком режиме не читает. Я уже подробно разбирала, как работает частный DNS Android. Частный DNS решает похожую задачу на уровне имён, но системный VpnService для него не нужен.

Сценарий Что делает VpnService Нужен удалённый VPN-сервер
Классический VPN Забирает пакеты и передаёт их в защищённый туннель Да
Локальный блокировщик Проверяет обращения и блокирует запрещённые правилами Не обязательно
Локальный файрвол Разрешает или запрещает сетевой доступ приложениям Не обязательно
Анализатор трафика Получает пакеты для учёта или анализа Не обязательно
Антивирусный сетевой модуль Проверяет сетевые обращения по собственным правилам Зависит от реализации

Есть неприятный нюанс. Слово «локальный» ещё не означает, что программа вообще ни с кем не связывается. Фильтр может загружать списки правил, отправлять телеметрию, проверять домены через облачный сервис или использовать собственные DNS-серверы. Поэтому описание приложения и его политика конфиденциальности говорят о приватности больше, чем значок в строке состояния.

Материал относится только к легальному и ответственному использованию сетевых инструментов. Соблюдайте законодательство своей страны, особенно требования, действующие в России. Сетевые фильтры, VPN и средства анализа трафика нельзя применять для несанкционированного доступа, слежки, взлома, нарушения правил сервисов или незаконного обхода ограничений.

Почему второй VPN внезапно не подключается

Вот где название VpnService превращается уже не в косметическую странность, а в практическую проблему. Android допускает только один активный VPN такого типа для пользователя или профиля. Руководство Android прямо указывает, что при запуске нового VPN-сервиса существующий сервис прекращает работу.

Допустим, у меня постоянно работает локальный блокировщик рекламы. Для Android блокировщик уже занял место VPN. Затем я запускаю обычное приложение удалённого VPN. Второй сервис пытается получить тот же системный ресурс, поэтому первый отключается или новое подключение не запускается. Конкретное поведение зависит от приложений и версии оболочки, но одновременно поставить два независимых VpnService друг поверх друга обычным способом нельзя.

Отсюда довольно типичная история.

  1. Пользователь включает блокировщик. В строке состояния появляется ключ VPN.
  2. Пользователь запускает настоящий VPN. Блокировщик перестаёт фильтровать сеть.
  3. Пользователь возвращает блокировщик. Уже удалённый VPN отключается.

Проблему иногда решает одно приложение, которое само объединяет удалённый туннель и фильтрацию. Но два отдельных приложения не могут просто сложить свои VpnService в цепочку.

Есть дополнительные нюансы с рабочими профилями Android, где сетевые политики могут применяться отдельно к профилю, а также с корпоративным управлением устройством. Для обычного личного профиля правило проще. Один активный VPN-интерфейс занимает одно системное место.

Частный DNS сюда не относится. Android Private DNS использует другой механизм, поэтому сам по себе не занимает VpnService. Но VPN-приложение способно задавать собственный DNS или перехватывать DNS-трафик, поэтому итоговый сервер имён иногда отличается от указанного в системной настройке.

Как понять, кто включил VPN и куда идёт трафик

Когда ключ появился неожиданно, я бы не удаляла приложения наугад. Сначала нужно найти программу, которая получила роль VPN.

  1. Откройте настройки Android. В строке поиска настроек введите VPN. На Pixel путь обычно выглядит как «Сеть и интернет» → «VPN». У Samsung, Xiaomi и других производителей название разделов отличается.
  2. Посмотрите активное подключение. Android показывает приложение или профиль, который сейчас использует VPN. Официальная инструкция Google также рекомендует проверять соединение через системный раздел VPN.
  3. Откройте найденное приложение. Ищите режимы вроде сетевой защиты, фильтрации, файрвола, проверки соединений или блокировки рекламы.
  4. Отключите функцию внутри программы. Если VPN-интерфейс принадлежал ей, значок должен исчезнуть.
  5. Проверьте доступ в интернет. Если после отключения фильтра сайты работают через тот же внешний IP, программа, вероятно, не выполняла классическую функцию удалённого VPN.

Последний тест не даёт полной гарантии. Приложение может маршрутизировать только часть трафика через удалённую инфраструктуру, применять раздельную маршрутизацию или отправлять наружу только DNS. Если происхождение программы вызывает сомнения, я бы не пыталась угадать архитектуру по одному значку. Безопаснее удалить приложение и сбросить выданное ему VPN-разрешение.

Не стоит также путать VPN-значок с доказательством взлома. Android специально выводит индикатор, когда работает системный VPN-механизм. Сам факт появления ключа говорит скорее о том, что система показывает пользователю чувствительную сетевую функцию, а не о скрытой активности.

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

Итог простой. Значок VPN на Android означает активный системный VPN-интерфейс, а не обязательное соединение с удалённым VPN-сервером. Локальные файрволы, блокировщики, антивирусные модули и анализаторы трафика используют VpnService как легальный способ поставить себя между приложениями и сетью. Если ключ появился после запуска такой функции, поведение может быть совершенно нормальным. Проверять нужно не название API, а конкретное приложение, его сетевые соединения и то, куда программа отправляет полученные данные.

Почему на телефоне появился значок VPN сам по себе?

Чаще всего VPN-интерфейс запустило установленное приложение. Им может оказаться блокировщик рекламы, файрвол, антивирус или сетевой фильтр. Найти активное приложение можно через системный раздел VPN в настройках Android.

Означает ли значок VPN, что весь трафик идёт через чужой сервер?

Нет. VpnService может работать полностью локально. Приложение получает пакеты через виртуальный интерфейс, фильтрует их на смартфоне и отправляет дальше через обычное соединение. Удалённый сервер при такой схеме не обязателен.

Может ли локальный VPN читать пароли и переписку?

Сам VpnService не расшифровывает HTTPS. Приложение получает сетевые пакеты, но содержимое TLS остаётся зашифрованным. Для перехвата расшифрованного HTTPS потребовались бы дополнительные механизмы, например доверенный сертификат и проксирование TLS.

Можно ли одновременно включить блокировщик с локальным VPN и обычный VPN?

Обычно нет, если оба приложения используют Android VpnService в одном пользовательском профиле. Система разрешает один активный VPN-сервис, поэтому запуск второго может отключить первый.

Чем частный DNS отличается от локального VPN?

Частный DNS шифрует DNS-запросы и не требует VpnService. Локальный VPN создаёт виртуальный сетевой интерфейс и может работать с более широким набором IP-трафика. Поэтому частный DNS обычно не вызывает появление VPN-значка.

Как убрать значок ключа VPN на Android?

Найдите раздел VPN в настройках Android, определите активное приложение и отключите его сетевую функцию или VPN-подключение. Если VPN нужен блокировщику или файрволу для работы, после отключения значка соответствующая фильтрация тоже прекратится.

Опасен ли локальный VPN на Android?

Сам механизм VpnService не является вредоносным. Риск зависит от приложения, которое получает доступ к сетевому потоку. Перед выдачей разрешения стоит проверить разработчика, назначение программы, политику конфиденциальности и необходимость такого доступа.

Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.
12.1111:00 SECURITM | вебинарПДн есть. А контроль где?Знаете, где обрабатываются ПДн и кто за них отвечает? На вебинаре 12.11 покажем, как связать процессы, системы и требования, найти пробелы.Регистрируйтесь! Реклама: ООО «СЕКЪЮРИТМ», ИНН 7820074059, 18+

Юрий Кочетов

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