ความแตกต่างระหว่างที่อยู่ IP 0.0.0.0 และ 127.0.0.1 คืออะไร


220

ฉันรู้ว่า 127.0.0.1 ~ 127.255.255.254 เป็นที่อยู่ IP ลูปแบ็คสำหรับระบบปฏิบัติการที่ทันสมัยที่สุดและที่อยู่ IP เหล่านี้สามารถใช้เพื่ออ้างถึงคอมพิวเตอร์ของเราเอง

แต่ 0.0.0.0 คืออะไร ดูเหมือนว่ามันยังหมายถึงคอมพิวเตอร์ในพื้นที่ดังนั้นความแตกต่างคืออะไร

และคุณสามารถอธิบายการเชื่อมต่อ IP ต่อไปนี้ให้ฉันได้ไหม

สกรีนช็อตของเอาต์พุต netstat -


6
ดูคำถามนี้ด้วยเพราะให้รายละเอียดว่า 0.0.0.0 คืออะไร (และไม่ใช่): serverfault.com/questions/228629//
Ellie Kesselman

ระบบปฏิบัติการที่ทันสมัยจะใช้::1เป็นที่อยู่ย้อนกลับ
kasperd

คำตอบ:


157

สิ่งเดียวคือคุณไม่ได้พูดว่า "ที่อยู่ทั้งหมดควรมีสิทธิ์เข้าถึง" - ทำในไฟร์วอลล์และ / หรือซอฟต์แวร์เซิร์ฟเวอร์และ / หรือเลเยอร์ความปลอดภัยอื่น ๆ เช่น tcpwrappers

0.0.0.0 ในบริบทนี้หมายถึง "ที่อยู่ IP ทั้งหมดในเครื่องท้องถิ่น" (อันที่จริงอาจเป็น "ที่อยู่ IPv4 ทั้งหมดบนเครื่องท้องถิ่น") ดังนั้นหากเครื่องเซิร์ฟเวอร์ของคุณมีที่อยู่ IP สองแห่งคือ 192.168.1.1 และ 10.1.2.1 และคุณอนุญาตให้ webserver daemon เช่น apache รับฟัง 0.0.0.0 เครื่องจะสามารถเข้าถึงได้ทั้งที่อยู่ IP เหล่านั้น แต่เฉพาะสิ่งที่สามารถติดต่อที่อยู่ IP เหล่านั้นและเว็บพอร์ต

โปรดทราบว่าในบริบทอื่น (การกำหนดเส้นทาง) 0.0.0.0 มักจะหมายถึงเส้นทางเริ่มต้น (เส้นทางไปยัง "ส่วนที่เหลือของ" อินเทอร์เน็ตนอกเหนือจากเส้นทางในเครือข่ายท้องถิ่นของคุณเป็นต้น)


ดังนั้นคุณหมายความว่าซ็อกเก็ตของเว็บเซิร์ฟเวอร์ถูกผูกไว้กับที่อยู่ใด ๆ ที่มีอยู่เมื่อมันฟังบน 0.0.0.0?
onmyway133

0.0.0.0หมายถึงเส้นทางเริ่มต้นเฉพาะเมื่อมันมาพร้อมกับคำนำหน้า/0(หรือ netmask 0.0.0.0)
minmaxavg

หมายเหตุ: หากกระบวนการบางอย่างรับฟัง 0.0.0.0 จะสามารถเข้าถึงได้ที่ที่อยู่ IP ของอินเทอร์เฟซเครือข่ายทั้งหมดของเครื่องซึ่งรวมถึงที่อยู่ที่กำหนดค่าปัจจุบันของอินเตอร์เฟสการวนกลับ แต่ถ้ากระบวนการฟังเฉพาะพอร์ต <portNumber> ของที่อยู่ลูปแบ็คเช่น 127.0.0.1 และกระบวนการนั้นสามารถเข้าถึงได้จากเครื่องเดียวกันโดยกำหนดเป้าหมายที่ 127.0.0.1: <portNumber>เท่านั้น ลองใช้เครื่องมือหลามนี้ เพื่อเล่น!
Gab 是好人

