IP送中的解决办法
之前的博客提到过,我在美国的 VPS 部署 sing-box 代理来上网。今天使用手机时突然发现,用 Google 搜索时会被自动重定向到 google.com.hk。不过此时我并没有察觉到问题,直到我打开之前一直用的好好的 Gemini 时,提示我无法在对应区域提供服务。 才令我意识到不对,去网上搜了一下后才知道,这是 Google 将我的美国的 VPS 的 IP 错误地识别为了中国大陆的 IP, 导致不在大陆提供服务的功能无法使用。
这个情况很常见,以至于网上对此有一个专门的称呼:「IP送中」。
IP送中的判断方法
最简单的判断方法是直接用浏览器访问 Youtube 的 Premium 页面。
如果页面提示: 「YouTube Premium 在您所在的国家 / 地区尚未推出」,就表示被送中了。
另一种方式是浏览器访问 Google,搜索任意内容,将结果页面拉到最下方,可以看到 IP 对应的国家,如果显示的是中国,就表示被送中了。
还有一个办法是登陆到 VPS 的终端,执行流媒体检测脚本来测试:
bash <(curl -L -s check.unlock.media)
如果 YouTube Premium 结果为:No (Region: CN),就表示被送中了。
IP送中的原因
我在网上查了一下,可能的原因主要是两种:
- 在使用 Google 相关服务时开启了定位服务,导致 Google 将 IP 和地理位置关联了起来,导致送中。
- VPS 所属的 IP 段有很多 IP 已经被 Google 判定为中国大陆的 IP 了,因此 Google 直接将整个 IP 段送中。
IP送中的后果
汇总我在网上查到的信息,IP 送中的后果主要有:
- AI 相关功能不能使用。
- Youtube Premium 不能使用。
- Google Play 不能下载软件。
- Youtube 不支持后台播放。
- 搜索被重定向到 HK。
不过被送中后也有一个彩蛋,那就是看 Youtube 没有广告了。
解决方案
使用 WARP 代理
网上给出的最多的解决方案,是在 VPS 上使用 WARP 代理到 Google 的访问。WARP 可以简单的理解为是 Cloudflare 提供的 公共 VPN 服务。 这样 Google 得到的 IP 不再是 VPS 的公网 IP,而是 WARP 的 IP。用图表描述一目了然。
使用 WARP 前的请求链路如下:
正在生成中...
使用 WARP 后的请求链路如下:
正在生成中...
这里要注意的是,由于 WARP 增加了一层流量代理,会导致延迟增加。因此只有 Google 相关的站点我们才通过 WARP 去访问,其他站点保持 VPS 直联。这样访问其他站点的延迟和之前一致。
由于我在 VPS 上是部署的 sing-box server 作为代理,大体只需以下四步:
- 注册并获取到一个 WARP 节点。
- 从 WARP 节点的配置文件中找到 WireGuard 相关信息。
- 使用相关信息在 sing-box 的配置文件中增加一个 WireGuard 类型的 Endpoint。
- 在 sing-box 的配置文件中增加对应的分流规则。
之所以配置 WireGuard 类型的 Endpoint,是因为 WARP 底层使用的 VPN 协议就是 WireGuard。
其中第一步可以使用一个名为wgcf工具,它是一个非官方的 WARP 命令行工具。 我只用它的注册 WARP 帐号和 生成 WireGuard 的 Profile 这两个功能。
完整的细节描述
- 从wgcf 的 github 仓库找到最新稳定版,并用 wget 下载到 VPS。
- 运行命令在 Cloudflare 匿名注册一个 WARP 的帐号:
wgcf register
- 运行命令生成 WireGuard 的 Profile 文件。
wgcf generate
如果这两条命令执行成功,应该在当前目录生成两个文件,分别为:wgcf-account.toml 和 wgcf-profile.conf 。
其中 wgcf-profile.conf中的信息就有我们需要的 WireGuard 的全部相关信息,去除隐私信息后的内容如下:
[Interface]
PrivateKey = YOUR_PRIVATE_KRY
Address = 172.16.0.2/32, 2606:4700:110:8b0c:9d49:b408:f767:f370/128
DNS = 1.1.1.1, 1.0.0.1, 2606:4700:4700::1111, 2606:4700:4700::1001
MTU = 1280
[Peer]
PublicKey = YOUR_PUBLIC_KEY
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = engage.cloudflareclient.com:2408
有了这些信息,就可以用来配置 WireGuard 类型的 Endpoint 了。
- 在 sing-box 的
config.json配置文件中增加 WireGuard 相关配置:
"endpoints": [
{
"type": "wireguard",
"tag": "wg-ep",
"system": true,
"name": "wg0",
"mtu": 1280,
"address": [
"172.16.0.2/32"
],
"private_key": "YOUR_PRIVATE_KRY",
"listen_port": 10000,
"peers": [
{
"address": "engage.cloudflareclient.com",
"port": 2408,
"public_key": "YOUR_PUBLIC_KEY",
"allowed_ips": [
"0.0.0.0/0"
],
"persistent_keepalive_interval": 30,
"reserved": [0, 0, 0]
}
]
}
]
从上面的内容可以看到,基本就是按照 sing-box 的配置格式将对应的信息填入就好了,非常简单。
唯一需要注意的是在 1.13 版本前,WireGuard 是通过 Outbound 来配置的,而在 1.13 版本及以后需要用 Endpoint 类型来配置。 sing-box 官方对此有详细的迁移指南。
- 在 sing-box 的
config.json增加分流规则 这里我们就直接使用sing-box官方的 geosite 数据来分流,对应的配置如下:
"route": {
//...其他省略
"final":"direct",
"rules": [
//...其他省略
{
"rule_set": ["geosite-google"],
"outbound":"wg-ep"
}
],
"rule_set":[
{
"tag": "geosite-google",
"type": "remote",
"format": "binary",
"url": "https://github.com/SagerNet/sing-geosite/raw/rule-set/geosite-google.srs"
}
]
}
至此就完成了所有的配置,最后重启 sing-box 就 OK 了。
去 Google 反馈
使用 WARP 代理毕竟是一种绕过问题的解决方案,如果想让 Google 将已经送中的 IP 再改回来,是否有办法呢?
我在网上查了一下,还真有人通过向 Google 反馈的方式成功地将 IP 改了回来。具体的方法如下:
- 通过 Chrome 虚拟定位扩展插件 ( Fake GPS 或 Location Guard 等) 或使用 Chrome 内置传感器来强制固定 GPS 信息为 VPS 所在城市的 GPS 信息。
- 固定 GPS 信息后通过 Google 搜索结果页最下方的
Update location功能更新位置并使用一段时间。 - 去 Google 官方的IP 问题反馈页面进行反馈。
不过这种方式有很大的不确定性,即使反馈了 Google 也不一定会改回来。并且即使改回来了,也已经过了几个月了。
我把这种方式作为锦上添花的方案,准备每隔一两个月想起来了就去反馈一次,万一哪天就成功了呢。