2

我读过这个:

如何获取我的系统的 IP 地址

但这并没有真正解决我的根本问题。我需要在内部网络上获取客户端 IP,例如,192.168.1.7以便我知道服务器是否正在从内部位置访问。

我正在更新一些前一段时间由其他人构建的代码,这个代码片段就在那里:

$octet = explode(".", getenv("REMOTE_ADDR"), 4);

if($octet[0] != 192 && $octet[1] != 168 && $octet[2] != 1) { 
    die("You are unable to view this page from your current location."); 
}

这看起来像是在测试该内部 IP,但在另一个具有类似代码的页面上,我收到了die消息。该代码实际上显示我的 IP 不是192.168.1.7(此代码实际上显示了 ISP 给我的静态 IP):

if($octet[0] != 192 && $octet[1] != 168 && $octet[2] != 1) { 
    die("You are unable to view this page from your current location: " . getenv("REMOTE_ADDR")); 
}

我有点困惑,因为这段代码过去似乎有效,但现在不行。我不完全确定它什么时候停止工作,但根据我看到的代码,它一开始就不应该工作。

笔记

我还应该提到,所有需要访问该服务器的客户端都是内部的(大部分)。这是一个带有自定义许可证密钥模块的 CRM。我希望只有192.168.1.0网络上的那些客户端可以访问这些 PHP 页面。但棘手的部分是,有一种方法可以在如下位置使用 DNS 从外部访问 CRM 的非关键系统部分:

crm.my-domain.com

可以说,那些从网络外部访问 CRM 的客户不应该访问关键模块;只有网络上的那些客户端192.168.1.0才能看到密钥。因此,如果我可以获得内部 IP,我可以对其进行测试并显示页面。

笔记2

我在网络中运行 DNS,并且我在路由器上有一个端口转发到有问题的服务器<internal_ip>上的端口80

DNS 有这样的 A 记录:

crm_servername    A    192.168.1.20

它有一个CNAME

crm    CNAME    crm_servername.my-domain.com

我是否需要更多,或者这对我有用吗?目前我可以通过子域地址访问有问题的服务器,但是当我访问有问题的页面时,它仍然显示一个外部 IP,non-192.168.1.x...

我的问题是,如何设置我的 DNS 区域文件,以便当我在本地网络上时,我去一个 IP 上的服务器,例如 192.168.1.20,我留在网络中并且不会被路由出去然后再回来?看来我要从 ISP 静态 IP 出去然后进来,而服务器认为是这样。

4

2 回答 2

2

如果您将其更改为以下代码,您可能会使此代码更好地工作:

function is_local($ip) {
    $octet = explode('.', $ip);

    return ($octet[0] == '10' ||
        ($octet[0] == '172' && ((int)$octet[1] >=16 && (int)$octet[1] <= 31)) ||
        ($octet[0] == '192' && $octet[1] == '168')
    );
}

此代码将检查 IP 地址是否属于任何私有网络范围,这意味着您的客户端是内部的或通过 VPN 连接的。

这可能会解决您的问题,或者可能过于广泛。如果您的 IP 显示为来自您的 ISP 的 IP,那么当您认为您在本地网络上时,您可能不在本地网络上,或者您正在端口转发到内部网络,因此仍将远程 IP 地址显示给服务器。

于 2012-07-27T22:12:52.297 回答
1

您无法从服务器变量中获取该信息,因为服务器无法知道此信息。

唯一的方法是询问网络浏览器(例如,通过使用 Java 小程序)。然而,获取这些信息充其量是不可靠的。

看:

在浏览器中获取本地 IP 地址的非服务器端方法?

从 java applet 获取正确的本地 IP 地址

http://www.webdeveloper.com/forum/showthread.php?threadid=242538

于 2012-07-27T22:07:27.673 回答