很多国内安卓用户都出现过"play商店的应用能够正常浏览,但无法正常下载或更新"的问题,有人说是梯子线路问题,也有人说是由于"国产魔改安卓系统"、ipv6、udp未代理等原因导致,互联网上又没有一个比较系统的解决办法,今天博主就来分析总结一下,顺带谈一下国内外不同dns解析对于全局代理的影响,比如,全局代理模式下,为什么无法观看b站港台影视内容。

Ⅰ.环境&问题

1.环境

  • openwrt软路由,作为主路由;
  • 家庭网络仅有ipv4、无ipv6;
  • 国内oppo手机,安卓13国内厂商定制化系统;

2.现象

  • openwrt关闭科学插件,连接wifi,同一个节点,在手机上使用软件 v2rayNG 选用"绕过局域网及大陆后代理"模式,play商店可以正常浏览与下载;
  • openwrt关闭科学插件,连接wifi,同一个节点,在手机上使用软件 Matsuri ,路由选项上不勾选代理"中国Play 商店规则",play商店可以正常浏览,无法正常下载;勾选后可以正常下载;
  • openwrt启用科学插件ssr-plus或passwall,连接wifi,同一个节点,国内域名用国内dns解析、国外域名用国外dns解析,选择"绕过中国大陆ip"模式,play商店可以正常浏览,但是无法正常下载,进度条始终为0或者一直转圈等待;
  • 博主家电视用的chromecast with google tv,平时在盒子的 play商店 下载软件,在前面三种网络情况下都可以正常浏览与下载;

Ⅱ.国内手机定制化系统

国内安卓手机魔改定制化系统,是引起"Play商店不能正常下载或更新应用"的主要原因。

1.原因分析:

1.1 Play商店不能下载的主要原因

2016年就有消息称“谷歌要推出 Google Play China版”,虽然后来没有大范围推广,但仍有影响。至今,国内安卓手机出厂自带谷歌服务(google play service)软件,与国际版本存在差异。比如谷歌服务,国际版的api请求域名为"services.googleapis.com",国内版的api请求域名为"services.googleapis.cn",而后者在大多数代理软件上都默认为cn域名,即便选择全局代理模式,由于国内域名采用国内dns地址,代理软件会把域名解析为国内ip,在这些地址上谷歌又没有提供相应的服务,导致请求无效,"services.googleapis.cn"解析为国内地址时,会返回国内cdn的下载地址,其域名形式为"[xxxx]-xn--ngstr-lra8j.com",而且国内cdn会阻止国外ip的访问,若此时域名"xn--ngstr-lra8j.com"走代理,请求无效,即表现为无法下载;若使用v2rayng下载paly商店应用,在提示"正在等待"时关闭代理,表现为又可以正常下载【2024.05.21 更新】;

1.2 全局代理模式下为什么不能访问国内网站的海外内容

上面的情况,也说明了一个问题,若将国内外域名分别采用国内外dns服务器解析,全局代理只是改变了访问服务器的路由。此时访问国内网站,会使用代理线路访问,但国内网站的域名仍解析为国内ip,实际上访问的服务器地址不变。具体表现为,使用港台节点“全局模式代理”下访问哔哩哔哩,无法观看b站的港台影视内容;经过博主实测,ping检测,此时b站的域名dns解析地址为国内地址,此时的请求路由如下,国内用户--国外节点--国内b站服务器,虽然在b站看来"访问者是港台用户",但是b站的国内cdn节点服务器只能提供国内内容,无法提供港台影视内容;

以上这就是全局代理模式下,用户无法观看b站港台影视内容的原因。聪明的你可能已经想到了解决办法,将国内外dns服务器统一改为国外不就好了。但是仍旧存在以下问题。

一方面,部分代理软件不支持指定国内dns服务器,对于小白用户,麻烦。另一方面,即便统一指定国外dns服务器,部分国内网站(如b站、淘宝、微博等)会被解析到其国外cdn节点服务器,由于国内外服务器的空间距离与提供内容差异,会导致用户访问非常慢,具体表现为刷新页面卡顿、加载图片慢甚至部分图片无法加载等;若统一指定为国内dns服务器,就会出现上述无法观看b站港台影视内容的情况,而且部分国外域名还会存在dns污染问题。

