Я создал свой собственный DoH (Dns- over-Https) прокси-сервер, чтобы использовать его в качестве «Частного DNS» в Android. Он передает запросы к моей собственной установке dnscrypt-proxy, которая настроена на блокировку некоторых нежелательных доменов. На моем Android все работает, как и планировалось.
Проблема: когда в Android включен мой частный DNS, многие приложения время от времени жалуются на «сеть недоступна» или «домен не может быть разрешен». ". Это происходит регулярно, и если я отключу Private DNS, эта проблема полностью исчезнет.
Например: веб-браузер мог загрузить сайт со второй попытки, приложение онлайн-такси жалуется, что нет интернета, и после того, как я перезапускаю - работает нормально.
Что пробовал:
- Переписываю свой DoH-прокси с php (сначала специальная версия) на асинхронный python+aiohttp (чтобы решить проблему с истощением рабочих мест на php)
- Сделал тест нагрузочного тестирования моего DoH - работает нормально, время запроса-ответа равно довольно маленький, даже при этом выполняются тысячи запросов в секунду.
- Добавлен кеш Redis на моем прокси, поэтому все ответы кэшируются для ttl домена.
< li>Проверил доступность у разных провайдеров и регионов страны - видимых проблем нет.
Мне нужно глубокое протоколирование процесса разрешения имен, чтобы определить источник проблемы.
Кроме того, если хотите, вы можете проверить мой сервер 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)
Итак, на самом деле это сообщение «Нет адреса, связанного с именем хоста», но почему оно случилось?
Может быть, есть какой-то тайм-аут при разрешении имен? Как устранить эту проблему на более глубоком уровне?
Обновление 2: я попробую использовать dnscrypt-proxy, который у меня уже есть, и это DoH. функциональность без моей собственной реализации, чтобы увидеть, лучше она или нет.
Обновление 3: я пытался использовать doh-сервер (DNS-over-HTTPS-прокси) сервер) вместо моего самописного DoH-прокси на основе Python, и теперь у меня гораздо меньше проблем с разрешением имен Android. У меня еще есть, но не так много.
Итак, кажется, что часть проблемы была в моем сервере, но в некоторой степени она все еще сохраняется. Попробую проверить adguard dns proxy, и проверю, возможно все проблемы уйдут.
Хотя у меня до сих пор нет инструмента или метода отладки DNS-запросов на Android, это даст мне корень проблемы.
Обновление 4: установлен AdguardHome, и он волшебным образом работает без каких-либо упомянутых проблем. Теперь я могу попытаться выяснить, почему
Подробнее здесь: https://stackoverflow.com/questions/769 ... rivate-dns
Мобильная версия