В чем разница между ping localhost и ping 127.0.0.1?

31

После выполнения следующего, чтобы отключить пинг-ответы:

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

Я получаю разные результаты от pinging localhost против 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

Пинг 127.0.0.1 не выполняется:

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

Почему эти результаты отличаются?

гелиограф
источник

Ответы:

60

Команда pingпоказывает адрес, в котором она разрешила имя. В этом случае он разрешается на локальный IPv6-адрес ::1. С другой стороны, 127.0.0.1это адрес IPv4, поэтому он явно pingиспользует IPv4.

Используемое sysctlвами действие влияет только на эхо-запросы IPv4, поэтому вы получаете ответы за ::1, но не за 127.0.0.1.

Адрес, который вы получите от разрешения, localhostзависит от того, как настроен ваш DNS- адрес . localhostВозможно, он установлен /etc/hosts, но теоретически вы можете получить его с реального сервера имен.


Что касается того, как отбрасывать эхо-запросы IPv6, вам, возможно, придется разобраться ip6tables, так как похоже, что sysctlдля IPv6 подобного нет . Или просто полностью отключите IPv6, если вы не используете его в своей сети. (Хотя, конечно, это не очень дальновидная идея, но выполнимо, если вы все равно ее не используете.)

ilkkachu
источник
2
Для правильной работы IPv6 требуется, чтобы ICMP не блокировался. ;)
zaTricky
3
@zaTricky, в вопросе упоминается только блокирующий пинг. Хотя это неприятно и не очень полезно, я не думаю, что это вообще должно что-то сломать. Блокировка всех ICMP-пакетов, очевидно, была бы намного хуже, но никто даже не предположил, что это упоминалось только в двух комментариях здесь ...
ilkkachu
Конечно, может быть более конкретным. «Эхо-запрос ICMP», обычно называемый ping, требуется для правильной связи по IPv6. Вы можете заблокировать спонтанные нежелательные входы ping для клиентов - но если вы блокируете исходящие, вы, вероятно, нарушаете функциональность IPv6. Не помогает, что вопрос, кажется, изменился, так как ответы были отправлены.
zaTricky
33

127.0.0.1:
127.0.0.1 - это петля по умолчанию для большинства систем. Адрес обратной связи - это адрес, используемый системой для проверки сетевого стека ОС.
Адрес обратной связи для IPv4 может принимать любое значение в подсети 127.0.0.0/8
. Адрес обратной связи для IPv6 может принимать любое значение в подсети, ::1/128
pingлюбое значение в этом диапазоне должно работать, если ваш сетевой стек работает в вашей ОС.

localhost:
localhost это имя хоста, это своего рода доменное имя, но локальное для вашего компьютера.
Это имя хоста по умолчанию указывает на вашу петлю IPv4 и IPv6, которая часто 127.0.0.1или ::1.

localhostадрес может быть легко изменен путем редактирования файла /etc/hosts.
Если ваша система использует службу systemd-resolved, эта служба будет обрабатывать способ разрешения локального хоста.
Согласно документацииsystemd-resolved :

Имена хостов "localhost" и "localhost.localdomain" (а также любые имена хостов, заканчивающиеся на ".localhost" или ".localhost.localdomain") преобразуются в IP-адреса 127.0.0.1и::1

ping
Когда вы пытаетесь пропинговать имя хоста или имя домена, она попросит ОС разрешить это имя хоста или имя домена. В вашем случае вы отключили, icmpv4но localhost разрешается как петля IPv6 и петля IPv4, но только как ответ петли IPv6.
Разница в том, что в одном случае вы пытаетесь пропинговать IP, а в другом - пинговать имя хоста, которое может принимать несколько значений.

Отключите icmpv6.
Если вам не нужен IPv6, советую отключить его. Это удвоит всю работу, которую вам потребуется выполнить на брандмауэре и настройке сервисов:

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

Если вы все еще хотите поддержку IPv6 и хотите ее избежать icmpv6, вы можете использовать ip6tables:

ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
Kiwy
источник
2
Что-то не так с вашим файлом hosts. Это также должно быть ::1 localhostв нем.
Майкл Хэмптон
2
Примечание: помните, что в IPv4 вся сеть 127.0.0.0/8 - это петлевые адреса (так же ping 127.100.101.102будет работать).
jjmontes
1
Записи для localhostне обязательно нужны в /etc/hosts. Например, systemd-resolved синтезирует записи ресурсов DNS для localhostи localhost.localdomain.
Йохан Мирен
@MichaelHampton Это не полный hostsфайл, но у меня не ::1 localhostработает Ubuntu 17.10
Kiwy
2
«Подсеть» :: 1/128 соответствует только одному IP, так же, как 127.0.0.1/32 разрешает только этот IP.
zaTricky
9

Localhost имеет два адреса: адрес IPv6 :: 1 и адрес IPv4 127.0.0.1.

Протокол IPv6 является протоколом по умолчанию, поэтому :: 1 всегда предпочтительнее, чем 127.0.0.1. Вот почему вы пинговали :: 1, когда просили пропинговать localhost.

Что касается того, почему вы можете пропинговать :: 1, но не можете пропинговать 127.0.0.1, ваш sysctl отключил только эхо-запросы для IPv4, но не для IPv6. Насколько я могу судить, не существует соответствующего sysctl для отключения ping для IPv6, но вы можете отключить его в брандмауэре вместо этого, если вам действительно это нужно (конечно, отключать его не рекомендуется в любом случае).

Майкл Хэмптон
источник
5
Отключение эхо-запросов для IPv6 не рекомендуется, поскольку это нарушает соединение, люди, соединяющиеся с адреса Teredo, больше не могут добраться до машины (так как он использует эхо-запрос для выбора ближайшего туннельного компьютера
Anycast Teredo
1
Предпочтение разрешения имен для IPv6 по сравнению с IPv4 можно контролировать с помощью /etc/gai.confфайла. По умолчанию он имеет только комментарии. Если вы раскомментируете precedenceстроки в нем и внесете изменения, также предложенные в комментариях, вы можете получить разрешение имени хоста, чтобы предпочитать IPv4 вместо IPv6 по умолчанию.
TelcoM
@ TelcoM Да, вы можете сделать это. Тем не менее, если вы это сделаете, хорошей идеей будет сделать выдающиеся предупреждения всем, кто может использовать эту машину, поскольку изменение приоритета приводит к неожиданному поведению.
Майкл Хэмптон