故,针对有访问国内网站的海外资源的用户,主要有两个方法:

  • 自己捣鼓dns解析,比如指定国内网站的dns服务器为海外dns服务器,或者指定特定域名的解析地址为其国外cdn节点;
  • 告诉代理软件强制代理特定的网站域名,详见下面"3.2 强制域名走代理"部分。

2.验证方法:

回归正题,验证一下"国内安卓手机魔改定制化系统是否魔改了谷歌服务":

博主手里的oppo手机,系统自带谷歌服务,在apkpure上更新软件 google play service ,会提示"安装失败,已安装了签名冲突的应用",这说明了国内安卓手机自带的软件 google play service 与国际版本不同;

手机下载ping工具,在"全局代理模式"情况下 ping域名 "services.googleapis.cn"。当域名解析为国内ip地址时,play商店无法下载;当域名解析为国外ip地址时,play商店能正常下载。这说明域名"services.googleapis.cn"是引起"play商店下载失败"的主要原因。

3.解决办法:

针对国内魔改安卓手机,play商店无法下载或更新软件的情况,有多种解决办法,主要就是dns解析的问题。

3.1 指定域名解析:

在软路由上自定义dns解析,openwrt--网络--DHCP/DNS--自定义挟持域名,将域名"services.googleapis.cn"的ipv4指定为任意一个正常工作的"services.googleapis.com"的ipv4,比如"142.250.69.202"。但是该方法不长久,若指定的ipv4地址不能正常工作,那么谷歌商店请求也无法正常得到回复,无法下载;

3.2 强制域名走代理:

  • 手机代理软件 Matsuri 与 SagerNet,注意路由规则里勾选"中国Play 商店规则";
  • ssr-plus插件,访问控制--强制走代理的域名,添加域名"services.googleapis.cn",保证&应用;然后关闭插件,重新启用插件(坑,代理规则失效需要代理插件关闭,在开启才生效);
  • passwall插件,同ssr-plus插件设置也行;不过也可以换方法,规则管理--V2ray/Xray 分流规则--Proxy--域名,添加以下内容:
    geosite:geolocation-!cn
    geosite:google@cn
  • passwall2插件,升级到最新版,分流总节点,GooglePlay 选项 选择“默认”或者某个节点,千万不要选择关闭【2024.04.22 更新

3.3 代理软件不做dns查询

让代理软件对特定的域名不做dns解析,交给海外节点服务器做dns域名解析处理,海外节点肯定调用国外dns服务器处理,解决了play商店不能下载或更新的问题。但这种方式操作比较复杂,涉及到域名分流规则、dns请求黑名单等,不适合大部分人;而且如果厂商把特定域名全球的dns解析都设定成国内,比如域名"services.googleapis.cn",只用于中国市场,假设其全球解析结果都是国内ip,由于目前谷歌国内服务器不提供内容,那就必须手动指定其解析结果为国外ip,才能正常获取内容。所幸的是,到目前为止,博主测试了,域名"services.googleapis.cn"的国外dns解析结果是国外ip地址。

3.4 安装国际版 google play service

博主的手机的谷歌服务(google play service)软件,不能卸载,更新为国际版又不兼容,会玩adb的朋友,可以试一下;如果你的手机还没有安装谷歌服务(google play service)软件,可以安装成国际版的,避免一切苦恼。

4.注意事项

  • 按照上面方法设置好后,建议使用ping工具,检查一下域名"services.googleapis.cn"的解析地址是否为国外;
  • 如果依然在国内,请把openwrt科学插件重启,把安卓手机重启,避免规则未应用以及手机端dns缓存;
  • 注意手机省电设置,将软件 谷歌服务(google play service)设置为"完全允许后台",即这个软件不要优化省电。对于代理软件,比如v2rayNG而言,也是不要优化省电,这样软件才不会被杀后台。

