Quelle est la différence entre ping localhost et ping 127.0.0.1?

31

Après avoir exécuté ce qui suit pour désactiver les réponses ping:

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

J'obtiens des résultats différents en envoyant une requête ping à 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

Le ping 127.0.0.1 échoue:

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

Pourquoi ces résultats sont-ils différents?

Hélio
la source

Réponses:

60

La pingcommande affiche l'adresse à laquelle elle a résolu le nom. Dans ce cas , il résolu à l'adresse de l'IPv6, ::1. D'un autre côté, 127.0.0.1c'est une adresse IPv4, elle utilise donc explicitement pingIPv4.

Le que sysctlvous avez utilisé affecte uniquement les pings IPv4, vous obtenez donc des réponses pour ::1, mais pas pour 127.0.0.1.

L'adresse que vous obtenez en résolvant localhostdépend de la configuration de votre DNS est résolveur. localhostest probablement installé /etc/hosts, mais en théorie, vous pouvez l'obtenir à partir d'un serveur de noms réel.


Quant à savoir comment supprimer les pings IPv6, vous devrez peut-être examiner ip6tables, car il ne semble pas y avoir de similaire sysctlpour IPv6. Ou désactivez simplement IPv6, si vous ne l'utilisez pas sur votre réseau. (Bien sûr, ce n'est pas une idée très prospective, mais faisable si vous ne l'utilisez pas actuellement de toute façon.)

ilkkachu
la source
2
IPv6 nécessite que ICMP ne soit pas bloqué pour fonctionner correctement. ;)
zaTricky
3
@zaTricky, la question ne mentionnait que le blocage du ping. Bien que désagréable et peu utile, je ne pense pas que cela devrait casser quoi que ce soit en général. Bloquer tous les paquets ICMP serait évidemment bien pire, mais personne ne l'a même suggéré, cela n'était mentionné que dans les deux commentaires ici ...
ilkkachu
Certes, pourrait être plus précis. Une "requête d'écho ICMP", communément appelée ping, est requise pour une communication correcte sur IPv6. Vous pouvez bloquer les entrées de ping indésirables et spontanées vers les clients, mais si vous bloquez les communications sortantes, vous rompez probablement la fonctionnalité IPv6. Cela n'aide pas que la question semble avoir changé depuis la publication des réponses.
zaTricky
33

127.0.0.1:
127.0.0.1 est le bouclage par défaut de la plupart des systèmes. Une adresse de bouclage est une adresse utilisée par le système pour valider la pile réseau du système d'exploitation.
L'adresse de bouclage pour IPv4 peut prendre n'importe quelle valeur dans le sous-réseau 127.0.0.0/8
L'adresse de bouclage pour IPv6 peut prendre n'importe quelle valeur dans le sous-réseau, ::1/128
pingn'importe quelle valeur dans cette plage devrait fonctionner si votre pile réseau fonctionne sur votre système d'exploitation.

localhost:
localhost est un nom d'hôte, c'est une sorte de nom de domaine mais local sur votre propre machine.
Ce nom d'hôte pointe par défaut vers votre bouclage IPv4 et IPv6 qui est souvent 127.0.0.1ou ::1.

localhostl'adresse peut être facilement modifiée en modifiant le fichier /etc/hosts.
Si votre système utilise le service systemd-resolved, ce service gérera la façon dont localhost est résolu.
Selon la documentation desystemd-resolved :

Les noms d'hôtes "localhost" et "localhost.localdomain" (ainsi que tout nom d'hôte se terminant par ".localhost" ou ".localhost.localdomain") sont résolus en adresses IP 127.0.0.1et::1

ping
Lorsque vous essayez d'envoyer une requête ping à un nom d'hôte ou à un nom de domaine, il demandera au système d'exploitation de résoudre ce nom d'hôte ou ce nom de domaine. Dans votre cas, vous avez désactivé icmpv4mais localhost est résolu comme votre bouclage IPv6 et votre bouclage IPv4 mais uniquement votre réponse de bouclage IPv6.
La différence est que dans un cas, vous essayez d'envoyer une requête ping à une adresse IP et dans l'autre, vous envoyez une requête ping à un nom d'hôte qui peut prendre plusieurs valeurs.

Désactivez icmpv6
Si vous n'avez pas besoin d'IPv6, je vous conseille de le désactiver. Il doublera tout le travail que vous auriez besoin de faire sur le pare-feu et la configuration des services:

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

Si vous voulez toujours le support IPv6 et que vous voulez éviter icmpv6, vous pouvez utiliser ip6tables:

ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
Kiwy
la source
2
Quelque chose ne va pas avec votre fichier d'hôtes. Il devrait également y ::1 localhostfigurer.
Michael Hampton
2
Remarque: rappelez-vous qu'en IPv4, l'ensemble du réseau 127.0.0.0/8 est une adresse de bouclage (cela ping 127.100.101.102fonctionnera également).
jjmontes
1
Les entrées pour localhostne sont pas nécessairement nécessaires dans /etc/hosts. Par exemple, résolu par systemd synthétise les enregistrements de ressources DNS pour localhostet localhost.localdomain.
Johan Myréen
@MichaelHampton Ce n'est pas le hostsfichier complet mais je n'ai pas ::1 localhostexécuté ubuntu 17.10
Kiwy
2
Le "sous-réseau" :: 1/128 correspond à une seule IP, tout comme 127.0.0.1/32 ne se résout qu'à cette IP.
zaTricky
9

Localhost a deux adresses, une adresse IPv6 :: 1 et une adresse IPv4 127.0.0.1.

IPv6 est le protocole par défaut, donc :: 1 est toujours préféré à 127.0.0.1. C'est pourquoi vous avez pingé :: 1 lorsque vous demandez à ping localhost.

Quant à savoir pourquoi vous pouviez ping :: 1 mais pas ping 127.0.0.1, votre sysctl a seulement désactivé les pings pour IPv4, mais pas pour IPv6. Pour autant que je sache, il n'y a pas de sysctl correspondant pour désactiver les pings pour IPv6, mais vous pouvez le désactiver dans le pare-feu à la place si vous en avez vraiment besoin (bien sûr, le désactiver n'est pas recommandé de toute façon).

Michael Hampton
la source
5
La désactivation des pings pour IPv6 est mal avisée car elle casse la connectivité, les personnes se connectant à partir de l'adresse teredo ne peuvent plus atteindre la machine (car elle utilise le ping pour sélectionner la machine tunnel teredo anycast la plus proche)
Ferrybig
1
La préférence de résolution de nom pour IPv6 par rapport à IPv4 peut être contrôlée avec le /etc/gai.conffichier. Par défaut, il n'a que des commentaires. Si vous décommentez les precedencelignes qu'il contient et apportez la modification également suggérée dans les commentaires, vous pouvez obtenir la résolution du nom d'hôte pour préférer IPv4 au lieu de l'IPv6 par défaut.
telcoM
@telcoM Oui, vous pouvez le faire. Si vous le faites, cependant, c'est une bonne idée de donner des avertissements importants à toute personne qui pourrait utiliser cette machine, car la modification de la priorité introduit un comportement inattendu.
Michael Hampton