问题描述
希望通过某种方式始终将特定网站的域名解析为其固定的IP地址(例如:104.25.31.35
),而不需要编辑系统文件/etc/hosts
。讨论了几种可能的方法,但普遍认为这种方法存在一定的限制。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1:直接输入IP地址
直接在浏览器地址栏输入IP地址(例如:http://104.25.31.35
或https://104.25.31.35
)访问网站。这种方法适用于简单的情况,但如果Web服务器依赖于host
头或SNI(服务器名称指示)进行虚拟主机配置,则这种方法不可行。
方案2:使用Android的VpnService API
可以利用Android的VpnService API捕获所有DNS流量,而无需root设备。这种方法可以通过安装某些应用程序(如Cloudflare OneDotOneDotOneDotOne或NetGuard)实现。这些应用可以在向上游DNS服务器查询之前,使用自定义的hosts
文件。Virtual Hosts是一个开源的应用程序,可以实现这一点。
方案3:设置自定义DNS服务器
可以设置一个自定义的DNS服务器(本地或云端),并通过相应设置让设备使用该DNS服务器。例如,如果使用dnsmasq
,可以在dnsmasq.conf
中添加address=/wex1.in/104.25.31.35
;或者在dnscrypt-proxy
中添加wex1.in 104.25.31.35
到cloaking-rules.txt
。大多数DNS服务器都可以配置为返回预定义的IP地址。
方案4:使用代理或VPN
可以配置设备使用代理或VPN服务,并在代理服务器或VPN服务器上添加104.25.31.35 wex1.in
到hosts
文件中。这样即使不root设备,也可以达到目的。
方案5:解锁Bootloader并编辑/system分区
如果设备已经解锁Bootloader并且有定制恢复系统可用,可以在恢复模式下挂载/system
分区并编辑hosts
文件。确保设置正确的权限(所有权、模式和SELinux标签)。如果不想修改/system
分区(例如,避免破坏dm-verity
或OTA更新),可以从/data
分区绑定挂载一个自定义的hosts
文件,但这需要额外的努力,如定义一个init
服务、修改SELinux策略等。
方案6:使用Private DNS功能
确保不使用Private DNS(Android 9+),以确保DNS查询总是通过未加密的端口53进行。
以上方法中,最简便的方式是使用VpnService API或自定义DNS服务器。这些方法可以在不root设备的情况下实现域名到固定IP的解析。