Cómo saber si una dirección IP es externa o no?

Deseo para detectar si una dirección IP es local o externo. En una aplicación web, mi cliente desea acceder a los archivos directamente a través de samba en la red local, y por un enlace de descarga, si no están en la red.

Creo que podría comprobar si mi IP es 172.30.*.*, pero no funcionan si mi cliente cambie a un 10.*.*.* o IPV6.

Que se puede usar una configuración var, por lo que el cliente puede cambiar a voluntad. Me gustaría ser automática, sin config var.

¿Cómo proceder ?

No hay nada en una pregunta normal, lo que podría indicar internos o externos de origen. Todo lo que tienes es la dirección ip enviados en la solicitud.
A ver si una IP está en la misma red, usted toma su máscara de subred y realizar un bit a bit Y con su propia dirección IP. Si se realiza el mismo resultado con el de otros IP (con su máscara de subred), los resultados deben ser iguales si están en la misma red (subred).
Usted puede terminar para arriba con divertidos resultados. Imaginar el servidor que se ejecuta en un nodo con 192.168.1.17, y el router envía las peticiones al puerto 80 de la IP externa w.x.y.z a este nodo. Un cliente viene de 192.168.1.37, que es NAT bajo su dirección externa de una.b.c.d – sin embargo, las direcciones reales son los mismos, pero los nodos en una red diferente.
Desvergonzado la auto-promoción: stackoverflow.com/a/13612479/889949

OriginalEl autor Perello | 2013-01-02

4 Kommentare

  1. 7

    Actualización de la lista de rangos de IP como usted por favor. No he actualizado esta lista en un rato, pero debería haber más. Lo siento, yo nunca añadido soporte de IPv6 a ella.

    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)
    Ver mi comentario a la pregunta original: usted puede tener la IP es la interna, pero el cliente externo – dependiendo de la configuración del proxy.
    Un punto válido, pero si usted tiene un proxy local que eres un poco jodido de todos modos – que tendría que configurar el proxy para que se le informa de la IP del cliente, y utilizar ese valor para la prueba – pero este código no está acoplado a $_SERVER['REMOTE_ADDR'] por lo que es útil. Un proxy remoto no importa ya que tendría que seguir una dirección externa y el cheque sigue siendo una de las más útiles.
    Esta solución parece bastante bueno, y debe trabajar con mi cliente de la red de políticas. Supongo que no hay ninguna solución perfecta a este problema.
    en.wikipedia.org/wiki/Reserved_IP_addresses

    OriginalEl autor cryptic ツ

  2. 3

    Por desgracia, no hay ninguna manera fácil de determinar esto con certeza. Ver mi comentario para un ejemplo interesante.

    En IPv4 mundo, usted puede tratar de hacer esto: determinar la dirección IP externa del servidor (usando, por ejemplo http://ip-address.domaintools.com/myip.xml) y compararla con la del cliente socket remoto de dirección ($_SERVER['REMOTE_ADDR']). Si son iguales, entonces se ejecuta en la misma red, si son diferentes, entonces es una red diferente.

    En el mundo de IPv6 (debidamente implementado redes), no hay tal cosa como una red privada y todos los dispositivos en todas partes tiene su propia dirección IP pública. En este caso, la única manera de determinar si usted es local o no es mantener una lista completa de dispositivos locales.

    Muy interesante (+1). Supongo que no será capaz de utilizar su camino. Mi cliente es una administración francesa. Sé que no proporciona acceso a internet para (al menos) algunos usuarios de vpn.

    OriginalEl autor Aleks G

  3. 0

    No estoy seguro, pero trate de usar

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

    OriginalEl autor Suresh Kamrushi

  4. 0

    Supongo que usted está definiendo interna como 0 router saltos de distancia?

    Uso de las soluciones en:

    ¿Cómo puedo encontrar mi dirección IP del servidor en PHP(CLI)

    para determinar dinámicamente el SERVIDOR LA Dirección IP y la Máscara de los valores. Entonces usted debería ser capaz de determinar si el cliente es remoto o no.

    Si la red interna incluye enruta subredes (1 o más enrutadores saltos de distancia) no puedo pensar de todos modos para hacer la detección dinámica, sería necesario definir estáticamente interna de los rangos de IP.

    OriginalEl autor Jay Lee

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea