Qual é a diferença entre ping localhost e ping 127.0.0.1?

31

Depois de executar o seguinte, para desativar as respostas de ping:

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

Eu obtenho resultados diferentes do ping do host local 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

O ping do 127.0.0.1 falha:

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 que esses resultados são diferentes?

Helio
fonte

Respostas:

60

O pingcomando mostra o endereço para o qual o nome foi resolvido. Nesse caso, ele foi resolvido para o endereço de host local IPv6 ::1,. Por outro lado, 127.0.0.1é um endereço IPv4, portanto, pingusa explicitamente o IPv4.

O que sysctlvocê usou afeta apenas os pings do IPv4; portanto, você obtém respostas para ::1, mas não para 127.0.0.1.

O endereço que você obtém da resolução localhostdepende de como o DNS está resolvido. localhostprovavelmente está definido /etc/hosts, mas em teoria você pode obtê-lo em um servidor de nomes real.


Quanto a como eliminar pings do IPv6, pode ser necessário analisar ip6tables, pois não parece haver um similar sysctlpara o IPv6. Ou simplesmente desative o IPv6 completamente, se você não o estiver usando na sua rede. (Embora, é claro, essa não seja uma ideia muito prospectiva, mas factível se você não a estiver usando no momento.)

ilkkachu
fonte
2
O IPv6 exige que o ICMP não seja bloqueado para funcionar corretamente. ;)
zaTricky
3
@zaTricky, a questão mencionava apenas o bloqueio de ping. Embora desagradável e não muito útil, não acho que deva quebrar nada em geral. Bloqueando todos os pacotes ICMP, obviamente, seria muito pior, mas ninguém até sugeriu que, só foi mencionado nos dois comentários aqui ...
ilkkachu
Concedido, poderia ser mais específico. A "solicitação de eco ICMP", geralmente chamada de ping, é necessária para a comunicação adequada pelo IPv6. Você pode bloquear entradas de ping espontâneas e indesejadas para os clientes - mas se você bloquear a saída, provavelmente estará quebrando a funcionalidade do IPv6. Não ajuda que a pergunta pareça ter sido alterada desde que as respostas foram postadas.
zaTricky
33

127.0.0.1:
127.0.0.1 é o loopback padrão da maioria dos sistemas. Um endereço de loopback é um endereço usado pelo sistema para validar a pilha de rede do sistema operacional.
O endereço de loopback para IPv4 pode ter qualquer valor na sub-rede 127.0.0.0/8
O endereço de loopback para IPv6 pode ter qualquer valor na sub-rede, ::1/128
pingqualquer valor nesse intervalo deve funcionar se a pilha de rede estiver funcionando no sistema operacional.

localhost:
localhost é um nome de host, é um tipo de nome de domínio, mas local em sua própria máquina.
Esse nome de host, por padrão, aponta para o seu loopback IPv4 e IPv6, que geralmente é 127.0.0.1ou ::1.

localhostendereço pode ser alterado facilmente editando o arquivo /etc/hosts.
Se o seu sistema usar o serviço systemd-resolved, esse serviço manipulará a maneira como o host local é resolvido.
De acordo com a documentação desystemd-resolved :

Os nomes de host "localhost" e "localhost.localdomain" (assim como qualquer nome de host que termine em ".localhost" ou ".localhost.localdomain") são resolvidos para os endereços IP 127.0.0.1e::1

ping
Quando você tenta executar ping em um nome de host ou domínio, ele solicitará ao sistema operacional que resolva esse nome de host ou nome de domínio. No seu caso, você desativou, icmpv4mas o host local é resolvido como seu loopback IPv6 e seu loopback IPv4, mas apenas sua resposta de loopback IPv6.
A diferença é que, em um caso, você está tentando executar ping em um IP e, no outro, em um nome de host que pode assumir vários valores.

Desativar icmpv6
Se você não precisar do IPv6, aconselho a desativá-lo. Dobrará todo o trabalho que você precisará fazer no firewall e na configuração de serviços:

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

Se você ainda deseja suporte ao IPv6 e deseja evitar icmpv6, você pode usar ip6tables:

ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
Kiwy
fonte
2
Algo está errado com o seu arquivo hosts. Também deveria ter ::1 localhostnele.
Michael Hampton
2
Nota lateral: lembre-se de que no IPv4 toda a rede 127.0.0.0/8 é um endereço de loopback (também ping 127.100.101.102funcionará).
jjmontes
1
Entradas para localhostnão são necessariamente necessárias no /etc/hosts. Por exemplo, resolvido pelo systemd sintetiza registros de recursos DNS para localhoste localhost.localdomain.
Johan Myréen 14/0318
@MichaelHampton Não é o hostsarquivo completo, mas não tenho ::1 localhosto ubuntu 17.10 em execução
#
2
A "sub-rede" :: 1/128 corresponde a apenas um IP, assim como 127.0.0.1/32 é resolvido apenas para esse IP.
ZaTricky 16/03/19
9

O host local possui dois endereços, um endereço IPv6 :: 1 e um endereço IPv4 127.0.0.1.

IPv6 é o protocolo padrão, portanto, :: 1 é sempre preferível a 127.0.0.1. É por isso que você efetuou o ping :: 1 ao solicitar o ping do host local.

Quanto ao motivo pelo qual você pode executar ping :: 1, mas não pode executar o 127.0.0.1, seu sysctl desativou apenas os pings para IPv4, mas não para IPv6. Até onde eu sei, não há sysctl correspondente para desativar pings para IPv6, mas você pode desativá-lo no firewall, se realmente precisar (é claro que desativá-lo não é recomendado).

Michael Hampton
fonte
5
Desativando pings para IPv6 é mal aconselhado para ele quebrar conectividade, as pessoas que ligam de Teredo endereço não pode chegar a máquina (como ele usa o ping para selecionar o mais próximo anycast máquina de túnel Teredo)
Ferrybig
1
A preferência da resolução de nomes para IPv6 vs. IPv4 pode ser controlada com o /etc/gai.confarquivo. Por padrão, ele possui apenas comentários. Se você descomentar as precedencelinhas contidas nele e fizer as alterações também sugeridas nos comentários, poderá obter a resolução do nome do host para preferir o IPv4 em vez do IPv6 padrão.
Telcom
@telcoM Sim, você pode fazer isso. No entanto, se você fizer isso, é uma boa ideia dar avisos importantes a qualquer pessoa que possa usar essa máquina, pois a alteração da precedência introduz um comportamento inesperado.
Michael Hampton