¿Cuál es la diferencia entre ping localhost y ping 127.0.0.1?

31

Después de ejecutar lo siguiente para deshabilitar las respuestas de ping:

# sysctl net.ipv4.icmp_echo_ignore_all=1
# sysctl -p

Obtengo resultados diferentes al hacer ping a localhost vs. 127.0.0.1

# ping -c 3 localhost
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.035 ms
64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.101 ms

--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2042ms
rtt min/avg/max/mdev = 0.047/0.072/0.101/0.022 ms

Pinging 127.0.0.1 falla:

ping -c 3 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

--- 127.0.0.1 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2032ms

¿Por qué son diferentes estos resultados?

Helio
fuente

Respuestas:

60

El pingcomando muestra la dirección a la que resolvió el nombre. En este caso se resolvió la dirección IPv6 localhost, ::1. Por otro lado, 127.0.0.1es una dirección IPv4, por lo que explícitamente pingutiliza IPv4.

Lo sysctlque usó solo afecta los pings de IPv4, por lo que obtiene respuestas para ::1, pero no para 127.0.0.1.

La dirección que obtiene al resolver localhostdepende de cómo esté configurado su DNS. localhostprobablemente esté configurado /etc/hosts, pero en teoría podría obtenerlo de un servidor de nombres real.


En cuanto a cómo soltar pings IPv6, es posible que deba investigar ip6tables, ya que no parece haber una similarsysctl para IPv6. O simplemente deshabilite IPv6 por completo, si no lo está utilizando en su red. (Aunque, por supuesto, esa no es una idea muy prospectiva, pero es factible si no la está utilizando actualmente de todos modos).

ilkkachu
fuente
2
IPv6 requiere que ICMP no se bloquee para que funcione correctamente. ;)
zaTricky
3
@zaTricky, la pregunta solo mencionaba el bloqueo del ping. Si bien es desagradable y no es muy útil, no creo que deba romper nada en general. Obviamente, bloquear todos los paquetes ICMP sería mucho peor, pero nadie sugirió eso, solo se mencionó en los dos comentarios aquí ...
ilkkachu
De acuerdo, podría ser más específico. La "solicitud de eco ICMP", comúnmente conocida como ping, es necesaria para una comunicación adecuada a través de IPv6. Usted puede bloquear espontáneas ingresses de ping no deseados a los clientes - pero si bloquear el saliente es probable que estés rompiendo funcionalidad IPv6. No ayuda que la pregunta parezca haber cambiado desde que se publicaron las respuestas.
zaTricky
33

127.0.0.1:
127.0.0.1 es el loopback predeterminado de la mayoría de los sistemas. Una dirección de bucle invertido es una dirección utilizada por el sistema para validar la pila de red del sistema operativo.
La dirección de bucle de retorno para IPv4 podría tomar cualquier valor en la subred. 127.0.0.0/8
La dirección de bucle de retorno para IPv6 podría tomar cualquier valor en la subred, ::1/128
pingcualquier valor en ese rango debería funcionar si su pila de red funciona en su sistema operativo.

localhost:
localhost es un nombre de host, es una especie de nombre de dominio pero local para su propia máquina.
Este nombre de host apunta de forma predeterminada a su bucle invertido IPv4 e IPv6, que a menudo es 127.0.0.1o ::1.

localhostla dirección podría cambiarse fácilmente editando el archivo /etc/hosts.
Si su sistema usa el servicio systemd-resolved, este servicio manejará la forma en que se resuelve localhost.
De acuerdo con la documentación desystemd-resolved :

Los nombres de host "localhost" y "localhost.localdomain" (así como cualquier nombre de host que termine en ".localhost" o ".localhost.localdomain") se resuelven en las direcciones IP 127.0.0.1y::1

ping
Cuando intente hacer ping a un nombre de host o nombre de dominio, le pedirá al sistema operativo que resuelva este nombre de host o nombre de dominio. En tu caso, deshabilitasteicmpv4 pero localhost se resuelve como su bucle invertido IPv6 y su bucle invertido IPv4 pero solo su respuesta de bucle invertido IPv6.
La diferencia es que en un caso está intentando hacer ping a una IP y en el otro caso hace ping a un nombre de host que podría tomar varios valores.

Desactivar icmpv6
Si no necesita IPv6, le aconsejo que lo desactive. Duplicará todo el trabajo que necesitaría hacer en el firewall y los servicios de configuración:

sysctl -w net.ipv6.conf.all.disable_ipv6=0

Si aún desea compatibilidad con IPv6 y desea evitarlo icmpv6, puede usar ip6tables:

ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
Kiwy
fuente
2
Algo está mal con tu archivo de hosts. También debería tenerlo ::1 localhost.
Michael Hampton
2
Nota al margen: recuerde que en IPv4 toda la red 127.0.0.0/8 son direcciones de bucle invertido (también ping 127.100.101.102funcionará).
jjmontes
1
Las entradas para localhostno son necesariamente necesarias en /etc/hosts. Por ejemplo, systemd-resolve sintetiza registros de recursos DNS para localhosty localhost.localdomain.
Johan Myréen
@MichaelHampton No es el hostsarchivo completo pero no tengo ::1 localhostcorriendo ubuntu 17.10
Kiwy
2
La "subred" :: 1/128 corresponde a una sola IP, al igual que 127.0.0.1/32 solo se resuelve en esa IP.
zaTricky
9

Localhost tiene dos direcciones, una dirección IPv6 :: 1 y una dirección IPv4 127.0.0.1.

IPv6 es el protocolo predeterminado, por lo que :: 1 siempre se prefiere a 127.0.0.1. Esta es la razón por la que ha pinchado :: 1 al solicitar hacer ping a localhost.

En cuanto a por qué podría hacer ping :: 1 pero no pudo hacer ping 127.0.0.1, su sysctl solo ha deshabilitado los pings para IPv4, pero no para IPv6. Por lo que puedo decir, no hay un sysctl correspondiente para deshabilitar pings para IPv6, pero puede deshabilitarlo en el firewall si realmente lo necesita (por supuesto, deshabilitarlo no se recomienda de todos modos).

Michael Hampton
fuente
55
Desactivar los pings para IPv6 no es aconsejable porque interrumpe la conectividad, las personas que se conectan desde la dirección teredo ya no pueden llegar a la máquina (ya que utiliza el ping para seleccionar la máquina de túnel teredo anycast más cercana)
Ferrybig
1
La preferencia de resolución de nombre para IPv6 frente a IPv4 se puede controlar con el /etc/gai.confarchivo. Por defecto, solo tiene comentarios. Si descomenta las precedencelíneas y realiza el cambio también sugerido en los comentarios, puede obtener la resolución del nombre de host para preferir IPv4 en lugar del IPv6 predeterminado.
telcoM
@telcoM Sí, puedes hacer eso. Sin embargo, si lo hace, es una buena idea dar advertencias prominentes a cualquiera que pueda usar esa máquina, ya que cambiar la prioridad introduce un comportamiento inesperado.
Michael Hampton