
Estoy escribiendo un servidor que se vincula a varios puertos locales (incluidos 80
y 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.bindv6only
para verificar.