【问题标题】:Converting IPv6 to IPv4 address in PHP在 PHP 中将 IPv6 转换为 IPv4 地址
【发布时间】:2018-01-23 22:56:08
【问题描述】:

我需要将 IPv6 地址转换为 IPv4 地址。为此,我使用了来自pedmillon's answer to a related question的代码:

$ipv6 = $_SERVER['REMOTE_ADDR'];
$ipv4 = hexdec(substr($ipv6, 0, 2)). "." . hexdec(substr($ipv6, 2, 2)). "." . hexdec(substr($ipv6, 5, 2)). "." . hexdec(substr($ipv6, 7, 2));

我在本地主机中尝试过, ::1 被转换为 0.1.0.0。这段代码是否正常工作?

我相信它应该显示 127.0.0.1 而不是 0.1.0.0。

【问题讨论】:

  • 无法将 IPv6 地址转换为 IPv4 地址。这就像想把苹果变成香蕉。首先,有 340,282,366,920,938,463,463,374,607,431,768,211,456 个可能的 IPv6 地址,而只有 4,294,967,296 个可能的 IPv4 地址。所以让我提炼一下:这就像想把相当于几个星系的苹果变成一根香蕉。
  • hmm.. 如果我强制我的 Apache 使用 IPv4 地址,那会是最好的解决方案吗?
  • 面向未来的解决方案是支持 ipv6。为了简化过渡,如果您不想同时处理这两个系统,您可以告诉服务器您希望将 ipv4 地址映射到 ipv6 地址空间,然后您就可以使用 ipv6。
  • 如果这将是面向未来的解决方案,那么您能否解释一下我如何使用 IPv6 地址来阻止此链接上的国家/地区 *.com/questions/45702122/…。我已经问过这个问题,如果你能回答我如何让我的代码与 IPv6 一起工作,我会很高兴,这也是未来的证明。请看一看。
  • 您找到的脚本根本不支持 IPv6。它已经过时了。从 IPv6 中猜测国家非常困难,而且在很多情况下是不可能的。 IPv6 分配的工作方式与 IPv4 的工作方式不同。它还涵盖了新的需求,例如在移动时保持相同地址的移动设备。

标签: php ip-address ipv6 ipv4


【解决方案1】:

IPv4 和 IPv6 是两种完全不同的互不兼容的网络寻址方案。没有办法从一种“翻译”到另一种。 IPv4 地址不对应于特定的 IPv6 地址,反之亦然。互联网上的大多数节点此时仍然专门使用 IPv4 地址,一小部分同时运行 IPv4 和 IPv6 的双栈,并且极少数可能是专门使用 IPv6。 IPv4 和 IPv6 节点不能直接相互通信。从长远来看,每个人都应该完全转向 IPv6,但这还有很长的路要走。

你能解释一下如何使用 IPv6 地址来阻止国家/地区

与使用 IPv4 阻止特定区域的方式相同:获取将 IP 映射到地理位置的数据库。唯一的区别是您需要找到为 IPv6 地址执行此操作的数据库或服务。

【讨论】:

  • IP 块归属方案使得构建这样一个数据库变得更加困难(更不用说它会更大)。事实上,我刚查了三个支持ipv6的地理定位服务,三个都把我的国家写错了。我的托管服务器也是如此。虽然使用 ipv4 地址,但他们非常准确地确定了我的位置(正确的社区)。
  • 我并没有声称这会很容易或现实...... ;-)
  • In the long run everyone should be moving to IPv6 exclusively, but that's a long way off. 这样我还能安全几年? ;)
  • @Shubham 如果可能的话,您应该在每个新项目中开始支持 IPv6,但未来很长一段时间内世界将是双栈的。
  • 只是没有得到 IPv6 数据库:(如果你知道我在哪里可以找到类似的数据库,你能帮我吗?