Qual è la differenza tra ping localhost e ping 127.0.0.1?


31

Dopo aver eseguito quanto segue per disabilitare le risposte ping:

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

Ottengo risultati diversi dal ping localhost rispetto a 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

Il ping 127.0.0.1 non riesce:

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

Perché questi risultati sono diversi?

Risposte:


60

Il pingcomando mostra l'indirizzo a cui ha risolto il nome. In questo caso si ha deliberato di IPv6 localhost indirizzo, ::1. D'altra parte, 127.0.0.1è un indirizzo IPv4, quindi pingutilizza esplicitamente IPv4.

L' sysctlutente utilizzato ha effetto solo sui ping IPv4, quindi ricevi risposte per ::1, ma non per 127.0.0.1.

L'indirizzo che si ottiene dalla risoluzione localhostdipende da come è impostato il risolutore DNS. localhostè probabilmente impostato /etc/hosts, ma in teoria potresti ottenerlo da un vero server dei nomi.


Per quanto riguarda come eliminare i ping IPv6, potrebbe essere necessario esaminare ip6tables, poiché non sembra esserci un simile sysctlper IPv6. O semplicemente disabilitare completamente IPv6, se non lo si utilizza nella propria rete. (Anche se ovviamente non è un'idea lungimirante, ma fattibile se al momento non la stai utilizzando.)


2
IPv6 richiede che ICMP non sia bloccato per funzionare correttamente. ;)
zaTricky

3
@zaTricky, la domanda menzionava solo il ping di blocco. Mentre odioso e non molto utile, non penso che dovrebbe rompere qualcosa in generale. Il blocco di tutti i pacchetti ICMP sarebbe ovviamente molto peggio, ma nessuno l'ha nemmeno suggerito, è stato menzionato solo nei due commenti qui ...
ilkkachu

Concesso, potrebbe essere più specifico. "ICMP-request", comunemente noto come ping, è necessario per una corretta comunicazione su IPv6. È possibile bloccare ingressi ping spontanei indesiderati ai client, ma se si blocca in uscita si sta probabilmente rompendo la funzionalità IPv6. Non aiuta che la domanda sembri essere cambiata da quando sono state pubblicate le risposte.
zaTricky,

33

127.0.0.1:
127.0.0.1 è il loopback predefinito della maggior parte del sistema. Un indirizzo di loopback è un indirizzo utilizzato dal sistema per convalidare lo stack di rete del sistema operativo.
L'indirizzo di loopback per IPv4 potrebbe assumere qualsiasi valore nella sottorete 127.0.0.0/8
L'indirizzo di loopback per IPv6 potrebbe assumere qualsiasi valore nella sottorete ::1/128
pingqualsiasi valore in tale intervallo dovrebbe funzionare se lo stack di rete funziona sul sistema operativo.

localhost:
localhost è un nome host, è una specie di nome di dominio ma locale per la propria macchina.
Questo nome host di default punta al loopback IPv4 e IPv6 che è spesso 127.0.0.1o ::1.

localhostl'indirizzo può essere modificato facilmente modificando il file /etc/hosts.
Se il sistema utilizza il servizio systemd-resolved, questo servizio gestirà il modo in cui localhost viene risolto.
Secondo la documentazione disystemd-resolved :

I nomi host "localhost" e "localhost.localdomain" (così come qualsiasi nome host che termina in ".localhost" o ".localhost.localdomain") vengono risolti negli indirizzi IP 127.0.0.1e::1

ping
Quando si tenta di eseguire il ping di un nome host o nome dominio, verrà richiesto al sistema operativo di risolvere questo nome host o nome dominio. Nel tuo caso, hai disabilitato icmpv4ma localhost viene risolto come loopback IPv6 e loopback IPv4 ma solo la risposta loopback IPv6.
La differenza è che in un caso stai tentando di eseguire il ping di un IP e nell'altro caso esegui il ping di un nome host che potrebbe assumere diversi valori.

Disabilita icmpv6
Se non hai bisogno di IPv6 ti consiglio di disabilitarlo. Raddoppierà tutto il lavoro che dovresti fare sul firewall e sulla configurazione dei servizi:

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

Se si desidera ancora il supporto IPv6 e si desidera evitare icmpv6, è possibile utilizzare ip6tables:

ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP

2
Qualcosa non va nel tuo file hosts. Dovrebbe anche avere ::1 localhostdentro.
Michael Hampton,

2
Nota a margine: ricorda che in IPv4 l'intera rete 127.0.0.0/8 sono indirizzi di loopback (quindi ping 127.100.101.102funzionerà anche).
jjmontes,

1
Le voci per localhostnon sono necessariamente necessarie in /etc/hosts. Ad esempio, systemd-resolved sintetizza i record di risorse DNS per localhoste localhost.localdomain.
Johan Myréen,

@MichaelHampton Non è il hostsfile completo ma non ho ::1 localhostUbuntu 17.10
Kiwy

2
La "sottorete" :: 1/128 corrisponde a un solo IP, proprio come 127.0.0.1/32 si risolve solo in quell'IP.
zaTricky,

9

Localhost ha due indirizzi, un indirizzo IPv6 :: 1 e un indirizzo IPv4 127.0.0.1.

IPv6 è il protocollo predefinito, quindi :: 1 è sempre preferito rispetto a 127.0.0.1. Questo è il motivo per cui hai eseguito il ping :: 1 quando hai chiesto di eseguire il ping di localhost.

Per quanto riguarda il motivo per cui è possibile eseguire il ping :: 1 ma non è stato possibile eseguire il ping su 127.0.0.1, sysctl ha disabilitato solo i ping per IPv4, ma non per IPv6. Per quanto ne so, non esiste un sysctl corrispondente per disabilitare i ping per IPv6, ma è possibile disabilitarlo nel firewall se proprio è necessario (ovviamente disabilitarlo non è raccomandato comunque).


5
Disabilitare i ping per IPv6 è sconsigliato di interrompere la connettività, le persone che si connettono dall'indirizzo Teredo non possono più raggiungere la macchina (poiché utilizza il ping per selezionare la macchina del tunnel
Teredo

1
La preferenza della risoluzione dei nomi per IPv6 rispetto a IPv4 può essere controllata con il /etc/gai.conffile. Per impostazione predefinita, ha solo commenti. Se si decommentano le precedencerighe in essa contenute e si apporta la modifica suggerita anche nei commenti, è possibile ottenere la risoluzione del nome host preferendo IPv4 anziché IPv6 predefinito.
telcoM

@telcoM Sì, puoi farlo. Se lo fai, però, è una buona idea dare avvertimenti importanti a chiunque possa usare quella macchina, poiché cambiare la precedenza introduce comportamenti inaspettati.
Michael Hampton,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.