Semántica de :: y 0.0.0.0 en sistemas operativos de doble pila

10

En los días de solo IPv4, una conexión LISTEN que se muestra netstatcomo escuchando 0.0.0.0respondería a las conexiones en cualquier interfaz IPv4 en el sistema.

Según tengo entendido, el nuevo idioma de IPv6 ::escucha en todas las interfaces IPv6 e IPv4 disponibles . ¿Es esto correcto para todos los sistemas operativos (Unix, Windows, Mac)? ¿Hay un idioma para escuchar solo en las interfaces IPv6?

Alex J
fuente

Respuestas:

17

Desafortunadamente, esto difiere según el sistema operativo que esté utilizando.

En Microsoft Windows, la vinculación de un socket ::solo se vincula a los puertos IPv6. Por lo tanto, para escuchar en todas las direcciones tanto en IPv4 como en IPv6, debe vincularse 0.0.0.0también ::. El siguiente extracto es de un cuadro de Vista:

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

El ejemplo que doy es el puerto 445, que se usa para el tráfico SMB cuando no se usa NetBIOS. Como puede ver, es vinculante para ambos 0.0.0.0y ::para que, respectivamente, funcionen los clientes IPv4 e IPv6.

En Linux, ::incluye las direcciones compatibles con IPv4, como has adivinado correctamente, por lo que 0.0.0.0no es necesario vincularlas . Escribí un programa simple de Python que solo se une a un AF_INET6socket ::. Aunque no me uní a un AF_INETsocket (IPv4), todavía acepta conexiones de clientes IPv4. Si, por ejemplo, se 10.1.1.3conecta a él, aparecerá como una conexión desde ::ffff:10.1.1.3.

Excepto que se pone peludo. Lo anterior no se aplica en Linux si /proc/sys/net/ipv6/bindv6onlyestá configurado en 1, en cuyo caso el comportamiento es exactamente el mismo que el de Windows: el enlace ::solo escuchará las solicitudes de IPv6. Si también quiere escuchar las solicitudes de IPv4, deberá crear un AF_INETsocket y escuchar 0.0.0.0también. Afortunadamente, el valor predeterminado para bindv6onlyes 0, por lo que hay muy pocas posibilidades de que tenga que lidiar con esto (excepto si usa Debian, que en realidad es el predeterminado bindv6only = 1).

Todo esto es útil para saber si verifica si un servicio está habilitado para IPv6 y si también está habilitado para IPv4. Aquí está mi servidor SSH:

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

Como puede ver, SSH solo está escuchando en el ::puerto 22. Sin embargo, no solo está escuchando clientes IPv6: funciona bien desde clientes IPv4, debido al enlace compatible con IPv4. Para probar esto, si nos fijamos en esto:

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

bindv6onlyestá deshabilitado (el valor predeterminado). Si eso se configurara como 1, entonces tendría que alentar a SSH a escuchar 0.0.0.0también (o en su lugar).

Disculpas por no tener información sobre el lado de Mac OS X de las cosas. Lo he usado en el pasado, pero prefiero la estética de GNOME, así que no lo he usado en mucho tiempo. Sin embargo, supongo que el comportamiento es el mismo que el de Linux.

Espero que esto ayude.

Jeremy Visser
fuente
4

Esto no es posible, ya que un segmento del espacio de direcciones IPv6 es el mismo que el espacio IPv4, por lo que incluso si de alguna manera pudiera deshabilitar los sockets IPv4, aún podría enviar paquetes IPv4 al zócalo IPv6. Consulte la sección de transición de IPv4 en la página de Wikipedia de IPv4 .

Editar: Ah, un poco más abajo dice:

Algunas pilas comunes de IPv6 no son compatibles con la función de dirección asignada de IPv4, ya sea porque las pilas de IPv6 e IPv4 son implementaciones separadas (Microsoft Windows anterior a Vista / Longhorn: por ejemplo, XP / 2003), o por problemas de seguridad (OpenBSD). En estos sistemas operativos, es necesario abrir un socket separado para cada protocolo IP que se admitirá. En algunos sistemas (por ejemplo, Linux, NetBSD, FreeBSD), esta característica se controla mediante la opción de socket IPV6_V6ONLY como se especifica en RFC 3493
David Pashley
fuente
-1

Probablemente podría hacerlo con su ID de red, AAAA: BBBB: CCCC: DDDD :: o lo que sea para usted. Eso garantizaría que solo las interfaces IPv6 lo recogerían. Yo creo que. No soy un maestro de IPv6.

Matt Simmons
fuente