特定のネットワークからクライアント IP アドレスを取得するにはどうすればよいですか?

特定のネットワークからクライアント IP アドレスを取得するにはどうすればよいですか?

クライアントからの IP アドレスをフィルタリングする条件があり、IP ネットワークは次のように設定されています1.1.0.0/17。このネットワークからのクライアントの一部は、Web サイトで特別なユーザーとしてフィルタリングされます。また、Web サービス言語として PHP も使用しています。

IP 1.1.4.24クライアントがデータベースに自動的にログインする場合は、

誰か私に何か方法を教えてくれませんか?

答え1

では、PHP ソリューションをお探しでしょうか? その場合は、次のようなものが必要になります。

function get_ip_address() {
    // check for shared internet/ISP IP
    if (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) {
        return $_SERVER['HTTP_CLIENT_IP'];
    }

    // check for IPs passing through proxies
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        // check if multiple ips exist in var
        if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {
            $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($iplist as $ip) {
                if (validate_ip($ip))
                    return $ip;
            }
        } else {
            if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR']))
                return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED']))
        return $_SERVER['HTTP_X_FORWARDED'];
    if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR']))
        return $_SERVER['HTTP_FORWARDED_FOR'];
    if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED']))
        return $_SERVER['HTTP_FORWARDED'];

    // return unreliable ip since all else failed
    return $_SERVER['REMOTE_ADDR'];
}

function validate_ip($ip) {
if (strtolower($ip) === 'unknown')
    return false;

// generate ipv4 network address
$ip = ip2long($ip);

// if the ip is set and not equivalent to 255.255.255.255
if ($ip !== false && $ip !== -1) {
    // make sure to get unsigned long representation of ip
    // due to discrepancies between 32 and 64 bit OSes and
    // signed numbers (ints default to signed in PHP)
    $ip = sprintf('%u', $ip);
    // do private network range checking
    if ($ip >= 0 && $ip <= 50331647) return false;
    if ($ip >= 167772160 && $ip <= 184549375) return false;
    if ($ip >= 2130706432 && $ip <= 2147483647) return false;
    if ($ip >= 2851995648 && $ip <= 2852061183) return false;
    if ($ip >= 2886729728 && $ip <= 2887778303) return false;
    if ($ip >= 3221225984 && $ip <= 3221226239) return false;
    if ($ip >= 3232235520 && $ip <= 3232301055) return false;
    if ($ip >= 4294967040) return false;
}
return true;
 }

これで、$ip = get_ip_address(); を呼び出すだけで済みます。

これは非常に危険IP に基づいてユーザーにアクセスを許可します。

答え2

どのようなリソースを利用できるかはわかりませんが、ログインするユーザーの ID に基づいてこれを実現するデバイスがあります。たとえば、Cisco ASA ファイアウォールには、Microsoft Active Directory サーバーでログイン イベントを取得し、そのユーザーの IP アドレスをファイアウォールに通知する ID 機能があります。次に、IP ではなくユーザー名に基づいて ACL を記述します。完璧ではありませんが、機能します。

Cisco アイデンティティ ベース ファイアウォール:http://www.cisco.com/c/dam/en/us/products/collat​​eral/security/asa-5500-series-next-generation-firewalls/at_a_glance_c45-675579.pdf

すでに述べたように、IP アドレスのみでフィルタリングするのはセキュリティの第一歩にすぎません。静的 IP を設定したり、IP を偽装したりするのは簡単です。何らかの認証メカニズムも必要になります。

関連情報