Semantik von :: und 0.0.0.0 in Dual-Stack-Betriebssystemen

10

In den Tagen nur für IPv4 reagierte eine LISTEN-Verbindung, die netstatals Abhören 0.0.0.0angezeigt wurde, auf Verbindungen auf einer beliebigen IPv4-Schnittstelle im System.

Soweit ich weiß, überwacht die neue IPv6-Sprache ::alle verfügbaren IPv6- und IPv4-Schnittstellen. Ist das für alle Betriebssysteme (Unix, Windows, Mac) richtig? Gibt es eine Redewendung, um nur die IPv6-Schnittstellen abzuhören?

Alex J.
quelle

Antworten:

17

Dies hängt leider davon ab, welches Betriebssystem Sie verwenden.

Unter Microsoft Windows wird das Binden eines Sockets ::nur an die IPv6-Ports gebunden . Um also alle Adressen auf IPv4 und IPv6 abzuhören, müssen Sie sich sowohl an 0.0.0.0als auch an binden ::. Der folgende Auszug stammt aus einer Vista-Box:

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

Das Beispiel, das ich gebe, ist Port 445, der für SMB-Verkehr verwendet wird, wenn NetBIOS nicht verwendet wird. Wie Sie sehen, ist es für beide verbindlich 0.0.0.0und ::bewirkt, dass sowohl IPv4- als auch IPv6-Clients funktionieren.

Unter Linux sind ::die IPv4-kompatiblen Adressen enthalten, wie Sie richtig erraten haben, sodass eine Bindung 0.0.0.0auch nicht erforderlich ist. Ich habe ein einfaches Python-Programm geschrieben, das nur an einen AF_INET6Socket gebunden ist ::. Obwohl ich nicht auch an einen AF_INET(IPv4) -Socket gebunden habe, werden weiterhin Verbindungen von IPv4-Clients akzeptiert. Wenn 10.1.1.3beispielsweise eine Verbindung hergestellt wird, wird diese als Verbindung von angezeigt ::ffff:10.1.1.3.

Nur dass es haarig wird. Das oben Gesagte gilt nicht für Linux, wenn /proc/sys/net/ipv6/bindv6onlyeingestellt 1ist. In diesem Fall ist das Verhalten genau das gleiche wie bei Windows. Bei der Bindung an ::werden nur IPv6-Anforderungen abgehört. Wenn Sie auch auf IPv4-Anforderungen warten möchten, müssen Sie einen AF_INETSocket erstellen und ebenfalls abhören 0.0.0.0. Zum Glück für den Standard bindv6onlyist 0, so ist es eine sehr geringe Chance , Sie überhaupt damit umgehen werden (außer wenn Sie verwenden Debian, die eigentlich standardmäßig bindv6only = 1).

All dies ist hilfreich, um zu überprüfen, ob ein Dienst IPv6-fähig ist und ob er auch IPv4-fähig ist. Hier ist mein SSH-Server:

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

Wie Sie sehen, überwacht SSH nur ::Port 22. Es überwacht jedoch nicht nur IPv6-Clients, sondern funktioniert aufgrund der IPv4-kompatiblen Bindung auch problemlos von IPv4-Clients. Um dies zu beweisen, wenn Sie sich das ansehen:

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

bindv6onlyist deaktiviert (Standardeinstellung). Wenn das so eingestellt 1wäre, müsste ich SSH ermutigen, auch zuzuhören 0.0.0.0(oder stattdessen).

Entschuldigung, dass Sie keine Informationen auf der Mac OS X-Seite haben. Ich habe es in der Vergangenheit benutzt, aber ich bevorzuge die Ästhetik von GNOME, deshalb habe ich es lange nicht mehr benutzt. Ich würde jedoch vermuten, dass das Verhalten das gleiche ist wie das von Linux.

Hoffe das hilft.

Jeremy Visser
quelle
4

Dies ist nicht möglich, da ein Segment des IPv6-Adressraums mit dem IPv4-Bereich identisch ist. Selbst wenn Sie IPv4-Sockets deaktivieren könnten, können Sie dennoch IPv4-Pakete an den IPv6-Socket senden. Überprüfen Sie den Abschnitt zum IPv4-Übergang auf der IPv4-Wikipedia-Seite .

Edit: Ah, etwas weiter unten steht:

Einige gängige IPv6-Stapel unterstützen die Funktion für IPv4-zugeordnete Adressen nicht, da es sich bei den IPv6- und IPv4-Stapeln um separate Implementierungen handelt (Microsoft Windows vor Vista / Longhorn: z. B. XP / 2003) oder aus Sicherheitsgründen (OpenBSD). Unter diesen Betriebssystemen muss für jedes zu unterstützende IP-Protokoll ein separater Socket geöffnet werden. Auf einigen Systemen (z. B. Linux, NetBSD, FreeBSD) wird diese Funktion durch die Socket-Option IPV6_V6ONLY gesteuert, wie in RFC 3493 angegeben
David Pashley
quelle
-1

Sie könnten es wahrscheinlich mit Ihrer Netzwerk-ID AAAA: BBBB: CCCC: DDDD :: oder was auch immer es für Sie ist tun. Das würde garantieren, dass nur IPv6-Schnittstellen es aufnehmen würden. Meiner Ansicht nach. Ich bin kein IPv6-Master.

Matt Simmons
quelle