Приложение iPhone не находит локальные устройства при включённом VPN
Двое ворот решают, сможет ли приложение на iPhone достучаться до принтера или телевизора через VPN: разрешение «Локальная сеть» и маршруты самого туннеля. Проверяйте их по порядку.
Приложение принтера показывает пустой список, приложение камеры сообщает, что устройство не найдено, а кнопка трансляции в видеоприложении крутится, пока не сдастся. Значок VPN висит в строке состояния, телефон ловит на полную, Safari нормально грузит страницы, так что с соединением вроде всё в порядке. Потом вы открываете настройки самого приложения и не находите там ни одного переключателя.
Я уткнулся ровно в эту стену с этикеточным принтером в домашней сети: приложению ни разу не давали доступ к локальной сети, а профиль, который я проверял, был полным туннелем, проглатывавшим каждый пакет, адресованный 192.168.1.0/24. Двое независимых ворот были закрыты, и открытие одних не убрало бы симптом.
Двое ворот между одним приложением и одним принтером
Первые ворота — это решение о приватности, которое принадлежит операционной системе, а не приложению. iOS решает, может ли приложение отправлять трафик на адреса локальной сети, и спрашивает пользователя при первой попытке приложения. Вторые ворота — таблица маршрутов. Пакет, адресованный 192.168.1.50, либо уходит по Wi-Fi к принтеру, либо попадает в туннель, и этот выбор записан в профиле VPN.
Двое ворот отказывают по-разному, и именно это делает диагностику возможной. Запрещённое разрешение убивает собственный вызов сокета в приложении, поэтому приложению нечего сообщить, и оно откатывается к общему пустому состоянию. Проблема маршрутизации выглядит как тайм-аут, потому что пакеты покинули телефон и умерли где-то на той стороне. Тот же пустой экран, другой ремонт.
Сначала прочитайте состояние разрешения, потом трогайте VPN
Откройте «Настройки», затем «Конфиденциальность и безопасность», затем «Локальная сеть». Каждое приложение, запросившее доступ, появляется там с переключателем. Apple перемещала и переименовывала части этого экрана с iOS 14 по iOS 18, поэтому если пункт не там, где вы ожидаете, введите «Локальная сеть» в поиск по настройкам вместо того, чтобы перебирать дерево.
Больше всего людей ловит одноразовый запрос. iOS спрашивает, когда приложение впервые обращается к локальной сети, и только тогда. Нажмите «Не разрешать», и при следующем запуске запрос не вернётся; переключатель — единственный путь назад, и он изначально выключен. Переустановка приложения сбрасывает решение, поэтому в некоторых ветках форумов утверждают, что переустановка починила обнаружение. Починила — стиранием запрета.
На контролируемом или управляемом iPhone переключатель иногда серый. Профиль настроек приватности, разосланный через MDM, может заранее задать или заблокировать доступ к локальной сети, а заблокированный выключенный переключатель означает, что ремонт — это изменение политики, а не изменение телефона. Apple описывает запрос и переключатель для каждого приложения здесь: support.apple.com/en-us/102229.
Проверьте, что туннель на самом деле маршрутизирует
Полный туннель забирает 0.0.0.0/0 и вместе с ним каждый частный диапазон. Пакеты для 10.x, 172.16.0.0/12 и 192.168.x.x уходят на сервер, который обычно их отбрасывает или транслирует в свою подсеть, поэтому принтер остаётся недостижим даже после выдачи разрешения. Раздельный туннель делает наоборот, но только для диапазонов, перечисленных в профиле.
Профили IKEv2, собранные в Apple Configurator или поставляемые как .mobileconfig, выражают это настройкой «отправлять весь трафик» плюс, в раздельном режиме, явным списком локальных сетей, которые нужно исключить. Клиентские приложения на NEPacketTunnelProvider выражают то же решение через includedRoutes. Ни то, ни другое не видно из строки состояния, и оба перекрывают то, что приложение ожидает увидеть.
Вот проверка, которой пользуюсь я. При подключённом VPN откройте в Safari страницу администрирования роутера по его LAN-адресу. Если публичные сайты грузятся, а эта страница уходит в тайм-аут, ваш частный диапазон внутри туннеля. Если страница грузится, локальный трафик по-прежнему уходит по Wi-Fi, и блокировка где-то ещё.
Сопоставьте симптом с воротами
Два приложения на одном телефоне могут расходиться во мнениях, потому что разрешение выдаётся на приложение, а маршруты — на профиль. Сравните, что именно не работает, прежде чем что-то менять: обычно картина сама называет ворота.
| What you see | Gate | Next step |
|---|---|---|
| Device list stays empty, Local Network switch is off | Permission | Enable the switch, force-quit the app, reopen it |
| Switch is on, router page times out, public sites load | Routing | Exclude the local range in the profile, or move to a split tunnel |
| Both pass, direct IP works, discovery stays empty | Link-local multicast | Enter the device address by hand, or check profile discovery support |
| Works by IP address, never by name such as printer.local | Name resolution | Fix mDNS reachability or use the numeric address |
| Everything fails with the VPN off, on hotel Wi-Fi | Client isolation | Change network, do not change permissions |
Строка mDNS заслуживает примечания. Трафик обнаружения для Bonjour и большинства протоколов трансляции идёт многоадресно на 224.0.0.251 и ff02::fb в пределах локального сегмента, и маршрутизируемый туннель его не переносит. Поэтому устройство может отвечать на прямое подключение, никогда не появляясь в списке.
Проверяйте операцию, а не значок
После переключения «Локальной сети» принудительно закройте приложение через переключатель приложений и запустите снова. Работающий процесс может удерживать запрещённое состояние с момента до изменения, а приложение, которое продолжает отдавать пустой список, выглядит одинаково независимо от того, сработало разрешение или нет. Затем выполните одно конкретное действие — например, печать тестовой страницы или запуск видео, — вместо ожидания, что список устройств заполнится.
Держите профиль VPN неизменным на протяжении сравнения. Если обнаружение заработало только после отключения, вы узнали, что виноват туннель, а не разрешение. Меняйте по одной переменной за попытку, иначе следующий прогон ничего вам не скажет.
Исправляйте в таком порядке
Последовательность ниже — та, которой я теперь следую, потому что она никогда не оставляет телефон в половинчатом состоянии, где следующий тест нечитаем.
- Убедитесь, что приложение есть в разделе «Конфиденциальность и безопасность», «Локальная сеть», и что его переключатель включён.
- Принудительно закройте и заново запустите приложение, затем один раз повторите реальную операцию.
- Откройте страницу роутера по LAN-адресу при активном подключении, чтобы понять, попадает ли частный диапазон в туннель.
- Если попадает, отредактируйте профиль и исключите локальные сети или попросите владельца профиля сделать это.
- Если переключатель серый, считайте устройство управляемым и передайте запрос администратору.
Обычно применима только одна из них. Если ни одна не меняет результат, оставшиеся подозреваемые — сама сеть, например изоляция точек доступа или список разрешённых клиентов, привязанный к Wi-Fi-адресам, и таблица соответствий выше указывает, кто именно.