Отладка частного DNS Android

Tl;Dr: хочу знать, как устранить проблемы с разрешением DNS Android с помощью Private DNS.

Я создал свой собственный прокси-сервер DoH (Dns-over-Https), чтобы использовать его в качестве «Частного DNS» в Android. Он передает запросы к моей собственной установке dnscrypt-proxy, которая настроена на блокировку некоторых нежелательных доменов. На моем Android он работает, как и планировалось.

Проблема: когда в Android включен мой частный DNS, многие приложения время от времени жалуются на «сеть недоступна» или «домен не может быть разрешен». Это происходит регулярно, и если я отключу Private DNS, эта проблема полностью исчезнет. Например: веб-браузер мог загрузить сайт со второй попытки, приложение онлайн-такси жалуется, что нет интернета, а после перезапуска - работает нормально.

Что я пробовал:

  • Переписать мой DoH-прокси с php (первая специальная версия) на асинхронный python+aiohttp (чтобы решить проблему с истощением рабочих мест на php)
  • Сделал нагрузочное тестирование своего DoH - работает нормально, время запроса-ответа совсем небольшое, даже тогда запросы делаются тысячи в секунду.
  • Добавлен кеш Redis на моем прокси, поэтому все ответы кэшируются для ttl домена.
  • Проверил доступность от разных провайдеров и регионов страны - видимых проблем нет.

Итак, поскольку я не являюсь разработчиком Android, я хочу знать, есть ли способ отлаживать сторонние приложения на моем устройстве Android с помощью USB-отладчика и инструментов Android SDK. Мне нужно глубокое протоколирование процесса разрешения имен, чтобы определить источник проблемы.

Кроме того, если хотите, вы можете проверить мой сервер DoH на https://dns.mihanentalpo.me (вы можете попробовать это с помощью замечательного инструмента dnslookup или прописав dns.mihanentalpo.me в настройки частного DNS вашего Android, будьте осторожны, некоторые домены подключаются к одному и тому же серверу, чтобы «зачернить» их)

Обновлять:

Я сбросил логарифм устройства Android при попытке открыть некоторые приложения, которые обычно страдают от проблем с DNS на моем DNS-сервере. И я получил следующие сообщения:

      java.net.UnknownHostException: Unable to resolve host "relaycn.icloseli.com": No address associated with hostname
   at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:156)
   at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
   at java.net.InetAddress.getByName(InetAddress.java:1106)
   at com.v3.clsdk.session.CLSessionRouter$b.a(CLSessionRouter.java:24)
   at com.v3.clsdk.session.CLSessionRouter$b.call(CLSessionRouter.java:1)
   at java.util.concurrent.FutureTask.run(FutureTask.java:264)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
   at java.lang.Thread.run(Thread.java:1012)
Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
   at libcore.io.Linux.android_getaddrinfo(Native Method)
   at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:133)
   at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:222)
   at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:133)
   at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:135)

До этого и после этого идут сообщения, не связанные с проблемами сети. Кроме того, я отфильтровал весь журнал logcat по идентификатору процесса и не нашел никаких других сообщений.

Итак, на самом деле это «Нет адреса, связанного с именем хоста», но почему это происходит? Может быть, есть какой-то тайм-аут при разрешении имен? Как отладить эту проблему на более глубоком уровне?

Обновление 2: я попробую использовать dnscrypt-proxy, который у меня уже есть, и его функциональность DoH без моей собственной реализации, чтобы посмотреть, лучше это или нет.

0 ответов

Другие вопросы по тегам