我有一个向另一台服务器发送请求的脚本,但问题是
IPv6
不支持,所以如果我发送 IPv6
然后给出错误,所以我需要两个之一:
IPv4
地址
或IPv4
和 IPv6
地址我使用此代码来获取
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
或获得两个地址?
客户端将仅使用一种协议向您的服务器发送请求。它不会同时使用 IPv4 和 IPv6 发送请求,并且无法交错这两种协议,而且 IPv4 地址也不会转换为等效的 IPv6 地址。如果客户端使用 IPv4 发送请求,那么您将获得 IPv4 地址。如果他们使用 IPv6 发送请求,您将获得 IPv6 地址。时期。故事结束。 如果您
需要IPv4 地址,则必须在服务器/DNS 条目上禁用 IPv6 支持,因此所有客户端都被迫使用 IPv4 作为唯一可用的协议。但在当今时代,这也将是可怕的倒退。
只有请求来源的 IP 地址可用。
没有可靠的方法来识别路由到同一台计算机的其他 IP 地址(我的笔记本电脑当前有 12 个 IP 地址)。
我用它来获取我的公共 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。?
或者通过 cURL 接口上的 dns 解析来保持简单
$ 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
<?php
$ipv4 = $_GET['ipv4'] ?? "";
$ipv6 = $_GET['ipv6'] ?? "";
$ip = $_SERVER['REMOTE_ADDR'];
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
$ipv4 = $ip;
} elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
$ipv6 = $ip;
}
echo "Your IPv4 is: $ipv4 <br>";
echo "Your IPv6 is: $ipv6 <br>";
// Redirect user to this page with the other IP version if one is missing
if($ipv4 == ""){
header("Location: http://127.0.0.1/ip.php?ipv6=$ipv6");
}
if($ipv6 == ""){
header("Location: http://[::1]/ip.php?ipv4=$ipv4");
}
?>
但是您应该谨慎使用此代码,因为它不提供 IP 地址验证,不处理重定向循环,并且不考虑用户无法通过 IPv6(甚至 IPv4)进行访问的情况。
您还需要配置您的网络服务器才能使用它。