red acoplable: el navegador y curl se bloquean al conectarse al servidor en localhost

red acoplable: el navegador y curl se bloquean al conectarse al servidor en localhost

Tengo varias aplicaciones web ejecutándose en la ventana acoplable en un host Ubuntu. Cada aplicación escucha en un puerto diferente. Cuando estoy dentro de cualquier contenedor en la red acoplable, puedo conectarme y recibir datos del servicio; sin embargo, cuando ejecuto una solicitud desde el host, puedo conectarme exitosamente, pero no se reciben datos. ¿Por qué los servicios no devuelven ningún dato cuando me conecto a ellos desde fuera del contenedor?

Docker informa esto en "PUERTOS" cuando ejecuto docker ps:

0.0.0.0:8080->8080/tcp, :::8080->8080/tcp

y netstat informa que el servidor está escuchando en ese puerto:

$ netstat -anp | grep 8080
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      -                                      
tcp6       0      0 :::8080                 :::*                    LISTEN      -

Sin embargo, cuando visito localhost:8080 en mi navegador (probé tanto Firefox como Chrome), el navegador se bloquea, como si estuviera conectado, pero no se envían datos. De manera similar, curl cuelga para siempre:

$ curl -vvv localhost:8080
* Uses proxy env variable no_proxy == 'localhost,127.0.0.1,::1'
*   Trying 127.0.0.1:8080...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.68.0
> Accept: */*
> 
^C

También intenté conectarme con telnet con un resultado similar. Intenté ejecutar un servidor http rápido directamente en el host y funciona bien:

python3 -m http.server 8000
$ curl -vvv localhost:8000
* Uses proxy env variable no_proxy == 'localhost,127.0.0.0/8,::1'
*   Trying 127.0.0.1:8000...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8000 (#0)
> GET / HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Server: SimpleHTTP/0.6 Python/3.8.13
< Date: Fri, 09 Dec 2022 12:36:03 GMT
< Content-type: text/html; charset=utf-8
< Content-Length: 16768
< 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
...

También intenté conectarme a la IP del contenedor acoplable: (172.17.0.3:8080) con los mismos resultados.

Sin embargo, cuando intento ejecutar curl dentro de uno de los contenedores, puedo acceder a los puntos finales http en cualquier contenedor.

Todo esto me lleva a creer que hay un problema con la red acoplable en mi host (¿puente acoplable?).

Estoy usando Docker Compose. Docker Inspect informa lo siguiente (en parte):

"HostConfig": {
            "Binds": [],
...
            "NetworkMode": "docker-compose-example_default",
            "PortBindings": {
                "8080/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "8080"
                    }
                ]
            },
...
"NetworkSettings": {
            "Bridge": "",
            "SandboxID": "1b53a5b6580187b714c6d7d0c9f81a015d585cd0bb0d62da579a4fe7514d47ea",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "8080/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "8080"
                    },
                    {
                        "HostIp": "::",
                        "HostPort": "8080"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/1b53a5b65801",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "docker-compose-example_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "dc0813038a3b",
                        "adminer"
                    ],
                    "NetworkID": "65c6700f5445a6ce0f98a0a4e14e3e10577f40706411f639a4f9da5b1cfdd52e",
                    "EndpointID": "0f42ae8ce893fb4f33168c31df0d5de38d2e8ca67521802ba76589a8a0cb1bea",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }

Resumen: puedo conectarme a estos servicios dentro de los contenedores, pero no puedo conectarme a ellos desde el host, aunque según todos los informes, los servidores están escuchando las conexiones.

¿Qué debo hacer para poder conectarme a los servicios que se ejecutan dentro de la ventana acoplable desde mi host?

Respuesta1

Encontré una solución, pero no una solución. Descubrí que este problema persiste sólo cuando estoy conectado a una VPN. Al parecer, esta es una queja común. Cuando se desconecta, la conectividad funciona como se esperaba.

La solución es apagar la VPN y reiniciar los contenedores acoplables. FWIW, esto no siempre funcionó, especialmente si lo ejecuté con la VPN activada y luego intenté nuevamente después de apagar la VPN. En este caso, descubrí que cambiar el CIDR en la red Docker-Compose me permitió hacer que todo funcionara. Esperemos que esto ayude a cualquiera que experimente el mismo problema.

Aún no se sabe cómo hacer que todo funcione con la VPN activada; hasta ahora, ningún enfoque (incluida la creación de un puente acoplable "lápida") me ha funcionado.

información relacionada