Ⅲ.网络问题

个人经验,网络方面主要是ipv6、"梯子节点ip"、udp代理三方面

1.IPV6

截至博主写这篇博客的时候,部分代理软件不支持代理ipv6,即便软件支持代理ipv6,也需要节点支持ipv6,否则也不行;这导致一个问题,若家庭网络环境有ipv6,安卓手机能够分配到ipv6,通常 play商店 下载时只会连接ipv6服务器,不会连接ipv4服务器。

故,对于ipv6网络而言,要么代理软件不支持代理ipv6,直接放行,直连谷歌,被防火墙阻断;要么代理软件支持代理,但是节点不支持,无效请求。所以针对这种情况,不熟悉的小白建议直接关闭ipv6;对于nas用户,别把nas放在openwrt下级网络;

对于旁路由ipv6用户,由于ipv6在安卓端无法指定网关与dns,不管旁路由代理软件支不支持ipv6,手机的ipv6请求都是不走旁路由,直连谷歌,被防火墙阻断。旁路由用户请大胆关闭ipv6。

如要使用ipv6,方法有二种:

  • 代理 IPv6:请确保节点支持ipv6,openwrt可以使用passwall,高级设置--转发配置--IPv6透明代理(TProxy),勾选保存&应用;手机端,大部分都支持代理ipv6;
  • 禁止解析 IPv6 DNS 记录:openwrt系统,网络--DHCP/DNS--高级设置,勾选"禁止解析 IPv6 DNS 记录",保存&应用;

2.梯子节点ip

个人经验,在梯子节点ip被"送中"后(本来节点ip为国外ip,但谷歌通过位置信息等大数据分析,认为梯子ip位于中国。具体表现为youtube视频没有广告、订阅youtube会员提示该地区未推出premiun服务、谷歌搜索引擎底部显示国内地址等等),很有可能无法下载更新 play商店的软件,这种情况建议在确保没有上面的域名问题后,再切换线路测试;

以及个人猜测,谷歌的异常流量审查,一般节点都是IDC机房ip,容易风控,体现为谷歌搜索间歇性抽风,无法打开,但是youtube等又可以打开。

3.UDP代理

有人认为,play商店部分请求为quic(UDP请求),但在UDP协议未代理的情况下(比如naiveproxy就不支持代理UDP),可能无法下载;

但博主实测,使用naiveproxy等协议的节点,在openwrt的ssr-plus、passwall等插件上关闭UDP代理的情况下,play商店 依旧可以正常浏览与下载软件。

Ⅳ.总结一下

当大家知道了代理软件工作的流程与原理(就是dns解析与路由代理),其实大部分问题就迎刃而解了,尤其对于dns解析,是不可忽视的一环,其决定了我们访问的服务器地址,即决定了我们能够访问到的内容。

对于大部分代理软件而言,"全局代理模式"只是意味着访问路由全部走国外节点,但是dns解析则不一定使用国外dns服务器,对于国内网站,徒增访问延迟,拉低用户体验!!!

之所以写这么多,就是想系统地谈一谈,如果你有相关的经历与经验,欢迎评论区留言补充。

Ⅴ.后续更新

2024.04.22 更新

今天博主安卓手机状态栏一直显示“Google play 商店正在下载...”,持续了一个小时还没有下载完成。我感觉应该是openwrt分流出问题了,想起昨晚把passwall2分流总节点的 GooglePlay 选项关闭了,不对GooglePlay进行分流。于是,我把 passwall2 分流总节点的 GooglePlay 选项改成 “默认”,走默认代理节点,play 商店正常下载更新了。看了一眼passwall2的分流域名,发现不止前面说的"services.googleapis.cn",还有其它域名,特意更新记录一下。

参考passwall2配置,Google Play分流相关域名不仅仅有"googleapis.cn",还有"googleapis.com"与"xn--ngstr-lra8j.com",应添加的代理域名匹配规则:

