Was ist der Unterschied zwischen ping localhost und ping 127.0.0.1?

31

Nachdem Sie Folgendes ausgeführt haben, um die Ping-Antworten zu deaktivieren:

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

Ich erhalte unterschiedliche Ergebnisse von pinging 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

Ping 127.0.0.1 schlägt fehl:

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

Warum unterscheiden sich diese Ergebnisse?

Helio
quelle

Antworten:

60

Der pingBefehl zeigt die Adresse an, in die der Name aufgelöst wurde. In diesem Fall wird es in die IPv6-Localhost-Adresse aufgelöst ::1. Ist andererseits 127.0.0.1eine IPv4-Adresse, so wird explizit pingIPv4 verwendet.

Das, was sysctlSie verwendet haben, wirkt sich nur auf IPv4-Pings aus, daher erhalten Sie Antworten für ::1, aber nicht für 127.0.0.1.

Die Adresse, die Sie durch die Auflösung erhalten, localhosthängt davon ab, wie Ihr DNS-Resolver eingerichtet ist. localhostist wahrscheinlich eingestellt /etc/hosts, aber theoretisch könnte man es von einem tatsächlichen Nameserver bekommen.


Was das Löschen von IPv6-Pings angeht, müssen Sie möglicherweise nachsehen ip6tables, da es sysctlfür IPv6 anscheinend kein ähnliches gibt . Oder deaktivieren Sie IPv6 ganz, wenn Sie es nicht in Ihrem Netzwerk verwenden. (Das ist natürlich keine sehr zukunftsweisende Idee, aber machbar, wenn Sie sie derzeit sowieso nicht verwenden.)

ilkkachu
quelle
2
IPv6 erfordert, dass ICMP nicht blockiert wird, damit es ordnungsgemäß funktioniert. ;)
zaTricky
3
@zaTricky, in der Frage wurde nur das Blockieren von Ping erwähnt. Obwohl abscheulich und nicht sehr nützlich, denke ich nicht, dass es irgendetwas im Allgemeinen kaputt machen sollte. Das Blockieren aller ICMP-Pakete wäre natürlich viel schlimmer, aber niemand hat das auch nur angedeutet, es wurde nur in den beiden Kommentaren hier erwähnt ...
ilkkachu
Zugegeben, könnte genauer sein. "ICMP-Echoanforderung", im Allgemeinen als Ping bezeichnet, ist für eine ordnungsgemäße Kommunikation über IPv6 erforderlich. Sie können spontane unerwünschte Ping-Angriffe auf Clients blockieren. Wenn Sie jedoch ausgehende Anrufe blockieren, wird die IPv6-Funktionalität möglicherweise beeinträchtigt. Hilft nicht, dass sich die Frage geändert zu haben scheint, seitdem Antworten gepostet wurden.
ZaTricky
33

127.0.0.1:
127.0.0.1 ist das Standard-Loopback der meisten Systeme. Eine Loopback-Adresse ist eine Adresse, die vom System zum Überprüfen des Netzwerkstapels des Betriebssystems verwendet wird.
Die Loopback-Adresse für IPv4 kann einen beliebigen Wert im Subnetz annehmen. 127.0.0.0/8
Die Loopback-Adresse für IPv6 kann einen beliebigen Wert im Subnetz annehmen. Jeder Wert in diesem ::1/128
pingBereich sollte funktionieren, wenn Ihr Netzwerkstapel auf Ihrem Betriebssystem ausgeführt wird.

localhost:
localhost ist ein Hostname, eine Art Domänenname, der jedoch lokal für Ihren eigenen Computer ist.
Dieser Hostname verweist standardmäßig auf Ihr IPv4- und IPv6-Loopback, bei dem es sich häufig 127.0.0.1oder handelt ::1.

localhostDie Adresse kann einfach durch Bearbeiten der Datei geändert werden /etc/hosts.
Wenn Ihr System den Dienst verwendet systemd-resolved, behandelt dieser Dienst die Art und Weise, wie localhost aufgelöst wird.
Nach der Dokumentation vonsystemd-resolved :

