在PHP中将IPv6转换为IPv4地址

5

我需要将IPv6地址转换为IPv4地址。为此,我使用了pedmillon在相关问题的答案中提供的代码

$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。


7
IPv6地址无法转换为IPv4地址。这就像想把苹果变成香蕉一样。首先,IPv6地址有340,282,366,920,938,463,463,374,607,431,768,211,456个可能的地址,而IPv4只有4,294,967,296个可能的地址。所以让我再澄清一下:这就像想把几个银河系大小的苹果变成一个香蕉。 - spectras
嗯..那么,如果我强制让我的Apache使用IPv4地址,这是否是最好的解决方案? - user6224087
2
未来的解决方案应该支持ipv6。为了简化过渡,如果您不想处理两个系统,可以告诉您的服务器您希望将ipv4地址映射到ipv6地址空间中,然后从那里开始使用ipv6。 - spectras
如果这是未来的解决方案,那么你能解释一下如何使用IPv6地址在此链接https://stackoverflow.com/questions/45702122/country-blocking-by-ip-address-returning-error?noredirect=1#comment78362861_45702122上阻止国家吗?我已经问过这个问题了,如果您能回答我如何使我的代码也能与IPv6一起工作以保持未来的兼容性,我将不胜感激。请看一下。 - user6224087
2
你找到的脚本不支持IPv6,它已经过时了。而且从IPv6猜测国家非常困难,在许多情况下是不可能的。IPv6的分配方式与IPv4不同。它还涵盖了新的需求,例如移动设备在移动时保持相同的地址。 - spectras
你仍然可以使用像MaxMind这样的距离工具来大致确定地址的位置。他们的API和数据库支持IPv6。只要记住地理定位始终是一种猜测,不要过于依赖。同样适用于IPv4... - Sander Steffann
2个回答

9
IPv4和IPv6是两种完全不兼容的网络寻址方案。它们之间没有“翻译”的方法。一个IPv4地址不对应于特定的IPv6地址,反之亦然。目前互联网上绝大多数节点仍然只使用IPv4地址,一些小部分同时运行IPv4和IPv6双栈,极少数可能是纯IPv6。IPv4和IPv6节点不能直接通信。从长远来看,每个人都应该只使用IPv6,但这还有很长的路要走。

你能解释一下我如何使用IPv6地址来屏蔽国家吗?

与使用IPv4阻止特定地区的方式相同:获取将IP映射到地理位置的数据库。唯一的区别是你需要找到一个针对IPv6地址进行映射的数据库或服务。


IP地址块归属方案使得构建这样的数据库变得更加困难(更不用说它将会更大)。事实上,我刚刚检查了三个支持IPv6的地理位置服务,它们全部都把我的国家定位错误。我的托管服务器也是如此。而对于IPv4地址,它们可以准确地锁定我的位置(正确的街区)。 - spectras
1
我并没有声称这很容易或现实...;-) - deceze
从长远来看,每个人都应该完全转向IPv6,但这还有很长的路要走。我能安全使用多少年? ;) - user6224087
@Shubham 如果可能的话,你应该在每个新项目中开始支持IPv6,但是世界在相当长的一段时间内将是双栈。 - deceze
我只是无法理解IPv6数据库:( 如果您知道哪里可以找到类似的,请帮帮我好吗? - user6224087
https://dev59.com/smcs5IYBdhLWcg3w-Yr4 - s1w_

0

如上所述,IPV6和IPv4是完全不同的寻址系统,不能从一个转换为另一个。然而,如果你从另一个角度来看这个问题,你应该能够获得客户端可能使用的IPV4地址。我使用PHP和JavaScript来实现这一点。以下是我的示例代码 - 它对我有效。

您的输出将类似于:

IP地址:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx IPv4:

xx.xx.xxx.xxx

<? // Grab the IP address of the user
$ipaddress = getenv("REMOTE_ADDR") ; echo 'IP Address: '.$ipaddress;

// Check if we need to try and get the IPv4 address
if(filter_var($ipaddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
?>
<script src=
"https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js">
    </script>

      <script>

    /* Add "https://api.ipify.org?format=json" statement
               this will communicate with the ipify servers in
               order to retrieve the IP address $.getJSON will
               load JSON-encoded data from the server using a
               GET HTTP request */

    $.getJSON("https://api.ipify.org?format=json", function(data) {

        // Setting text of element P with id gfg
        $("#gfg").html(data.ip);
    })
    </script>

       <p id="gfg"></p>
<?
}
else {
}

?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接