Android私有DNS解析问题调试方法求助及自建DoH服务排查
调试Android私有DNS(Private DNS)解析异常问题
问题背景
搭建了自定义DoH(DNS-over-HTTPS)代理服务器,作为Android设备的私有DNS,将请求转发至自建的dnscrypt-proxy(已配置拦截部分恶意域名)。功能基本正常,但存在异常:启用私有DNS后,多款应用频繁提示「网络不可访问」或「域名无法解析」,关闭私有DNS则问题消失(如浏览器重试可加载页面、打车App重启后恢复)。
已尝试的排查方案
- 将DoH代理从PHP临时版本重写为异步Python+aiohttp版本,解决PHP工作进程耗尽问题
- 对DoH服务进行负载测试,每秒数千请求下响应时间仍处于较低水平
- 为代理添加Redis缓存,按域名TTL缓存所有响应
- 验证不同运营商及地区的可达性,未发现明显问题
核心诉求
本人并非Android开发者,希望了解如何通过USB调试及Android SDK工具对第三方应用进行深度调试,获取DNS解析过程的详细日志以定位问题根源。
后续更新
更新1
抓取到出现DNS问题时的Android设备logcat日志,报错如下:
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)
前后无相关网络问题日志,按进程ID过滤后也未发现其他关联信息。疑问:为何会出现「无关联主机地址」?是否存在解析超时?如何进行更深层次的调试?
更新2
尝试直接使用已部署的dnscrypt-proxy自带的DoH功能,验证问题是否改善。
更新3
改用doh-server替代自建Python版DoH代理后,DNS解析问题大幅减少但仍有少量存在,将尝试AdGuard DNS代理以验证是否彻底解决,但仍缺乏Android端DNS查询的调试工具与方法。
更新4
安装AdGuardHome后,所有上述问题均消失,后续将排查原因。
内容的提问来源于stack exchange,提问作者MihanEntalpo
相关产品推荐
相关产品推荐

