После выполнения следующего, чтобы отключить пинг-ответы:
# 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
Почему эти результаты отличаются?
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
:ping
Когда вы пытаетесь пропинговать имя хоста или имя домена, она попросит ОС разрешить это имя хоста или имя домена. В вашем случае вы отключили,
icmpv4
но localhost разрешается как петля IPv6 и петля IPv4, но только как ответ петли IPv6.Разница в том, что в одном случае вы пытаетесь пропинговать IP, а в другом - пинговать имя хоста, которое может принимать несколько значений.
Отключите icmpv6.
Если вам не нужен IPv6, советую отключить его. Это удвоит всю работу, которую вам потребуется выполнить на брандмауэре и настройке сервисов:
Если вы все еще хотите поддержку IPv6 и хотите ее избежать
icmpv6
, вы можете использоватьip6tables
:источник
::1 localhost
в нем.ping 127.100.101.102
будет работать).localhost
не обязательно нужны в/etc/hosts
. Например, systemd-resolved синтезирует записи ресурсов DNS дляlocalhost
иlocalhost.localdomain
.hosts
файл, но у меня не::1 localhost
работает Ubuntu 17.10Localhost имеет два адреса: адрес 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, но вы можете отключить его в брандмауэре вместо этого, если вам действительно это нужно (конечно, отключать его не рекомендуется в любом случае).
источник
/etc/gai.conf
файла. По умолчанию он имеет только комментарии. Если вы раскомментируетеprecedence
строки в нем и внесете изменения, также предложенные в комментариях, вы можете получить разрешение имени хоста, чтобы предпочитать IPv4 вместо IPv6 по умолчанию.