繁体   English   中英

如何知道IP是否是外部的?

[英]How to know if an IP is external or not?

我希望检测地址IP是本地还是外部。 在Web应用程序中,我的客户希望直接通过本地网络上的samba访问文件,如果您不在网络中,则希望通过下载链接访问文件。

我可能只是检查我的IP是否为172.30.*.* ,但是如果我的客户切换到1 0.*.*.*或IPV6,它将不再起作用。

我可能使用了config var,因此客户可以随意更改它。 我希望它是自动的,没有config var。

您将如何进行?

请根据需要更新IP范围列表。 我有一段时间没有更新此列表了,但是应该最多。 抱歉,我从未为其添加IPv6支持。

function reserved_ip($ip)
{
    $reserved_ips = array( // not an exhaustive list
    '167772160'  => 184549375,  /*    10.0.0.0 -  10.255.255.255 */
    '3232235520' => 3232301055, /* 192.168.0.0 - 192.168.255.255 */
    '2130706432' => 2147483647, /*   127.0.0.0 - 127.255.255.255 */
    '2851995648' => 2852061183, /* 169.254.0.0 - 169.254.255.255 */
    '2886729728' => 2887778303, /*  172.16.0.0 -  172.31.255.255 */
    '3758096384' => 4026531839, /*   224.0.0.0 - 239.255.255.255 */
    );

    $ip_long = sprintf('%u', ip2long($ip));

    foreach ($reserved_ips as $ip_start => $ip_end)
    {
        if (($ip_long >= $ip_start) && ($ip_long <= $ip_end))
        {
            return TRUE;
        }
    }
    return FALSE;
}

var_dump(reserved_ip('127.0.0.1')); // reserved (localhost)
var_dump(reserved_ip('74.125.140.101')); // not reserved (Google)

不幸的是,没有简单的方法可以确定地确定这一点。 请参阅我的评论以获取有趣的示例。

在IPv4世界中,您可以尝试执行以下操作:确定服务器的外部IP地址(例如使用http://ip-address.domaintools.com/myip.xml ),并将其与客户端的套接字远程地址( $_SERVER['REMOTE_ADDR'] )。 如果它们相同,那么您正在同一网络上运行;如果它们不同,则它是不同的网络。

在IPv6世界(正确部署的网络)中,没有专用网络之类的东西,每个地方的每个设备都有其自己的公共IP地址。 在这种情况下,确定您是否在本地的唯一方法是维护本地设备的完整列表。

我假设您将内部定义为距离路由器0跳?

使用以下解决方案:

如何在PHP(CLI)中找到服务器的IP地址

动态确定服务器的IP地址和网络掩码值。 然后,您应该能够确定客户端是否处于远程状态。

如果内部网络包含路由子网(距离路由器1个或多个跳远),则无论如何我都想不出要动态地进行检测,则需要静态定义内部IP范围。

我不确定,但请尝试使用

$_SERVER['SERVER_ADDR']
$_SERVER['SERVER_PORT']
$_SERVER['REMOTE_ADDR']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM