Semantica di :: e 0.0.0.0 nei sistemi operativi dual-stack


10

Nei giorni di solo IPv4, una connessione LISTEN mostrata netstatcome in ascolto 0.0.0.0rispondeva alle connessioni su qualsiasi interfaccia IPv4 nel sistema.

A quanto ho capito, il nuovo linguaggio IPv6 ::ascolta tutte le interfacce IPv6 e IPv4 disponibili . È corretto, per tutti i sistemi operativi (Unix, Windows, Mac)? Esiste un linguaggio da ascoltare solo sulle interfacce IPv6?

Risposte:


17

Sfortunatamente, questo differisce a seconda del sistema operativo in uso.

Su Microsoft Windows, l'associazione di un socket ::si lega solo alle porte IPv6. Così in ascolto su tutti gli indirizzi in IPv4 e IPv6, è necessario legano al 0.0.0.0così come ::. Il seguente estratto proviene da una scatola di Vista:

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

L'esempio che do è la porta 445, utilizzata per il traffico SMB quando NetBIOS non viene utilizzato. Come puoi vedere, è vincolante per entrambi 0.0.0.0e ::per far funzionare rispettivamente i client IPv4 e IPv6.

Su Linux, ::è comprensivo degli indirizzi compatibili con IPv4, come hai indovinato, quindi 0.0.0.0non è necessario eseguire il binding . Ho scritto un semplice programma Python che si lega solo a un AF_INET6socket ::. Anche se non mi sono nemmeno associato a un AF_INETsocket (IPv4), accetta comunque connessioni dai client IPv4. Se, diciamo, si 10.1.1.3connette ad esso, verrà visualizzato come connessione da ::ffff:10.1.1.3.

Solo che diventa peloso. Quanto sopra non si applica su Linux se /proc/sys/net/ipv6/bindv6onlyè impostato su 1, nel qual caso il comportamento è esattamente lo stesso di Windows - il binding a ::ascolterà solo le richieste IPv6. Se vuoi ascoltare anche le richieste IPv4, dovrai creare un AF_INETsocket e anche ascoltare 0.0.0.0. Fortunatamente, il valore predefinito bindv6onlyè 0, quindi c'è una probabilità molto ridotta che tu abbia mai a che fare con questo (tranne se usi Debian, che in realtà è predefinito bindv6only = 1).

Tutto ciò è utile da sapere per verificare se un servizio è abilitato per IPv6 e se è abilitato anche per IPv4. Ecco il mio server SSH:

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

Come puoi vedere, SSH è in ascolto solo sulla ::porta 22. Tuttavia, non sta solo ascoltando i client IPv6, ma funziona bene dai client IPv4, a causa dell'associazione compatibile IPv4. Per dimostrarlo, se guardi questo:

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

bindv6onlyè disabilitato (impostazione predefinita). Se fosse impostato su 1, allora dovrei incoraggiare SSH ad ascoltare 0.0.0.0anche (o invece).

Ci scusiamo per non avere informazioni sul lato Mac OS X delle cose. L'ho usato in passato, ma preferisco l'estetica di GNOME, quindi non lo uso da molto tempo. Tuttavia, immagino che il comportamento sia lo stesso di quello di Linux.

Spero che sia di aiuto.


4

Questo non è possibile, poiché un segmento dello spazio degli indirizzi IPv6 è uguale allo spazio IPv4, quindi anche se in qualche modo si disabilitassero i socket IPv4, si sarebbe comunque in grado di inviare pacchetti IPv4 al socket IPv6. Controlla la sezione di transizione IPv4 nella pagina wikipedia di IPv4 .

Modifica: Ah, un po 'più in basso si dice:

Alcuni stack IPv6 comuni non supportano la funzione dell'indirizzo mappato IPv4, sia perché gli stack IPv6 e IPv4 sono implementazioni separate (Microsoft Windows precedente a Vista / Longhorn: ad esempio XP / 2003), sia a causa di problemi di sicurezza (OpenBSD). Su questi sistemi operativi, è necessario aprire un socket separato per ciascun protocollo IP che deve essere supportato. Su alcuni sistemi (es. Linux, NetBSD, FreeBSD) questa funzione è controllata dall'opzione socket IPV6_V6ONLY come specificato in RFC 3493

-1

Probabilmente potresti farlo con il tuo ID di rete, AAAA: BBBB: CCCC: DDDD :: o qualunque cosa sia per te. Ciò garantirebbe che solo le interfacce IPv6 lo raccogliessero. Credo. Non sono un maestro IPv6.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.