Po wykonaniu następujących czynności, aby wyłączyć odpowiedzi ping:
# sysctl net.ipv4.icmp_echo_ignore_all=1
# sysctl -p
Otrzymuję różne wyniki z pingowania 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
Pingowanie 127.0.0.1 kończy się niepowodzeniem:
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
Dlaczego te wyniki są różne?
127.0.0.1:
127.0.0.1 jest domyślnym sprzężeniem zwrotnym większości systemów. Adres sprzężenia zwrotnego to adres używany przez system do sprawdzania poprawności stosu sieciowego systemu operacyjnego.
Adres pętli zwrotnej dla IPv4 może przyjmować dowolną wartość w podsieci
127.0.0.0/8
Adres pętli zwrotnej dla IPv6 może przyjmować dowolną wartość w podsieci,
::1/128
ping
każda wartość w tym zakresie powinna działać, jeśli stos sieci działa na systemie operacyjnym.localhost:
localhost
to nazwa hosta, to rodzaj nazwy domeny, ale lokalnej dla twojego komputera.Ta nazwa hosta domyślnie wskazuje sprzężenie zwrotne IPv4 i IPv6, które często
127.0.0.1
lub::1
.localhost
adres można łatwo zmienić edytując plik/etc/hosts
.Jeśli twój system korzysta z usługi
systemd-resolved
, ta usługa będzie obsługiwać sposób rozwiązania localhost.Zgodnie z dokumentacją
systemd-resolved
:ping
Podczas próby pingowania nazwy hosta lub nazwy domeny poprosi system operacyjny o rozpoznanie tej nazwy hosta lub nazwy domeny. W twoim przypadku wyłączyłeś,
icmpv4
ale localhost jest rozpoznawany jako pętla zwrotna IPv6 i pętla zwrotna IPv4, ale tylko odpowiedź pętli zwrotnej IPv6.Różnica polega na tym, że w jednym przypadku próbujesz wysłać polecenie ping do adresu IP, a w innym przypadku pingujesz nazwę hosta, która może przyjąć kilka wartości.
Wyłącz icmpv6
Jeśli nie potrzebujesz IPv6, radzę go wyłączyć. Podwoi to całą pracę, którą należy wykonać przy zaporze ogniowej i konfigurowaniu usług:
Jeśli nadal chcesz obsługiwać IPv6 i chcesz tego uniknąć
icmpv6
, możesz użyćip6tables
:źródło
::1 localhost
w nim być.ping 127.100.101.102
będzie działać).localhost
niekoniecznie są potrzebne w/etc/hosts
. Na przykład systemd-resolved syntetyzuje rekordy zasobów DNS dlalocalhost
ilocalhost.localdomain
.hosts
plik, ale nie mam::1 localhost
Ubuntu 17.10Host lokalny ma dwa adresy, adres IPv6 :: 1 i adres IPv4 127.0.0.1.
IPv6 jest domyślnym protokołem, więc :: 1 zawsze jest preferowane zamiast 127.0.0.1. Dlatego pingowałeś :: 1, gdy pytasz o ping localhost.
Jeśli chodzi o to, dlaczego możesz pingować :: 1, ale nie możesz pingować 127.0.0.1, twój sysctl wyłączył pingowanie tylko dla IPv4, ale nie dla IPv6. O ile mogę stwierdzić, nie ma odpowiedniego sysctl do wyłączenia pingów dla IPv6, ale możesz je wyłączyć w firewallu, jeśli naprawdę potrzebujesz (oczywiście wyłączenie go i tak nie jest zalecane).
źródło
/etc/gai.conf
pliku można kontrolować preferencje rozpoznawania nazw dla IPv6 vs. IPv4 . Domyślnie ma tylko komentarze. Jeśli odkomentujesz zawarte w nimprecedence
wiersze i dokonasz zmiany sugerowanej także w komentarzach, możesz uzyskać rozpoznawanie nazw hostów zamiast IPv4 zamiast domyślnego IPv6.