恢复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”?
网络访问从本质上说分两步:
DNS 解析:把域名转换成一个或多个 IP 地址
发起连接:根据返回的 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 | { |
这份配置做了什么?
① 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 字段改写为新语法。
若你使用的是类似软件,也可以根据对应的配置进行修改。
实质思路是:
DNS 只返回 IPv6
出站禁止 IPv4
其他版本中只要能够表达这两个条件,本质上就是等价的策略。
最后总结
本文配置通过同时在 DNS 和出站层双向约束 IPv6,可以实现精准、稳定的 IPv6 强制访问策略,避免因为 IPv4 地址解析或回退带来的路径不一致问题。这种做法不仅适用于 Google / Gemini,也可以推广到其他在 IPv6 网络下表现更佳的服务。