很多国内安卓用户都出现过"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网络等等。
Comments | 27 条评论
博主 灰白阶
clash代理可以设置吗??
博主 肤浅若萌
@灰白阶 可以的,指定services.googleapis.cn域名走代理就行,比如路由规则
”DOMAIN-SUFFIX,[services.googleapis.cn],[节点]“
但说句内心话,需要修改配置文件,比较麻烦,对小白不友好;
都快2024年了,不建议使用clash,以前就爆出过多次漏洞,而且修改配置文件麻烦
博主 2710564931
@肤浅若萌 好像现在又多了一个地址,beacons.gvt2.com,加入这个才能完全解决小米手机上等待中的问题
博主 Rick
能讲讲iOS吗?我没有安卓设备,用的app store,和您一样的问题,软路由的passwall一打开,基本上就下载不了app,这将近一年来手机app都是流量下载的
博主 Rick
还有一些Google的设备,Google Nest Hub, Google Home Mini,这些看不了YouTube,问任何问题都是”there’s a glitch, the again in a few seconds”
博主 肤浅若萌
@Rick 我没有这些设备,你可以把软路由的ipv6关了,然后开全局代理,记得把dns解析全改为国外的dns,tcp与udp全代理,试一试能不能正常使用
博主 X
请教一下,我在手机上用的是v2rayNG,按照你介绍的方法,把services.googleapis.cn加入代理中,通过PING的app可以得到services.googleapis.cn 的IP地址是 142.250.72.164. 网上查了一下,这个地址在美国,确实是google的。但是我的Android play store还是无法更新和下载。梯子节点IP在美国。有什么需要进一步配置吗?
Thanks
博主 肤浅若萌
@X 我测试了一下,v2rayng正常下载play store应用
我的设置,启用本地dns,预定义绕过局域网+大陆地址,分应用代理时注意要勾选“play商店”+“play服务”
你可以尝试以上设置,并且把ipv6关了
若仍旧无法下载,安卓端可以用nekobox或者matsuri替代试一试,挺好用的
博主 X
@肤浅若萌 多谢回复。
【我的设置,启用本地dns,预定义绕过局域网+大陆地址,分应用代理时注意要勾选“play商店”+“play服务” 你可以尝试以上设置,并且把ipv6关了】
和你的基本一样。多了一个 “domain:xn-ngstr-lra8j.com"添加到直连的规则中了。
我还有个疑问,添加“services.googleapis.cn”是在自定义规则中的,是不是自定义规则生效了,预定这边的设置就无效了?
我现在找到一个workaround 方法,就是在仓库更新的时候,停止v2rayNG,一会就一个软件成功更新了。但是第二就不行了,只能先停止更新,启动v2rayNG,在按照上面步骤做,再次更新一个。
【若仍旧无法下载,安卓端可以用nekobox或者matsuri替代试一试,挺好用的】
我会试试,多谢!
博主 肤浅若萌
@X 1.我还有个疑问,添加“services.googleapis.cn”是在自定义规则中的,是不是自定义规则生效了,预定这边的设置就无效了?
一般而言,这是一个路由优先级问题。v2ray等代理软件默认会内置路由规则,比如选择“绕过局域网+大陆地址”,然后用户又可以自定义规则,比如让某个域名或者ip走代理,该自定义规则若与内置规则冲突,则冲突部分用户自定义规则优先级大于默认内置的规则;
2.停止v2rayNG,一会就一个软件成功更新了
可能是节点问题。个人建议,切换不同节点,预定义规则设置成全局代理模式测试一下,顺便使用nekobox或者matsuri等不同软件测试一下
博主 wifiyang
@肤浅若萌 网上看到了关于“停止v2rayNG,一会就一个软件成功更新了”的问题描述
Google Play 安装 APP 时一直等待中的解决办法 – 凯撒源的文章 – 知乎
https://zhuanlan.zhihu.com/p/693249978
博主 匿名
我用的钱买的梯子,改了接入点。能下载了,一开始是香港,不行。还没用美国就可以下载了
博主 匿名
oppo用户,昨天play store用不了,今天google账号还存在异常活动。。。手机号被感叹号多次用于验证。。麻了。。看样子得去苹果了。
博主 肤浅若萌
@匿名 是不是手机中病毒了,还是在其它地方登录过账号
你很有可能被盗号了,账号重要的话,赶紧联系谷歌找回账号
博主 匿名
@肤浅若萌 我不清楚手机有没有中毒,不过用起来感觉挺有毒的。。有可能是登录的时候要挂梯子,每次登录的ip地址可能不一样。。盗号这个不太清楚耶,这个号刚注册好的。之前的号也是莫名其妙的挂了。挂梯子这个真的没办法保证每次的ip都一样。。
博主 Snow
我的情况比较妖。原来使用搬瓦工的vps,一切都是很正常,然后昨天新买了一个racknerd的vps,完全参照搬瓦工的配置脚本部署。手机上连rn的节点play就是无法下载,其他都一切正常,节点一换回bwg的,又能下载。两个节点唯一的区别就是vps厂商不同,节点域名不同。然后最妖的是,我用Google Pixel手机连接rn的节点,play又是可以正常下载。。。
博主 肤浅若萌
@Snow 是不是racknerd的vps ip送中了,被谷歌识别为国内机器,鉴于手机又是cn魔改系统,然后谷歌商店下载走国内服务器,实际上谷歌国内服务器不提供内容,导致无法下载;Google Pixel手机的话始终走国外下载,无影响。
如需排查,先看一下rn ip是否送中;其次,开启代理软件日志,看看都有哪些域名和ip,对比分析一下二者不同,是不是国内域名或ip,主要从两个方面分析:
1、国内系统手机,用bwg与rn代理时日志区别;2、同一vps rn,两部手机代理时日志区别。
博主 wifiyang
大佬,我用的安卓的v2rayNG,已经添加了如下的自定义规则(代理的IP)
domain:googleapis.cn
domain:googleapis.com
domain:xn--ngstr-lra8j.com
但还是无法下载google play 的应用
其余的配置是:
从流量中嗅探域名 ✔
启用本地DNS ✔
启用虚拟DNS X
域名策略:IPIfNonMatch
预定义规则:绕过局域网以及大陆
自定义规则:
代理:
domain:googleapis.cn,
domain:googleapis.com,
domain:xn--ngstr-lra8j.com
直连:无
IPV6优先 X
允许局域网 X
跳过验证证书 X
SOCKS5代理端口 : 10808
HTTP代理端口: 10809
远程DNS 8.8.8.8
境内DNS 223.5.5.5
博主 肤浅若萌
@wifiyang 尝试切换梯子ip地址,不要送中ip
建议把日志贴一下
博主 wifiyang
@肤浅若萌 看了一下日志里的地址,在开绕过大陆与局域网的时候的地址好像是国内的,开全局的时候是国外的,但是国外的地址的时候还是不能下载,就不知道为什么
博主 极ArcticFox狐
大佬好~也是遇到了同样的问题。
现在尝试使用v2ray了。。。
请问我之前一直在用的clash为什么最近突然就不能用了?
还有就是现在新软件不大会用。。。能不能教教我QAQ,有点怕在不知不觉中犯什么错(卑微
博主 白雾绕山间
难搞,但是我用的小米,我选择直接刷成国外的rom,问题解决
博主 Alibaba
domain:services.googleapis.cn
domain:xn--ngstr-lra8j.com
都给设置到直连就能用了,给我弄傻了,上一部三星还正常用呢,换到了国内的就怎么都下载不了软件了。
太感谢您了。
博主 ffff
nekobox 路由设置里有专门为Google play store设置的规则,选上就行了。
博主 Keuekjon
I have been using soft routing since 2020 covid started. And I was having this issue. Finally solved the problem, by reading your article. Thank you very much.
博主 南梦宫
感谢, 解决了一直以来的问题, 太厉害了哈哈