Die Hostnamen "localhost" und "localhost.localdomain" (sowie alle Hostnamen, die auf ".localhost" oder ".localhost.localdomain" enden) werden in die IP-Adressen 127.0.0.1und aufgelöst::1

Ping
Wenn Sie versuchen, einen Host- oder Domainnamen per Ping zu erreichen, fordert das Betriebssystem das Auflösen dieses Host- oder Domainnamens auf. In Ihrem Fall haben Sie deaktiviert, icmpv4aber localhost wird als Ihr IPv6-Loopback und Ihr IPv4-Loopback aufgelöst, aber nur als Ihre IPv6-Loopback-Antwort.
Der Unterschied besteht in einem Fall darin, dass Sie versuchen, eine IP zu pingen, und in dem anderen Fall, dass Sie einen Hostnamen pingen, der mehrere Werte annehmen kann.

Deaktivieren
Sie icmpv6 Wenn Sie IPv6 nicht benötigen, empfehlen wir Ihnen, es zu deaktivieren. Es wird die gesamte Arbeit verdoppeln, die Sie für die Firewall und die Konfiguration von Diensten benötigen:

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

Wenn Sie weiterhin IPv6-Unterstützung benötigen und dies vermeiden möchten icmpv6, können Sie Folgendes verwenden ip6tables:

ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
Kiwy
quelle
2
Mit Ihrer hosts-Datei stimmt etwas nicht. Es sollte auch ::1 localhostdrin sein.
Michael Hampton
2
Randnotiz: Denken Sie daran, dass in IPv4 das gesamte Netzwerk 127.0.0.0/8 Loopback-Adressen sind ( ping 127.100.101.102funktioniert also auch).
jjmontes
1
Einträge für localhostsind in nicht unbedingt erforderlich /etc/hosts. Beispielsweise synthetisiert systemd-resolved DNS-Ressourceneinträge für localhostund localhost.localdomain.
Johan Myréen
@MichaelHampton Es ist nicht die vollständige hostsDatei, aber ich habe ::1 localhostUbuntu 17.10
Kiwy
2
Das "Subnetz" :: 1/128 entspricht nur einer IP, ähnlich wie 127.0.0.1/32 nur diese eine IP auflöst.
ZaTricky
9

Localhost verfügt über zwei Adressen, eine IPv6-Adresse :: 1 und eine IPv4-Adresse 127.0.0.1.

IPv6 ist das Standardprotokoll, daher wird :: 1 gegenüber 127.0.0.1 immer bevorzugt. Aus diesem Grund haben Sie :: 1 gepingt, als Sie gefragt haben, ob Sie localhost pingen möchten.

Was den Grund betrifft, warum Sie :: 1 pingen konnten, 127.0.0.1 aber nicht pingen konnten, hat Ihr Sysctl nur Pings für IPv4 deaktiviert, nicht jedoch für IPv6. Soweit ich das beurteilen kann, gibt es kein entsprechendes Sysctl zum Deaktivieren von Pings für IPv6, aber Sie können es stattdessen in der Firewall deaktivieren, wenn Sie es wirklich benötigen (das Deaktivieren wird natürlich sowieso nicht empfohlen).

Michael Hampton
quelle
5
Deaktivieren von Pings für IPv6 unbehaglich es Konnektivität brechen geraten ist, können die Menschen von Teredo - Adresse verbinden das System nicht mehr erreichen (wie es den Ping verwendet die nächste Anycast teredo Tunnelmaschine zu wählen)
Ferrybig
1
Die Voreinstellung der Namensauflösung für IPv6 im Vergleich zu IPv4 kann mit der /etc/gai.confDatei gesteuert werden. Standardmäßig enthält es nur Kommentare. Wenn Sie die darin enthaltenen precedenceZeilen auskommentieren und die Änderung vornehmen, die auch in den Kommentaren vorgeschlagen wird, können Sie die Hostnamenauflösung so einstellen, dass IPv4 anstelle des Standard-IPv6 bevorzugt wird.
TelcoM
@telcoM Ja, das kannst du. In diesem Fall ist es jedoch eine gute Idee, allen Benutzern dieser Maschine wichtige Warnungen mitzuteilen, da eine Änderung der Rangfolge zu unerwartetem Verhalten führt.
Michael Hampton