首先声明:这个问题来自 IPv6 主题的新手。
我们的网络服务器最初启用了 IPv6,但 Nginx 配置不正确,因此使用 IPv6 的用户会遇到错误,网站无法加载。
配置 Nginx 以监听 IPv6 后,网站可以正常加载,但对于使用 IPv6 的用户,地理定位失败(我们使用 Maxmind 免费数据库),因此他们都被定位在美国。
然后我禁用 IPv6 支持,现在它似乎运行良好,即使客户端使用 IPv6,我的网站也可以看到 IPv4,然后在正确的国家/地区对其进行地理定位。
问题是:
- 当 IPv6 客户端查询我的网站时,究竟会发生什么?如果他也有 IPv4,那么 IPv6 就失去了意义(因为我们的 IPv4 快用完了)?
- 基于 IPv4 的地理定位可靠吗?
- 不支持 IPv6 有什么缺点吗?
答案1
配置 Nginx 以监听 IPv6 后,网站可以正常加载,但对于使用 IPv6 的用户,地理定位失败(我们使用 Maxmind 免费数据库),因此他们都被定位在美国。
确保您使用的是正确的数据库。一些 geoip 产品有针对 IPv4 和 IPv6 的单独数据库(AIUI 和 maxmind 旧产品分为单独的 v4 和 v6,而 geoip2 产品在一个数据库中涵盖两者)。
当 IPv6 客户端查询我的网站时,究竟会发生什么?如果他也有 IPv4,那么 IPv6 就失去了意义。
有不同类型的客户需要考虑。
- 仅限 IPv4 的客户端,只能使用 IPv4,如果仅限 v6,则将无法访问您的站点。
- 真正的仅 IPv6 客户端。如果您的网站仅支持 IPv4,则这些客户端将无法访问您的网站。目前此类客户端极为罕见。
- 传统的双栈客户端同时具有 IPv4 和 IPv6。IPv4 很可能在前提边界进行网络地址转换,并且越来越有可能由 ISP 进行网络地址转换。
- 仅使用基于 ISP 的 DS-Lite 网关的 IPv6 客户端访问 IPv4 Internet。
- 仅使用基于 ISP 的 NAT64/DNS64 网关的 IPv6 客户端访问 IPv4 Internet。
情况 1 和 2 非常明显。
对于情况 3 和 4,客户端可能会尝试 IPv4 和 IPv6。一般来说,如果发现两者都有,它会首先尝试 IPv6。
对于案例 5,如果存在记录,客户端将使用您的 IPv6 地址。如果您不提供 IPv6 地址,它将使用由 NAT64/DNS64 网关合成的 IPv6 地址。然后,NAT64 会将来自客户端的 IPv6 流量转换为 IPv4 流量以发送给您。
(这是因为我们的 IPv4 用完了)?
最初的想法是,我们将从仅使用 v4 转向双栈。然后,一旦每个人都使用双栈,我们就可以开始关闭 IPv4。希望这能在 IPv4 地址用完之前实现。
这并没有发生,原因有很多,包括象牙塔标准忽视了互联网的现实,以及当没有其他人这样做时很难为 IPv6 建立商业案例这一简单事实。
因此,现在我们处于一个令人悲伤的境地:IPv4 地址基本上已经用完了,但互联网的大部分仍然仅限于 IPv4。
因此,互联网服务提供商被迫采取行动,在 IPv4 耗尽后继续发展,许多服务仅支持 IPv4。他们基本上有三个选择。
- ISP 级别的传统 NAT(通常称为“运营商级 NAT”)。这可能会或可能不会伴随推出 IPv6 双栈。
- DS-Lite。在此系统中,IPv4 数据包被封装(通常由 CPE 封装)并通过隧道传输到 ISP 上的特殊 NAT。此 NAT 具有扩展的映射表,不仅可以识别内部 IP 和端口,还可以识别隧道传输流量来自哪个 IPv6 地址。
- NAT64/DNS64。在此系统中,ISP 的 DNS64 服务器会合成没有任何指向 NAT64 框的主机名的 AAAA 记录。然后,NAT64 服务器将客户端 IPv6 流量转换为 IPv4 流量。
所有这些选项最终都归结为实施允许多个客户共享 IPv4 地址的机制。
基于 IPv4 的地理定位可靠吗?
地理定位始终依赖于地理定位数据的准确性。随着 IPv4 地址越来越稀缺,它们可能会被不断移动,从而降低地理定位的准确性。
此外,由于 IP 共享机制,不同位置的用户可能使用同一个 IP。地理位置数据库对此无能为力。
不支持 IPv6 有什么缺点吗?
除了地理位置问题之外,还有三个主要考虑因素。
- 性能和可靠性。ISP 可用于在多个用户之间共享 IPv4 地址的所有机制都可能降低性能和可靠性。它们降低的程度取决于 ISP 部署它们的能力。
- 滥用控制。如果您拥有的只是共享的 IPv4 地址,那么追踪滥用者(禁止他们或向其 ISP 举报)将变得更加困难。
- 长期未来。目前仍有足够多的 v4 专属内容,ISP 被迫为其用户提供访问 v4 专属内容的机制。但最终可能会出现 v4 专属内容数量下降到一定程度,ISP 不再认为有必要继续维持这些机制。
答案2
如果国家级粒度对您来说已经足够,那么您可以简单地依赖 whois。不要对您看到的每个客户端 IP 地址都查询 whois。当您看到新 IP 并查询 whois 时,请缓存该范围,以便将来对该范围内的 IP 地址的请求不会触及 whois。如果您没有收到 whois 的回复,那么在接下来的 24 小时内不要尝试对同一个 /32 使用 whois。
如果您需要更细粒度的数据,或者如果 whois 数据的缓存比您想要实现的更复杂,那么您需要找到一个可以为您提供 IPv6 数据访问权限的提供商。您不必为 IPv4 和 IPv6 使用同一个提供商。
对于同时使用 IPv4 和 IPv6 的客户端,您可以自行构建有关地址对应关系的数据。如何做到这一点之前回答过。
如果客户端和服务器都支持双栈,则由客户端决定使用 IPv4 还是 IPv6。自 2010 年以来,客户端尝试使用两者中速度最快或最可靠的协议被认为是最佳实践。
有些客户端的 IPv6 连接比 IPv4 连接更可靠。如果您的网站仅支持 IPv4,这些客户端会觉得您的网站不可靠。这种情况的用户比例将不断增长。