ซีแมนทิกส์ของ :: และ 0.0.0.0 ในระบบปฏิบัติการแบบดูอัลสแต็ก


10

ย้อนกลับไปในวันที่มี IPv4 เท่านั้นการเชื่อมต่อ LISTEN ที่แสดงในnetstatขณะที่กำลังฟัง0.0.0.0จะตอบสนองต่อการเชื่อมต่อบนอินเตอร์เฟส IPv4 ใด ๆ ในระบบ

ตามที่ฉันเข้าใจแล้วสำนวนใหม่ของ IPv6 ::จะฟังในอินเทอร์เฟซIPv6 และ IPv4 ที่มีอยู่ทั้งหมด ถูกต้องหรือไม่สำหรับทุก OS (Unix, Windows, Mac) มีสำนวนที่ต้องฟังในอินเตอร์เฟส IPv6 หรือไม่?

คำตอบ:


17

น่าเสียดายที่สิ่งนี้แตกต่างกันไปตามระบบปฏิบัติการที่คุณใช้

บน Microsoft Windows ผูกซ็อกเก็ตเพื่อ::ผูกกับพอร์ต IPv6 เท่านั้น ดังนั้นเพื่อฟังบนอยู่ทั้งหมดทั้ง IPv4 และ IPv6 คุณจะต้องผูกไว้กับเช่นเดียวกับ0.0.0.0 ::สารสกัดต่อไปนี้มาจากกล่อง Vista:

C:\>netstat -an | find "445"
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    [::]:445               [::]:0                 LISTENING

ตัวอย่างที่ฉันให้คือพอร์ต 445 ใช้สำหรับการรับส่งข้อมูล SMB เมื่อไม่ได้ใช้ NetBIOS ในขณะที่คุณสามารถดูจะมีผลผูกพันกับทั้งสอง0.0.0.0และ::เพื่อให้ตามลำดับทั้ง IPv4 และ IPv6 ลูกค้าทำงาน

บน Linux ::นั้นรวมถึงที่อยู่ IPv4 ที่ใช้งานร่วมกันได้ตามที่คุณคาดเดาได้อย่างถูกต้องดังนั้นการรวมเข้า0.0.0.0ด้วยกันจึงไม่จำเป็น ฉันเขียนโปรแกรม Python อย่างง่ายที่ผูกกับAF_INET6ซ็อกเก็ต::เท่านั้น แม้ว่าฉันจะไม่ได้ผูกกับAF_INETซ็อกเก็ต (IPv4) แต่ก็ยังยอมรับการเชื่อมต่อจากไคลเอนต์ IPv4 ถ้าบอกว่าเชื่อมต่อกับมันก็จะแสดงขึ้นเป็นเชื่อมต่อจาก10.1.1.3::ffff:10.1.1.3

ยกเว้นว่ามันจะมีขนดก ข้อมูลข้างต้นไม่ได้ใช้กับ Linux หาก/proc/sys/net/ipv6/bindv6onlyตั้งค่าไว้1ซึ่งในกรณีนี้ลักษณะการทำงานเหมือนกับ Windows ที่มีผลผูกพันกับ::จะรับฟังการร้องขอ IPv6 เท่านั้น หากคุณต้องการฟังคำขอ IPv4 ด้วยคุณจะต้องสร้างAF_INETซ็อกเก็ตและฟัง0.0.0.0เช่นกัน โชคดีที่ค่าเริ่มต้นสำหรับbindv6onlyคือ0มีโอกาสน้อยมากที่คุณจะต้องจัดการกับเรื่องนี้ (ยกเว้นถ้าคุณใช้ Debian ซึ่งเป็นค่าเริ่มต้นจริง ๆbindv6only = 1)

ทั้งหมดนี้มีประโยชน์ที่จะรู้ในการตรวจสอบเพื่อดูว่าบริการรองรับ IPv6 หรือไม่และเปิดใช้งาน IPv4 ด้วยหรือไม่ นี่คือเซิร์ฟเวอร์ SSH ของฉัน:

$ netstat -64ln | grep 22
tcp6    0    0 :::22    :::*    LISTEN

อย่างที่คุณเห็น SSH นั้นรับฟังเฉพาะ::พอร์ต 22 อย่างไรก็ตามไม่เพียงแค่ฟังไคลเอนต์ IPv6 เท่านั้น แต่ทำงานได้ดีจากไคลเอนต์ IPv4 เนื่องจากการเข้ากันได้กับ IPv4 เพื่อพิสูจน์สิ่งนี้หากคุณดูที่:

$ cat /proc/sys/net/ipv6/bindv6only 
0

bindv6onlyถูกปิดใช้งาน (ค่าเริ่มต้น) หากถูกตั้งค่าไว้1ฉันจะต้องสนับสนุนให้ SSH ฟัง0.0.0.0เช่นกัน (หรือแทน)

ขออภัยที่ไม่มีข้อมูลในด้าน Mac OS X ฉันเคยใช้มันในอดีต แต่ฉันชอบความสวยงามของ GNOME ดังนั้นฉันจึงไม่ได้ใช้มันในเวลานาน อย่างไรก็ตามฉันคิดว่าพฤติกรรมนี้เหมือนกับ Linux

หวังว่านี่จะช่วยได้


4

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

แก้ไข: อ่าลงไปอีกหน่อยพูดได้ว่า:

สแต็ค IPv6 ทั่วไปบางอย่างไม่สนับสนุนคุณสมบัติที่อยู่ที่แม็พ IPv4 เนื่องจากสแต็ค IPv6 และ IPv4 เป็นการนำไปใช้แยกต่างหาก (Microsoft Windows ก่อน Vista / Longhorn: เช่น XP / 2003) หรือเนื่องจากความกังวลด้านความปลอดภัย (OpenBSD) บนระบบปฏิบัติการเหล่านี้จำเป็นต้องเปิดซ็อกเก็ตแยกต่างหากสำหรับแต่ละโปรโตคอล IP ที่ได้รับการสนับสนุน ในบางระบบ (เช่น Linux, NetBSD, FreeBSD) คุณสมบัตินี้ควบคุมโดยตัวเลือกซ็อกเก็ต IPV6_V6ONLY ตามที่ระบุในRFC 3493

-1

คุณสามารถทำได้ด้วย ID เครือข่าย AAAA: BBBB: CCCC: DDDD :: หรืออะไรก็ตามที่เหมาะกับคุณ สิ่งนั้นจะรับประกันได้ว่าจะมีเพียงอินเตอร์เฟส IPv6 เท่านั้นที่จะมารับ ฉันคิด. ฉันไม่ใช่ IPv6 master

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