恢复google正常地区识别

背景

使用公共vps主机商服务(尤其是使用代理或加速器)时,多个租户会使用相同网段,虽然不使用同个IP,但google识别到同一网段的其他IP属于不再机房所在地区时(主要是中国大陆地区),会将同一网段中的所有IP均标记识别到的机器。

这就诞生了这样的需求,怎么在不更换IP的情况下把IP给拉回实际的机房所在地区,主流的做法有:
向 Google 申诉: 访问 Report IP problems,提交你目前的 IP 地址和它应属的正确国家。这通常需要 1 到 2 周时间生效。
访问定位修正页面: 在登录 Google 账号的情况下,访问 google.com/search?q=ip 并滚动到底部,点击“使用精确位置”,后续不管使用何种方法只要让识别的地区为实际地区即可。

但这两种方法成功率都不高,原因无外乎两点:1. vps同一网段中的邻居能出发一次Google识别,后面就会无数次;2.Google申诉的成功率本来就极低。

本文提出一种另类思路进行规避:通常被Google检测到的IP都是IPv4,而IPv6往往不会影响。我们可以通过dns或者分流操作,针对部分服务(例如 Google 全家桶、Gemini API)强制使用 IPv6 出站,而其他网站继续使用正常的 IPv4/IPv6 调度。这样实现后:

  • IPv6 在某些国际网络下更加稳定、丢包率更低
  • 避免某些针对 IPv4 的流量限制或劫持
  • 保证对特定服务的访问路径单一、可控

本文结合真实配置,给出一种在 sing-box 上实现这一目标的方案。


为什么要做“只走 IPv6”?

网络访问从本质上说分两步:

  1. DNS 解析:把域名转换成一个或多个 IP 地址

  2. 发起连接:根据返回的 IP 实际发起 TCP/UDP 连接

如果只在某一层去倾向 IPv6,而另一层仍允许 IPv4,那么:

  • 解析得到的 IPv4 地址可能仍然被使用

  • 或者连接尝试中可能 fallback 到 IPv4

因此为了保证“只用 IPv6”,必须同时在 DNS 层出站层 都进行限制。


实现思路(内核)

要达到只允许某些域名通过 IPv6 出站访问,关键是:

1. DNS 只返回 IPv6

通过 sing-box 的 DNS 配置,让针对特定域名的解析策略为:

  • 只使用返回 AAAA(IPv6)记录

  • 不返回 A(IPv4)记录

也即在 DNS 阶段只给出 IPv6 地址供后续连接使用。

2. 出站连接只允许 IPv6,不 fallback

即便 DNS 只返回 IPv6,如果连接层默认允许 IPv4 fallback,仍有可能在某些条件下回退。
所以在出站策略中使用 ipv6_only 来确保:

只允许创建 IPv6 连接,若没有 IPv6 则直接失败


配置文件(sing-box 1.12.x)

下面是示例的完整配置,可以直接用在服务端的 /etc/sing-box/config.json 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
{
"log": {
"level": "info",
"timestamp": true
},
"dns": {
"servers": [
{
"tag": "dns-google-ipv6",
"address": "tcp://[2001:4860:4860::8888]",
"strategy": "ipv6_only"
},
{
"tag": "dns-direct",
"address": "8.8.8.8",
"strategy": "ipv4_only"
}
],
"rules": [
{
"domain_suffix": [
"google.com",
"googleapis.com",
"gstatic.com",
"googlevideo.com",
"youtube.com",
"ytimg.com",
"ai.google.dev",
"gemini.google.com"
],
"server": "dns-google-ipv6"
}
],
"final": "dns-direct"
},
"inbounds": [
{
"type": "socks",
"tag": "socks-in",
"listen": "127.0.0.1",
"listen_port": 1080
}
],
"outbounds": [
{
"type": "direct",
"tag": "google-ipv6",
"domain_strategy": "ipv6_only"
},
{
"type": "direct",
"tag": "direct"
}
],
"route": {
"rules": [
{
"domain_suffix": [
"google.com",
"googleapis.com",
"gstatic.com",
"googlevideo.com",
"youtube.com",
"ytimg.com",
"ai.google.dev",
"gemini.google.com"
],
"outbound": "google-ipv6"
}
],
"final": "direct"
}
}

这份配置做了什么?

① DNS 阶段

  • 默认 DNS 使用 IPv4(8.8.8.8)

  • 对 Google / Gemini 这类域名匹配规则,使用 IPv6 DNS

  • 并通过 strategy: ipv6_only 只允许 AAAA 记录

  • 所有其他域名继续用默认 DNS

这意味着,在 DNS 层,这些目标域名 不会返回 IPv4 地址


② 出站阶段

配置了两个出站:

  • google-ipv6:只允许 IPv6 连接

  • direct:默认 IPv4/IPv6 皆可

再通过 routing 规则让 Google / Gemini 的流量走前者。


版本兼容性注意

本文的配置在 sing-box 1.12.x 环境下验证可用。不同版本的 sing-box 在 DNS 语法上存在变动(新版可能采用 map 结构替代 legacy arrays),因此:

若你使用的是更高版本(例如 1.13 / 1.14+),可依据本文思路将对应的 DNS / routing 字段改写为新语法。

若你使用的是类似软件,也可以根据对应的配置进行修改。

实质思路是:

  1. DNS 只返回 IPv6

  2. 出站禁止 IPv4

其他版本中只要能够表达这两个条件,本质上就是等价的策略。


最后总结

本文配置通过同时在 DNS 和出站层双向约束 IPv6,可以实现精准、稳定的 IPv6 强制访问策略,避免因为 IPv4 地址解析或回退带来的路径不一致问题。这种做法不仅适用于 Google / Gemini,也可以推广到其他在 IPv6 网络下表现更佳的服务。