¿Por qué Google Computer Engine vincula mi programa a puertos IPv6?

¿Por qué Google Computer Engine vincula mi programa a puertos IPv6?

Estoy escribiendo un servidor que se vincula a varios puertos locales (incluidos 80y 443). Cada vez que lo ejecuto en Google Computer Engine (GCE), usando su sistema operativo optimizado para contenedores (COS) y un contenedor Docker, los puertos se vinculan a IPv6 y no a IPv4.

$ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:36265         0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN
tcp6       0      0 :::443                  :::*                    LISTEN
udp        0      0 10.128.0.33:68          0.0.0.0:*

Esta es una distinción importante, porque hay una lógica en mi programa que intenta conectarse directamente a la interfaz local usando la dirección IPv4 de 127.0.0.1.

¿Cómo puedo especificar que mi instancia de GCE utilice un puerto IPv4?

Respuesta1

Editar

Una cosa importante a tener en cuenta (como se señala en los comentarios)- Si bien puede estar vinculado a una interfaz que utilice IPv4 e IPv6, el enrutamiento IPv6 no funcionará en Google Cloud (aún no es compatible internamente).


Entonces, resulta que esta es una "característica" confusa con respecto a la forma en que Docker realiza redes, y aún así debería permitir conexiones IPv4 así como IPv6.

Veresta respuesta de StackOverflowpara más detalles. He citado la respuesta a continuación por el bien de la posteridad:

...github.com/docker/docker/issues/2174se trata de mostrar el enlace solo a IPv6 en netstat, pero eso no es un problema. Como dice ese problema de github:

Al configurar el proxy, Docker solicita la dirección de bucle invertido '127.0.0.1', Linux se da cuenta de que esta es una dirección que existe en IPv6 (como ::0) y se abre en ambos (pero formalmente es un socket IPv6). Cuando ejecuta netstat, ve esto y le dice que es IPv6, pero todavía está escuchando en IPv4. Si ha jugado un poco con su configuración, es posible que haya desactivado este truco que hace Linux: configurando net.ipv6.bindv6only = 1.

En otras palabras, solo porque lo ve solo como IPv6, aún puede comunicarse en IPv4 a menos que tenga IPv6 configurado para vincularse solo en IPv6 con la configuración net.ipv6.bindv6only. Para ser claros, net.ipv6.bindv6only debe ser 0; puede ejecutarlo sysctl net.ipv6.bindv6onlypara verificar.

información relacionada