32 votos

¿Por qué hay una diferencia entre ping "localhost" y ping "dirección IP local"?

Utilizando cmd y ping en Windows me dio los siguientes resultados:

  • Haciendo ping a "localhost":

Enter image description here

  • Haciendo ping a "192.168.0.10" (dirección IP local):

Enter image description here

¿No son ambas situaciones exactamente iguales?

Es decir, estoy haciendo ping a la misma interfaz, la misma máquina y la misma dirección. ¿Por qué obtengo resultados tan diferentes?

EDIT: Aquí está mi ipconfig /all pantalla:

Enter image description here

45voto

Tom Wijsman Puntos 43572

No está haciendo ping a la misma interfaz Sin ninguna interfaz física, todavía tienes un "host local".

Su localhost se utiliza para referirse a su ordenador desde su IP "interna", no desde ninguna IP "externa" de su ordenador. Por lo tanto, los paquetes de ping no pasan a través de ninguna interfaz de red física; sólo a través de una interfaz virtual de bucle de retorno que envía directamente los paquetes de puerto a puerto sin ningún salto físico.

Todavía puede preguntarse por qué localhost está resolviendo ::1 mientras que tradicionalmente esperaríamos que se resolviera a la dirección IPv4 127.0.0.1 . Tenga en cuenta que .localhost es tradicionalmente un TLD (véase RFC 2606 ) que apunta a la dirección IP de bucle de retorno (para IPv4, véase RFC 3330 especialmente 127.0.0.0/8).

Mirando hacia arriba localhost utilizando nslookup nos da:

nslookup localhost

...
Name:    localhost
Addresses:  ::1
          127.0.0.1

Así, Windows prefiere utilizar la dirección IP de bucle de retorno IPv6 ::1 (ver RFC 2373 ) ya que aparece en primer lugar.

Bien, entonces, de dónde viene, miremos el archivo de hosts.

type %WINDIR%\System32\Drivers\Etc\Hosts

...
# localhost name resolution is handled within DNS itself.
#       127.0.0.1       localhost
#       ::1             localhost
...

Hmm, tenemos que mirar la configuración DNS de Windows.

Este artículo de KB nos habla de una configuración que afecta a lo que prefiere Windows, resaltada en negrita:

  1. En el Editor del Registro, localice y haga clic en la siguiente subclave del registro:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
  2. Haga doble clic en DisabledComponents para modificar la entrada DisabledComponents.

    Nota: Si la entrada DisabledComponents no está disponible, debe crearla. Para ello, siga estos pasos:

    1. En el menú Editar, apunte a Nuevo y luego haga clic en Valor DWORD (32 bits).

    2. Escriba DisabledComponents y pulse ENTER.

    3. Haga doble clic en DisabledComponents.

  3. Escriba uno de los siguientes valores en el campo Datos de valor: para configurar el protocolo IPv6 en el estado deseado y, a continuación, haga clic en Aceptar:

    • Tipo 0 para habilitar todos los componentes de IPv6. (Configuración por defecto de Windows)
    • Tipo 0xffffffff para desactivar todos los componentes IPv6, excepto la interfaz IPv6 loopback. Este valor también configura Windows para que prefiera el uso del Protocolo de Internet versión 4 (IPv4) sobre el IPv6, modificando las entradas en la tabla de políticas de prefijos. Para obtener más información, consulte Selección de direcciones de origen y destino.
    • Tipo 0x20 para preferir IPv4 sobre IPv6 modificando las entradas en la tabla de políticas de prefijos.
    • Tipo 0x10 para desactivar IPv6 en todas las interfaces que no sean de túnel (tanto en las interfaces LAN como en las de Protocolo Punto a Punto [PPP]).
    • Tipo 0x01 para desactivar IPv6 en todas las interfaces de túnel. Entre ellos se encuentran el Protocolo de direccionamiento automático de túneles dentro del sitio (ISATAP), 6to4 y Teredo.
    • Tipo 0x11 para desactivar todas las interfaces IPv6 excepto la interfaz IPv6 loopback.
  4. Reinicie el ordenador para que este ajuste surta efecto.

