Apa perbedaan antara ping localhost dan ping 127.0.0.1?

31

Setelah menjalankan yang berikut untuk menonaktifkan balasan ping:

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

Saya mendapatkan hasil berbeda dari melakukan 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

Gagal melakukan ping 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

Mengapa hasil ini berbeda?

Helio
sumber

Jawaban:

60

The pingperintah menunjukkan alamat itu diselesaikan nama untuk. Dalam hal ini diselesaikan ke alamat localhost IPv6 ::1,. Di sisi lain, 127.0.0.1adalah alamat IPv4, sehingga secara eksplisit pingmenggunakan IPv4.

Yang sysctlAnda gunakan hanya memengaruhi ping IPv4, jadi Anda mendapat balasan ::1, tetapi tidak untuk 127.0.0.1.

Alamat yang Anda dapatkan dari penyelesaian localhosttergantung pada bagaimana DNS Anda resolver diatur. localhostmungkin diatur /etc/hosts, tetapi secara teori Anda bisa mendapatkannya dari server nama sebenarnya.


Adapun cara menjatuhkan ping IPv6, Anda mungkin perlu memeriksa ip6tables, karena sepertinya tidak ada yang serupa sysctluntuk IPv6. Atau cukup nonaktifkan IPv6 sepenuhnya, jika Anda tidak menggunakannya di jaringan Anda. (Meskipun tentu saja itu bukan ide yang sangat berpandangan ke depan, tetapi bisa dilakukan jika Anda tidak menggunakannya saat ini.)

ilkkachu
sumber
2
IPv6 membutuhkan ICMP agar tidak diblokir agar berfungsi dengan benar. ;)
zaTricky
3
@zaTricky, pertanyaannya hanya disebutkan memblokir ping. Meskipun menjengkelkan dan tidak terlalu berguna, saya tidak berpikir itu akan merusak apa pun secara umum. Memblokir semua paket ICMP jelas akan jauh lebih buruk, tetapi tidak ada yang bahkan menyarankan bahwa, itu hanya disebutkan dalam dua komentar di sini ...
ilkkachu
Memang, bisa lebih spesifik. "ICMP echo-request", biasa disebut ping, diperlukan untuk komunikasi yang baik melalui IPv6. Anda dapat memblokir masuknya ping yang tidak diinginkan secara spontan ke klien - tetapi jika Anda memblokir keluar Anda mungkin melanggar fungsionalitas IPv6. Tidak membantu bahwa pertanyaannya tampaknya telah berubah sejak jawaban diposting.
zaTricky
33

127.0.0.1:
127.0.0.1 adalah loopback default dari kebanyakan sistem. Alamat loopback adalah alamat yang digunakan oleh sistem untuk memvalidasi tumpukan jaringan OS.
Alamat loopback untuk IPv4 dapat mengambil nilai apa pun di subnet 127.0.0.0/8
Alamat loopback untuk IPv6 dapat mengambil nilai apa pun di subnet ::1/128
pingnilai apa pun dalam rentang tersebut harus berfungsi jika tumpukan jaringan Anda berfungsi pada OS Anda.

localhost:
localhost adalah nama host, ini semacam nama domain tetapi lokal untuk mesin Anda sendiri.
Nama host ini secara default menunjuk ke loopback IPv4 dan IPv6 Anda yang sering 127.0.0.1atau ::1.

localhostalamat dapat diubah dengan mudah dengan mengedit file /etc/hosts.
Jika sistem Anda menggunakan layanan systemd-resolved, layanan ini akan menangani cara localhost diselesaikan.
Menurut dokumentasisystemd-resolved :

Nama host "localhost" dan "localhost.localdomain" (serta nama host yang berakhiran ".localhost" atau ".localhost.localdomain") diselesaikan ke alamat IP 127.0.0.1dan::1

ping
Ketika Anda mencoba melakukan ping nama host atau nama domain, OS akan meminta OS untuk menyelesaikan nama host atau nama domain ini. Dalam kasus Anda, Anda dinonaktifkan icmpv4tetapi localhost diselesaikan sebagai loopback IPv6 dan loopback IPv6, tetapi hanya jawaban loopback IPv6.
Perbedaannya adalah dalam satu kasus Anda mencoba untuk melakukan ping IP dan dalam kasus lain Anda melakukan ping nama host yang bisa mengambil beberapa nilai.

Nonaktifkan icmpv6
Jika Anda tidak membutuhkan IPv6, saya sarankan Anda untuk menonaktifkannya. Ini akan menggandakan semua pekerjaan yang perlu Anda lakukan pada firewall dan mengkonfigurasi layanan:

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

Jika Anda masih menginginkan dukungan IPv6 dan ingin menghindari icmpv6, Anda dapat menggunakan ip6tables:

ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
Kiwy
sumber
2
Ada yang salah dengan file host Anda. Seharusnya juga ada ::1 localhostdi dalamnya.
Michael Hampton
2
Catatan: ingat daripada di IPv4 seluruh jaringan 127.0.0.0/8 adalah alamat loopback (jadi ping 127.100.101.102akan bekerja juga).
jjmontes
1
Entri untuk localhostbelum tentu diperlukan di /etc/hosts. Sebagai contoh, systemd-resolved mensintesis catatan sumber daya DNS untuk localhostdan localhost.localdomain.
Johan Myréen
@MichaelHampton Ini bukan hostsfile yang lengkap tapi saya tidak ::1 localhostmenjalankan ubuntu 17.10
Kiwy
2
"Subnet" :: 1/128 hanya berkorespondensi dengan satu IP, sama seperti 127.0.0.1/32 hanya menyelesaikan satu IP.
zaTricky
9

Localhost memiliki dua alamat, alamat IPv6 :: 1 dan alamat IPv4 127.0.0.1.

IPv6 adalah protokol default, jadi :: 1 selalu lebih disukai daripada 127.0.0.1. Inilah sebabnya mengapa Anda telah melakukan ping :: 1 ketika meminta untuk melakukan ping localhost.

Adapun mengapa Anda bisa melakukan ping :: 1 tetapi tidak bisa melakukan ping 127.0.0.1, sysctl Anda hanya menonaktifkan ping untuk IPv4, tetapi tidak untuk IPv6. Sejauh yang saya tahu, tidak ada sysctl yang sesuai untuk menonaktifkan ping untuk IPv6, tetapi Anda dapat menonaktifkannya di firewall jika Anda benar-benar perlu (tentu saja menonaktifkan itu tidak dianjurkan pula).

Michael Hampton
sumber
5
Menonaktifkan ping untuk IPv6 tidak disarankan karena merusak konektivitas, orang yang terhubung dari alamat teredo tidak dapat lagi mencapai mesin (karena menggunakan ping untuk memilih mesin terowongan teredo anycast terdekat)
Ferrybig
1
Preferensi resolusi nama untuk IPv6 vs IPv4 dapat dikontrol dengan /etc/gai.conffile. Secara default, ini hanya memiliki komentar. Jika Anda menghapus tanda komentar precedencebaris di dalamnya dan membuat perubahan yang juga disarankan di komentar, Anda bisa mendapatkan resolusi nama host untuk lebih memilih IPv4 daripada IPv6 default.
telcoM
@telcoM Ya, Anda bisa melakukannya. Namun, jika Anda melakukannya, ada baiknya untuk memberikan peringatan yang jelas bagi siapa saja yang mungkin menggunakan mesin itu, karena mengubah presedensi akan menimbulkan perilaku yang tidak terduga.
Michael Hampton