77

เมื่อบริการกำลังรับฟัง 0.0.0.0 นี่หมายถึงบริการกำลังฟังบนอินเทอร์เฟซเครือข่ายที่กำหนดค่าไว้ทั้งหมดเมื่อรับฟัง 127.0.0.1 บริการจะเชื่อมต่อกับอินเทอร์เฟซแบบย้อนกลับเท่านั้น (มีเฉพาะในเครื่องท้องถิ่น)


38

ที่อยู่ IP 0.0.0.0อาจมีความหมายแตกต่างกันมากขึ้นอยู่กับตำแหน่งที่ใช้

  • ไม่ใช่ที่อยู่ที่ถูกต้องที่จะมอบให้กับอินเทอร์เฟซเครือข่ายจริงรวมถึงที่อยู่อื่น ๆ ในเครือข่ายย่อย 0.0.0.0/8 (เช่นที่อยู่ใด ๆ ที่ขึ้นต้นด้วย0.)
  • ไม่สามารถใช้เป็นที่อยู่ต้นทางในแพ็คเก็ต IP ใด ๆ ได้เว้นแต่จะเกิดขึ้นเมื่อคอมพิวเตอร์ยังไม่ทราบที่อยู่ IP ของตนเองและพยายามรับหนึ่ง (ตัวอย่างคลาสสิก: DHCP)
  • หากใช้ในตารางเส้นทางจะระบุเกตเวย์เริ่มต้น เส้นทางไป 0.0.0.0 เป็นเส้นทางเริ่มต้นเช่นเส้นทางที่ใช้เมื่อไม่มีเส้นทางเฉพาะใด ๆ เพิ่มเติมให้ใช้กับที่อยู่ปลายทาง
  • สุดท้ายเมื่อเห็นผลลัพธ์ของnetstatคำสั่ง (ซึ่งเป็นสิ่งที่คุณถาม) ก็หมายความว่าซ็อกเก็ตที่กำหนดให้ฟังในที่อยู่ IP ที่มีอยู่ทั้งหมดที่คอมพิวเตอร์มี; เมื่อคอมพิวเตอร์มีที่อยู่ IP มากกว่าหนึ่งซ็อกเก็ตสามารถผูกกับที่อยู่และคู่พอร์ตเฉพาะหรือพอร์ตและที่อยู่ทั้งหมด หากคุณเห็นที่อยู่ IP ที่นั่นหมายความว่าซ็อกเก็ตกำลังฟังเฉพาะพอร์ตนั้นและที่อยู่เฉพาะนั้น ถ้าคุณเห็น0.0.0.0นั่นหมายถึงมันกำลังฟังพอร์ตนั้นในที่อยู่ทั้งหมดของเครื่องรวมถึงลูปแบ็คหนึ่ง ( 127.0.0.1)

3
หมายความว่าอย่างไรถ้าคุณขด 0.0.0.0 Curl กำลังติดต่อและส่งคำร้องขอผ่านทางอินเตอร์เฟสที่มีอยู่หรือไม่? จะทราบได้อย่างไรว่าอินเทอร์เฟซใดที่เหมาะสม ฉันเข้าใจว่าเซิร์ฟเวอร์อาจรับฟังการเชื่อมต่อทั้งหมด แต่สิ่งที่เป็นกลไกสำหรับลูกค้าที่จะขอการเชื่อมต่อทั้งหมดเช่นเมื่อฉันขด 0.0.0.0 หรือ curl [::]
CMCDragonkai

1
ระบบปฏิบัติการอาจปิดกั้นคุณไม่ให้ทำเช่นนั้นเนื่องจากไม่เพียง แต่ทำให้เข้าใจได้จากมุมมองของเครือข่าย การลองping 0.0.0.0ใช้ระบบ Windows จะส่งผลให้เกิดข้อผิดพลาด
Massimo

curl 0.0.0.0ผลตอบแทนconnection refusedบน Arch Linux ping 0.0.0.0ในทางกลับกันดูเหมือนว่าจะเป็นนามแฝงping 127.0.0.1ที่ทำงานได้ดี
Matthias Braun