¿Qué es esta tabla de política de prefijos?

netsh interface ipv6 show prefixpolicies (o prefixpolicy en versiones anteriores)

Precedence  Label  Prefix
----------  -----  --------------------------------
        50      0  ::1/128
        45     13  fc00::/7
        40      1  ::/0
        10      4  ::ffff:0:0/96
         7     14  2002::/16
         5      5  2001::/32
         1     11  fec0::/10
         1     12  3ffe::/16
         1     10  ::/96

Esta tabla decide qué prefijos tienen prioridad sobre otros prefijos durante las resoluciones DNS.

Ah, así que usando esa KB podríamos añadir entradas aquí que denoten que IPv4 tiene mayor precedencia que IPv6.

Nota: No hay razón para anular este comportamiento, a menos que tenga problemas de compatibilidad. El cambio de esta configuración en nuestro servidor de Windows rompió nuestro servidor de correo, por lo que debe ser manejado con cuidado...

20voto

RedGrittyBrick Puntos 51212

El interfaz de bucle invertido existe independientemente de su(s) interfaz(es) Ethernet.

Incluso sin la complicación de IPv6 tendrías dos direcciones distintas.

Loopback IPv4 dirección : 127.0.0.1
La dirección IPv4 de su interfaz Ethernet : 192.168.0.10

La interfaz de bucle de retorno bien podría estar en una capa de software diferente, más alejada del hardware real. Dudo que dependa de alguna manera de su controlador de interfaz Ethernet específico, por ejemplo.

11voto

Graham Powell Puntos 310

Localhost y su dirección IP no son lo mismo.

El localhost es una dirección IP especial, sólo de software, que está vinculada a su sistema. Localhost, o 127.0.0.1, es una dirección de bucle. Siempre apunta a su sistema, y sólo es accesible desde su ordenador. Este enrutamiento ocurre a nivel del sistema operativo, y definitivamente nunca sale de la NIC... Así que no hay posibilidad de que llegue a la red....

Hacer ping a tu propia dirección IP es similar, pero implica potencialmente a toda la pila de red, ya que necesita detectar que es tu dirección IP, y enrutarlo correctamente ...

El efecto debería ser el mismo, pero puede haber diferencias.

Por ejemplo, desenchufa el cable de red. Haz ping a tu dirección IP estática. Es posible que obtengas "no route to host" u otros errores. Ahora haz ping a localhost o 127.0.0.1, y funcionará.

5voto

djeidot Puntos 2143

Parece que el alias "Localhost" está resolviendo al loopback IPv6 y cuando usas explícitamente una dirección IPv4 obviamente no lo hace.

0voto

Kaz Puntos 1750

Me doy cuenta, por las capturas de pantalla, de que esta pregunta no se refiere a Linux, pero tal vez sea un "caso práctico".

En ese sistema operativo, si se hace un ping a una de las direcciones del adaptador local, se traduce al dispositivo de bucle invertido (caso especial de hacking). Esto significa que los paquetes realmente van al dispositivo de loopback (lo que tiene todas las implicaciones que podrías pensar: por ejemplo, desde el punto de vista del firewall, esos paquetes están entrando en la interfaz de loopback y coincidirán con las reglas para esa interfaz).

El dispositivo al que se le asigna la IP nunca verá los paquetes. (Esto es bueno porque no haría lo correcto con esos paquetes: querría enviar a los bobos).

Sin embargo, si la interfaz que tiene esa IP se cae, habrás perdido esa conexión. El mapeo a loopback dejará de funcionar.

Así que, en otras palabras, es un diseño viable considerar esas direcciones locales como alias para el dispositivo de bucle invertido.

Referencias del código:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2623

Echa un vistazo a la función ip_route_output_slow . Esto requiere fib_lookup y si esta función devuelve el código RTN_LOCAL , dev_out se reescribe en loopback:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2769

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X