Отладка частного 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 без моей собственной реализации, чтобы посмотреть, лучше это или нет.