web-dev-qa-db-fra.com

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

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?

31
Helio

La commande ping affiche l'adresse à laquelle elle a résolu le nom. Dans ce cas, il a été résolu en adresse d'hôte local IPv6, ::1. D'autre part, 127.0.0.1 est une adresse IPv4, elle oblige donc explicitement ping à utiliser IPv4.

Le sysctl que vous avez utilisé n'affecte que 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 localhost dépend de la configuration de votre DNS est résolveur. localhost est probablement défini dans /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 sysctl similaire pour 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 réalisable si vous ne l'utilisez pas actuellement de toute façon.)

60
ilkkachu

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
ping toute 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.1 ou ::1.

localhost l'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 résolution de localhost.
Selon la documentation de systemd-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.1 et ::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é icmpv4 mais localhost est résolu comme votre bouclage IPv6 et votre bouclage IPv4 mais uniquement votre réponse de bouclage IPv6.
.

Désactiver 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 souhaitez toujours la prise en charge IPv6 et que vous souhaitez éviter icmpv6, vous pouvez utiliser ip6tables:

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

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 pouvez 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).

9
Michael Hampton