domain:googleapis.cn
domain:googleapis.com
domain:xn--ngstr-lra8j.com

一般情况下,你只需要将"services.googleapis.cn"与"xn--ngstr-lra8j.com"加入代理域名列表,走远程dns查询即可;如仍然不可下载,请添加上面所有代理域名匹配规则。

简单理解此处域名匹配规则:
以 domain: 开头,域匹配。e.g: googleapis.cn 会匹配自身 googleapis.cn,以及其子域名 www.googleapis.cn, services.googleapis.cn 等。

更多域名匹配规则可参考 V2ray 路由规则mosdns wiki 域名匹配规则

2024.05.21 更新

今天看见评论区有人说,在网上看到了关于“停止v2rayNG,一会一个软件成功更新了”的问题描述[问题讨论地址]。我看了之后又在网上搜索了一下,总结一下。

前提情况,对于"[xxxx].xn--ngstr-lra8j.com"域名,大多数代理软件默认走代理,但是"services.googleapis.cn/com"则不一定。

首先,在play store下载应用时,谷歌商店会根据谷歌账号区域、使用者ip、手机系统ROM等判断应用下载地址为"services.googleapis.cn"还是"services.googleapis.com";然后,相关下载地址会302跳转到真正的谷歌全球CDN下载地址,形式为"[xxxx].xn--ngstr-lra8j.com":

  • 若下载地址返回的是"services.googleapis.cn",且"services.googleapis.cn"没有走代理,则返回的cdn地址为国内地址,此时若"[xxxx].xn--ngstr-lra8j.com"没有走代理,则下载速度非常快,若走代理,由于国内cdn阻止国外访问,表现无法下载,无限等待;
  • 若下载地址返回的是"services.googleapis.cn",而"services.googleapis.cn"走了代理,则返回的cdn地址为国外地址,此时若"[xxxx].xn--ngstr-lra8j.com"没有走代理,则可能无法下载,若走代理,表现正常下载,但速度不如国内cdn时快;
  • 若下载地址返回的是"services.googleapis.com",且"services.googleapis.com"没有走代理,不挂梯无法连接该地址,无法下载;
  • 若下载地址返回的是"services.googleapis.com",且"services.googleapis.com"走了代理,正常连接,返回的cdn地址为国外地址,此时若"[xxxx].xn--ngstr-lra8j.com"没有走代理,可能无法下载;

总结一下,若返回地址为"services.googleapis.cn",只需要保证"services.googleapis.cn"与"[xxxx].xn--ngstr-lra8j.com"同时走代理或者同时直连即可,可使用以下域名匹配规则:

domain:services.googleapis.cn
domain:xn--ngstr-lra8j.com

但问题的关键还是在于谷歌对于"services.googleapis.cn"还是"services.googleapis.com"的判断,结合网上信息以及个人经验:

  • 国产ROM系统不会考虑谷歌账号区域、使用者ip等因素,默认为"services.googleapis.cn"。个人oppo安卓14,查看v2rayng日志,发现在下载应用时有一条域名重写,"services.googleapis.cn"重写为"services.googleapis.com";
  • 国区账号、送中ip、或部分香港ip,极有可能为"services.googleapis.cn",此时若"services.googleapis.cn"与"[xxxx].xn--ngstr-lra8j.com"没有同时直连或同时走代理,则无法下载。

我个人使用nekobox与v2rayng分别测试了一下,在返回"services.googleapis.cn"且同时设置"services.googleapis.cn"与"xn--ngstr-lra8j.com"都直连时,nekobox和v2rayng都无法下载,日志显示"返回的是国外cdn下载地址"且显示走直连,连接失败;个人衷心建议让"services.googleapis.cn"与"xn--ngstr-lra8j.com"都走代理,其适用范围更广、实用性更强,配置更简单。若在以上配置均无问题后,可多次尝试切换节点,换用不同ip,清楚商店缓存、关闭ipv6网络等等。


“一花一世界,一叶一天堂。君掌盛无边,刹那成永恒。”