如何使用PHP代码同时获得IPv4和IPv6地址?

ewm0tg9j  于 2023-01-08  发布在  PHP
关注(0)|答案(3)|浏览(605)

我有一个脚本发送请求到另一个服务器,但问题是IPv6不支持,所以如果我发送IPv6,然后给予错误,所以我需要这两个之一:
1.始终获取IPv4地址或
1.获取IPv4IPv6地址
我使用此代码获取IP地址

function getRealIP()
    {
        if (isset($_SERVER["HTTP_CLIENT_IP"])) {
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        } elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_X_FORWARDED"])) {
            $ip = $_SERVER["HTTP_X_FORWARDED"];
        } elseif (isset($_SERVER["HTTP_FORWARDED_FOR"])) {
            $ip = $_SERVER["HTTP_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_FORWARDED"])) {
            $ip = $_SERVER["HTTP_FORWARDED"];
        } else {
            $ip = $_SERVER["REMOTE_ADDR"];
        }

        // Strip any secondary IP etc from the IP address
        if (strpos($ip, ',') > 0) {
            $ip = substr($ip, 0, strpos($ip, ','));
        }
        return $ip;
    }

但是这个函数只返回一个IPv地址,我怎样才能得到所有的时间IPv4或者两个地址?

xzlaal3s

xzlaal3s1#

客户端只会使用一种协议向服务器发送请求。它不会同时使用IPv4和IPv6发送请求,也无法交叉使用两种协议,而且IPv4地址也不会转换为等效的IPv6地址。如果客户端使用IPv4发送请求,那么您将获得IPv4地址。如果客户端使用IPv6发送请求,你就能得到IPv6地址。就这样。故事结束。
如果你需要一个IPv4地址,那么你必须在你的服务器/DNS条目上禁用IPv6支持,这样所有的客户端都被迫使用IPv4作为唯一可用的协议。但在这个时代,这也是一个可怕的倒退。

guykilcj

guykilcj2#

你不能。
只有发出请求的IP地址可用。
没有可靠的方法来识别路由到同一台计算机的其他IP地址(我的笔记本电脑目前有12个IP地址)。

jgwigjjp

jgwigjjp3#

这只是一个想法,但可能诀窍在于客户机如何查询服务器。
它是我用来获得我的公共WAN_IPv4和公共WAN_IPv6与一个简单的Cron作业,以消防每xx分钟,并更新我的DNS记录之一
为什么不向上一层查询主机名NS A和AAAA记录呢?

$ dig dom.domain -A | grep "ip ..." [with some some regex to extract specific pattern.]

或者结合使用这些方法,甚至可以使用curl获取-ipv4地址,然后使用直接调用“ping”myip6.php脚本以返回IPv6。
或者通过DNS解析与cURL的接口来保持简单

$ curl --help all
...
--dns-interface <interface> Interface to use for DNS requests
--dns-ipv4-addr <address> IPv4 address to use for DNS requests
--dns-ipv6-addr <address> IPv6 address to use for DNS requests
--dns-servers <addresses> DNS server addrs to use
...
--interface <name>   Use network INTERFACE (or address)
-4, --ipv4               Resolve names to IPv`enter code here`4 addresses
-6, --ipv6               Resolve names to IPv6 addresses
...

如果使用curl,您可以指定选项**-4****-6来指示哪个IP堆栈返回其结果

$ curl -4 dom.domain
OUTPUT:
> 255.255.255.255

使用**-6可对IPv6**执行相同操作

$ curl -6 dom.domin 
OUTPUT:
> 20a1:efef:ffff::0

当然,上述内容可以通过管道传输到任一控制台或存储在 _VAR 中以供以后使用。
我的意思是,这不是一个直接的方法来回答你的具体问题,但它确实给予你的选择时,管理双ipstack机器和它的我做什么。
这里还有一个很好的例子来说明如何使用curl来完成这个任务[name-resolve-tricks-with-c-ares][1] [1]:https://everything.curl.dev/usingcurl/connections/name#name-resolve-tricks-with-c-ares

相关问题