ข้อแตกต่างระหว่าง ping localhost กับ ping 127.0.0.1 คืออะไร?


31

หลังจากดำเนินการต่อไปนี้เพื่อปิดการตอบ ping:

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

ฉันได้รับผลลัพธ์ที่แตกต่างจากการ ping 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

ส่ง 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

ทำไมผลลัพธ์เหล่านี้จึงแตกต่างกัน

คำตอบ:


60

pingแสดงให้เห็นว่าคำสั่งที่อยู่การแก้ไขชื่อ ในกรณีนี้จะได้รับการแก้ไขไปยังที่อยู่ IPv6 ::1localhost, ในทางกลับกัน127.0.0.1เป็นที่อยู่ IPv4 ดังนั้นจึงpingใช้ IPv4 อย่างชัดเจน

sysctlที่คุณใช้จะมีผลต่อการส่ง Ping IPv4 ให้คุณได้รับการตอบกลับสำหรับแต่ไม่ได้สำหรับ::1127.0.0.1

ที่อยู่ที่คุณได้รับจากการแก้ไขlocalhostขึ้นอยู่กับวิธีการตั้งค่าตัวแก้ไข DNS ของคุณ localhostอาจมีการตั้งค่าไว้/etc/hostsแต่ในทางทฤษฎีคุณสามารถรับได้จากเซิร์ฟเวอร์ชื่อจริง


สำหรับวิธีการทิ้ง IPv6 pings คุณอาจต้องดูip6tablesเพราะดูเหมือนจะไม่เหมือนกันsysctlสำหรับ IPv6 หรือปิดการใช้งาน IPv6 ทั้งหมดหากคุณไม่ได้ใช้งานในเครือข่ายของคุณ (แม้ว่าแน่นอนว่าไม่ใช่ความคิดที่คาดการณ์ล่วงหน้า แต่ทำได้ถ้าคุณไม่ได้ใช้งานอยู่ในขณะนี้)


2
IPv6 ต้องการให้ ICMP ไม่ถูกบล็อกเพื่อให้สามารถทำงานได้อย่างถูกต้อง ;)
zaTricky

3
@zaTricky คำถามพูดถึงการบล็อก ping เท่านั้น ในขณะที่น่ารังเกียจและไม่มีประโยชน์มากฉันไม่คิดว่ามันควรทำลายอะไรโดยทั่วไป การปิดกั้นแพ็คเก็ต ICMP ทั้งหมดจะเลวร้ายลงอย่างเห็นได้ชัด แต่ไม่มีใครแนะนำว่ามันถูกกล่าวถึงในสองความคิดเห็นเท่านั้นที่นี่ ...
ilkkachu

จริงอยู่อาจมีความเฉพาะเจาะจงมากขึ้น "ICMP echo-request" ซึ่งโดยทั่วไปเรียกว่า 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นี้จะจัดการกับวิธีการแก้ไข localhost
ตามเอกสารของsystemd-resolved :

ชื่อโฮสต์ "localhost" และ "localhost.localdomain" (รวมถึงชื่อโฮสต์ใด ๆ ที่ลงท้ายด้วย ".localhost" หรือ ".localhost.localdomain") ได้รับการแก้ไขเป็นที่อยู่ IP 127.0.0.1และ::1

ping
เมื่อคุณพยายาม ping ชื่อโฮสต์หรือชื่อโดเมนมันจะขอให้ระบบปฏิบัติการแก้ไขชื่อโฮสต์หรือชื่อโดเมนนี้ ในกรณีของคุณคุณปิดการใช้งานicmpv4แต่ localhost ได้รับการแก้ไขเป็น IPv6 loopback ของคุณและ IPv4 loopback ของคุณ แต่เฉพาะคำตอบ loop6 IPv6 ของคุณ
ความแตกต่างคือในกรณีหนึ่งที่คุณพยายาม ping IP และในอีกกรณีหนึ่งคุณ ping ชื่อโฮสต์ที่อาจมีค่าหลายค่า

ปิดการใช้งาน 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

2
มีบางอย่างผิดปกติกับไฟล์โฮสต์ของคุณ มันควรจะมี::1 localhostในมัน
Michael Hampton

2
หมายเหตุด้านข้าง: จดจำมากกว่าใน IPv4 เครือข่าย 127.0.0.0/8 ทั้งหมดเป็นที่อยู่ย้อนกลับ (ดังนั้นping 127.100.101.102จะทำงานได้ดี)
jjmontes

1
รายการสำหรับจะไม่จำเป็นต้องจำเป็นต้องอยู่ในlocalhost /etc/hostsยกตัวอย่างเช่น systemd แก้ไขสังเคราะห์ระเบียนทรัพยากร DNS สำหรับและlocalhost localhost.localdomain
Johan Myréen

@MichaelHampton มันไม่ได้เป็นhostsไฟล์ที่สมบูรณ์แต่ฉันไม่ได้::1 localhostใช้ Ubuntu 17.10
Kiwy

2
"subnet" :: 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 นี่คือเหตุผลที่คุณ pinged :: 1 เมื่อขอ ping localhost

สำหรับสาเหตุที่คุณสามารถ ping :: 1 แต่ไม่สามารถส่ง Ping ได้ 127.0.0.1 sysctl ของคุณปิดการใช้งาน pings เฉพาะสำหรับ IPv4 แต่ไม่ใช่ ping ที่ IPv6 เท่าที่ฉันสามารถบอกได้ไม่มี sysctl ที่เกี่ยวข้องในการปิดการใช้งาน pings สำหรับ IPv6 แต่คุณสามารถปิดการใช้งานในไฟร์วอลล์แทนหากคุณต้องการจริงๆ (แน่นอนว่าไม่แนะนำให้ปิดการใช้งาน)


5
แนะนำให้ปิดการใช้งาน pings สำหรับ IPv6 ในกรณีที่การเชื่อมต่อขาดการเชื่อมต่อผู้คนจากที่อยู่ teredo ไม่สามารถเข้าถึงเครื่องได้อีกต่อไป (เนื่องจากใช้ ping เพื่อเลือกเครื่องอุโมงค์ teredo anycast ที่ใกล้เคียงที่สุด)
Ferrybig

1
การกำหนดค่าตามความชอบของการจำแนกชื่อสำหรับ IPv6 กับ IPv4 สามารถควบคุมได้ด้วย/etc/gai.confไฟล์ โดยค่าเริ่มต้นจะมีเพียงความคิดเห็น หากคุณไม่ใส่เครื่องหมายprecedenceในบรรทัดและทำการเปลี่ยนแปลงในข้อคิดเห็นคุณสามารถขอความละเอียดชื่อโฮสต์ให้เลือกใช้ IPv4 แทนค่าเริ่มต้นของ IPv6
telcoM

@telcoM ใช่คุณสามารถทำได้ หากคุณทำเช่นนี้เป็นความคิดที่ดีที่จะให้คำเตือนที่โดดเด่นสำหรับทุกคนที่อาจใช้เครื่องดังกล่าวเนื่องจากการเปลี่ยนลำดับความสำคัญนำไปสู่พฤติกรรมที่ไม่คาดคิด
Michael Hampton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.