@ MatiasiasBraun connection refusedอาจเป็นเพราะขดโดยค่าเริ่มต้นลองเชื่อมต่อกับพอร์ต 80 / tcp พยายามที่จะหาเปิดพอร์ตของคุณด้วยnmap -sV localhostแล้วสำหรับเช่นถ้า 631 / curl 0.0.0.0:631TCP:
Pablo A

27

คำตอบของ Lee B นั้นถูกต้อง แต่นี่คือ RFC ที่เกี่ยวข้องในกรณีที่คุณสนใจ

0.0.0.0:

จากRFC1122 , ส่วน 3.1.2.3:

ตอนนี้เราสรุปกรณีพิเศษที่สำคัญสำหรับที่อยู่ IP Class A, B และ C โดยใช้สัญลักษณ์ต่อไปนี้สำหรับที่อยู่ IP:

            { <Network-number>, <Host-number> }

        or
            { <Network-number>, <Subnet-number>, <Host-number> }

...

          (a)  { 0, 0 }

             This host on this network.  MUST NOT be sent, except as
             a source address as part of an initialization procedure
             by which the host learns its own IP address.

เพียงแค่ "โฮสต์นี้ในเครือข่ายนี้" ... ตามที่คำตอบของ Lee B ระบุว่าสิ่งนี้แปลเป็นที่อยู่ IP ที่มีอยู่ทั้งหมดบนโฮสต์ของคุณ การโฮสต์บริการบน 0.0.0.0 จะโฮสต์บริการนั้นโดยอัตโนมัติในทุก ๆ อินเตอร์เฟสที่สามารถกำหนดแอดเดรสได้

127.0.0.1:

จากRFC5735 :

127.0.0.0/8 - บล็อกนี้ถูกกำหนดให้ใช้เป็นที่อยู่ลูปแบ็คโฮสต์อินเทอร์เน็ต ดาตาแกรมที่โปรโตคอลระดับสูงกว่าส่งไปยังที่อยู่ที่ใดก็ได้ภายในบล็อกนี้จะวนกลับภายในโฮสต์ โดยปกติจะใช้งานโดยใช้เพียง 127.0.0.1/32 สำหรับลูปแบ็ค ตามที่อธิบายไว้ใน [RFC1122], ส่วน 3.2.1.3, ที่อยู่ภายในบล็อค 127.0.0.0/8 ทั้งหมดจะไม่ปรากฏในเครือข่ายใด ๆ อย่างถูกต้องตามกฎหมาย

ความแตกต่างระหว่าง 0.0.0.0 และที่อยู่ลูปแบ็ค 127.0.0.1 คือที่อยู่ลูปแบ็คได้รับการออกแบบมาเพื่อให้สามารถใช้งานอินเทอร์เฟซ IP ภายในโฮสต์ได้อย่างสมบูรณ์โดยไม่คำนึงถึงการตั้งค่าเครือข่ายที่เหลือ ปริมาณข้อมูลใด ๆ ที่ส่งไปยังอุปกรณ์ลูปแบ็คจะได้รับทันที มันไม่มากนักที่เครือข่ายลูปแบ็ค "อ้างอิง" ไปยังโฮสต์ของคุณ ... มันเหมือนคุณมีเซกเมนต์เครือข่ายขนาดเล็กในโฮสต์ของคุณซึ่งอุปกรณ์กระบวนการและซ็อกเก็ตและสามารถเปิดและเชื่อมต่อได้


4

กล่าวอย่างง่าย ๆ : การฟัง 0.0.0.0 หมายถึงการฟังจากทุกที่ที่มีการเข้าถึงเครือข่ายคอมพิวเตอร์นี้เช่นจากคอมพิวเตอร์เครื่องนี้จากเครือข่ายท้องถิ่นหรือจากอินเทอร์เน็ตขณะฟัง 127.0.0.1 หมายถึงฟังจากคอมพิวเตอร์เครื่องนี้เท่านั้น

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