Çift yığınlı işletim sistemlerinde :: ve 0.0.0.0'ın semantiği


10

Yalnızca IPv4 günlerinde, netstatdinleme halinde olduğunu gösteren bir LISTEN bağlantısı 0.0.0.0, sistemdeki herhangi bir IPv4 arabirimindeki bağlantılara yanıt verir.

Anladığım kadarıyla, yeni IPv6 deyimi ::mevcut tüm IPv6 ve IPv4 arayüzlerini dinliyor . Bu, tüm işletim sistemleri (Unix, Windows, Mac) için doğru mu? Sadece IPv6 arayüzlerini dinlemek için bir deyim var mı?

Yanıtlar:


17

Ne yazık ki, bu, kullandığınız işletim sistemine bağlı olarak değişir.

Microsoft Windows'ta, bir soketi ::yalnızca IPv6 bağlantı noktalarına bağlamak için bağlama . Böylece IPv4 ve IPv6 hem de tüm adresleri dinlemeyle yapmanız bağlama gereken 0.0.0.0sıra sıra ::. Aşağıdaki alıntı Vista kutusundan alınmıştır:

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

Verdiğim örnek NetBIOS kullanılmadığında SMB trafiği için kullanılan 445 numaralı bağlantı noktasıdır. Gördüğünüz gibi, her iki bağlanma edilir 0.0.0.0ve ::marka sırasıyla hem IPv4 ve IPv6 istemcilerinin işe.

Linux'ta, ::doğru şekilde tahmin ettiğiniz gibi IPv4 uyumlu adresleri içerir, bu nedenle de bağlanmak 0.0.0.0gereksizdir. Sadece bir AF_INET6sokete bağlanan basit bir Python programı yazdım ::. Bir AF_INET(IPv4) soketine de bağlanmamış olmama rağmen , yine de IPv4 istemcilerinden gelen bağlantıları kabul ediyor. Diyelim ki, 10.1.1.3ona bağlanırsa , bağlandığı gibi görünecektir ::ffff:10.1.1.3.

Bunun dışında kıllı olur. Yukarıda /proc/sys/net/ipv6/bindv6onlyayarlanmışsa yukarıdakiler Linux'ta geçerli değildir 1, bu durumda davranış Windows ile tam olarak aynıdır - ::yalnızca IPv6 isteklerini dinleyecektir. IPv4 isteklerini de dinlemek istiyorsanız, bir AF_INETsoket oluşturmanız ve dinlemeniz gerekir 0.0.0.0. Neyse ki, varsayılan için bindv6onlyise 0, bu yüzden şimdiye kadar bu uğraşmak gerekecek çok ince bir şans var (hariç Eğer Debian, aslında varsayılan için kullandıkları takdirde bindv6only = 1).

Tüm bunlar, bir hizmetin IPv6 etkin olup olmadığını ve IPv4 etkin olup olmadığını kontrol etmek için kullanışlıdır. İşte SSH sunucum:

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

Gördüğünüz gibi, SSH yalnızca ::22 numaralı bağlantı noktasını dinliyor . Ancak, sadece IPv6 istemcilerini dinlemekle kalmıyor, IPv4 uyumlu bağlama nedeniyle IPv4 istemcilerinden de iyi çalışıyor. Bunu kanıtlamak için, şuna bakarsanız:

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

bindv6onlydevre dışı (varsayılan). Eğer bu şekilde ayarlanmış 1olsaydı, SSH'yi de dinlemeye teşvik etmeliydim 0.0.0.0(ya da onun yerine).

Şeylerin Mac OS X tarafı hakkında bilgi sahibi olmadığın için özür dileriz. Geçmişte kullandım, ama GNOME'un estetiğini tercih ediyorum, bu yüzden çok uzun zamandır kullanmadım. Ancak, davranışın Linux'la aynı olduğunu tahmin ediyorum.

Bu yardımcı olur umarım.


4

Bu mümkün değildir, çünkü IPv6 adres alanının bir bölümü IPv4 alanı ile aynıdır, bu nedenle IPv4 yuvalarını bir şekilde devre dışı bıraksanız bile IPv4 paketlerini IPv6 soketine gönderebilirsiniz. IPv4 wikipedia sayfasındaki IPv4 geçiş bölümüne bakın .

Düzenleme: Ah, biraz daha aşağı diyor:

Bazı yaygın IPv6 yığınları, IPv6 ve IPv4 yığınları ayrı uygulamalar (Vista / Longhorn'dan önce Microsoft Windows: örn. XP / 2003) veya güvenlik kaygıları (OpenBSD) nedeniyle IPv4 eşlenmiş adres özelliğini desteklemez. Bu işletim sistemlerinde, desteklenecek her IP protokolü için ayrı bir soket açmak gerekir. Bazı sistemlerde (örn. Linux, NetBSD, FreeBSD) bu özellik RFC 3493'te belirtildiği gibi IPV6_V6ONLY soket seçeneği tarafından kontrol edilir

-1

Muhtemelen ağ kimliğiniz, AAAA: BBBB: CCCC: DDDD :: veya sizin için ne olursa olsun yapabilirsiniz. Bu, yalnızca IPv6 arabirimlerinin onu alacağını garanti eder. Bence. Ben IPv6 ustası değilim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.