IP送中的解决办法

· 8 min read
Photo by Gemini with Nano Banana 2

之前的博客提到过,我在美国的 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送中的原因

我在网上查了一下,可能的原因主要是两种:

IP送中的后果

汇总我在网上查到的信息,IP 送中的后果主要有:

不过被送中后也有一个彩蛋,那就是看 Youtube 没有广告了。

解决方案

使用 WARP 代理

网上给出的最多的解决方案,是在 VPS 上使用 WARP 代理到 Google 的访问。WARP 可以简单的理解为是 Cloudflare 提供的 公共 VPN 服务。 这样 Google 得到的 IP 不再是 VPS 的公网 IP,而是 WARP 的 IP。用图表描述一目了然。

使用 WARP 前的请求链路如下:

正在生成中...

使用 WARP 后的请求链路如下:

正在生成中...

这里要注意的是,由于 WARP 增加了一层流量代理,会导致延迟增加。因此只有 Google 相关的站点我们才通过 WARP 去访问,其他站点保持 VPS 直联。这样访问其他站点的延迟和之前一致。

由于我在 VPS 上是部署的 sing-box server 作为代理,大体只需以下四步:

  1. 注册并获取到一个 WARP 节点。
  2. 从 WARP 节点的配置文件中找到 WireGuard 相关信息。
  3. 使用相关信息在 sing-box 的配置文件中增加一个 WireGuard 类型的 Endpoint。
  4. 在 sing-box 的配置文件中增加对应的分流规则。

之所以配置 WireGuard 类型的 Endpoint,是因为 WARP 底层使用的 VPN 协议就是 WireGuard。

其中第一步可以使用一个名为wgcf工具,它是一个非官方的 WARP 命令行工具。 我只用它的注册 WARP 帐号和 生成 WireGuard 的 Profile 这两个功能。

完整的细节描述

  1. wgcf 的 github 仓库找到最新稳定版,并用 wget 下载到 VPS。
  2. 运行命令在 Cloudflare 匿名注册一个 WARP 的帐号:
wgcf register
  1. 运行命令生成 WireGuard 的 Profile 文件。
wgcf generate

如果这两条命令执行成功,应该在当前目录生成两个文件,分别为:wgcf-account.tomlwgcf-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 了。

  1. 在 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 官方对此有详细的迁移指南

  1. 在 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 改了回来。具体的方法如下:

  1. 通过 Chrome 虚拟定位扩展插件 ( Fake GPS 或 Location Guard 等) 或使用 Chrome 内置传感器来强制固定 GPS 信息为 VPS 所在城市的 GPS 信息。
  2. 固定 GPS 信息后通过 Google 搜索结果页最下方的 Update location功能更新位置并使用一段时间。
  3. 去 Google 官方的IP 问题反馈页面进行反馈。

不过这种方式有很大的不确定性,即使反馈了 Google 也不一定会改回来。并且即使改回来了,也已经过了几个月了。

我把这种方式作为锦上添花的方案,准备每隔一两个月想起来了就去反馈一次,万一哪天就成功了呢。