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

30

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

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

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

O ping 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?

    
por Helio 14.03.2018 / 16:54

3 respostas

60

O comando ping mostra o endereço para o qual o nome foi resolvido. Nesse caso, ele foi resolvido para o endereço de localhost IPv6, ::1 . Por outro lado, 127.0.0.1 é um endereço IPv4, portanto faz explicitamente ping usar IPv4.

O sysctl que você usou afeta apenas os pings do IPv4, então você recebe respostas para ::1 , mas não para 127.0.0.1 .

O endereço obtido da resolução de localhost depende de como o seu resolvedor de DNS está configurado. localhost é provavelmente definido em /etc/hosts , mas em teoria você pode obtê-lo de um servidor de nomes real.

Quanto a como eliminar pings IPv6, talvez seja necessário pesquisar ip6tables , pois não parece haver sysctl semelhante para IPv6. Ou simplesmente desabilite o IPv6 completamente, se você não estiver usando em sua rede. (Embora, é claro, essa não seja uma ideia muito voltada para o futuro, mas factível se você não a estiver usando atualmente.)

    
por 14.03.2018 / 17:22
31

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 o IPv4 pode ter algum 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
ping . Qualquer valor nesses intervalos deve funcionar se sua pilha de rede estiver funcionando em seu sistema operacional.

localhost:
localhost é um nome de host, isso é uma espécie de nome de domínio, mas é local de sua própria máquina.
Por padrão, esse nome de host aponta para o loopback IPv4 e IPv6, que geralmente é 127.0.0.1 ou ::1 .

localhost address 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 de systemd-resolved :

The hostnames "localhost" and "localhost.localdomain" (as well as any hostname ending in ".localhost" or ".localhost.localdomain") are resolved to the IP addresses 127.0.0.1 and ::1

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

Desativar icmpv6
Se você não precisa de IPv6 eu aconselho você a desativá-lo. Ele duplicará todo o trabalho que você precisaria fazer no firewall e na configuração de serviços:

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

Se você ainda quiser suporte a IPv6 e quiser evitar icmpv6 , você pode usar ip6tables :

ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
    
por 14.03.2018 / 17:14
9

O localhost tem 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 preferencial em relação a 127.0.0.1. É por isso que você pingou :: 1 ao pedir ping localhost.

Por que você pode pingar :: 1 mas não conseguiu fazer ping em 127.0.0.1, seu sysctl só desabilitou pings para IPv4, mas não para IPv6. Tanto quanto eu posso dizer, não há sysctl correspondente para desativar pings para o IPv6, mas você pode desativá-lo no firewall, em vez disso, se você realmente precisa (claro, desabilitá-lo não é recomendado de qualquer maneira).

    
por 14.03.2018 / 18:08

Tags