Um contêiner de docker meu expõe uma interface HTTP na porta 8500, que é mapeada para a porta 8500 do host. Ele não está ativado para IPv6. Isso ainda significa que eu devo acessá-lo no localhost: 8500. O IPv6 é preferido, então eu termino com uma solicitação para [:: 1]: 8500. Este fica preso, nunca retorna.
Reproduzindo isso com curl, este comando fica preso:
curl -g -6 "http://[::1]:8500"
A opção --verbose de curl não revela nada, nem --ascii-trace. Ao mesmo tempo, uma solicitação para o host local do IPv4 é bem-sucedida:
curl http://127.0.0.1:8500
dando-me o HTML esperado. Se eu executar um servidor HTTP IPv4 no loopback, usando
python -m SimpleHTTPServer 4001
então recebo muito HTML para o host local do IPv4
curl http://127.1:4001
e uma falha de conexão adequada para IPv6:
curl -g -6 "http://[::1]:4001"
curl: (7) Failed to connect to ::1 port 4001: Connection refused
Pontos a serem observados: Docker 1.7.1. O IPv6 não está ativado para o contêiner, portanto, não há regras de tabela de IPv6. (ip6tables -v -L não dá nada)
Minha pergunta é: Por que a solicitação fica bloqueada e está fazendo o quê?
tcp6 0 0 :::8500 :::* LISTEN 1648/docker
fascinante. Por quê? E por que está bloqueando?
/proc/sys/net/ipv6/conf/all/disable_ipv6
gera 0, portanto, o IPv6 deve estar ativado.