Curl tiene una resolución DNS incorrecta en un contexto ruidoso

Curl tiene una resolución DNS incorrecta en un contexto ruidoso

Estoy ejecutando un docker:20.10.7-dindcontenedor.

En este estoy ejecutando una aplicación de contenedores múltiples.

Un contenedor es un backcontenedor. Otro es un keycloakcontenedor.

Me conecto en el backcontenedor y tengo:

back$ cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0
back$ cat /etc/nsswitch.conf
hosts: files dns
back$ nslookup keycloak.localhost
Server:     127.0.0.11
Address:    127.0.0.11#53

Non-authoritative answer:
Name:   keycloak.localhost
Address: 172.20.0.10

back$ host keycloak.localhost
keycloak.localhost has address 172.20.0.10
back$ nc keycloak.localhost 443 -vvv
keycloak.localhost (172.20.0.10:443) open

Sin embargo, cuando se trata de rizos:

back$ curl https://keycloak.localhost -v
*   Trying 127.0.0.1:443...
* connect to 127.0.0.1 port 443 failed: Connection refused
*   Trying [::1]:443...
* Immediate connect fail for ::1: Address not available
* Failed to connect to keycloak.localhost port 443 after 0 ms: Couldn't connect to server
* Closing connection 0
curl: (7) Failed to connect to keycloak.localhost port 443 after 0 ms: Couldn't connect to server

Noto que curl resuelve mal keycloak.localhostpero no puedo entender por qué.

Tenga en cuenta que si ayudo a curl a resolver, funciona de maravilla:

back$ curl https://keycloak.localhost -v --resolve keycloak.localhost:443:172.20.0.10
* Added keycloak.localhost:443:172.20.0.10 to DNS cache
* Hostname keycloak.localhost was found in DNS cache
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 172.20.0.10:443...
* Connected to keycloak.localhost (172.20.0.10) port 443 (#0)
> GET / HTTP/2
> Host: keycloak.localhost
> user-agent: curl/8.0.1
> accept: */*
> 
< HTTP/2 200 
...

Agradecería cualquier pista que me ayude a entender esto.

Salud

Respuesta1

Ok, finalmente lo descubrí.

Se debe a la versión curl/libcurl.

Desde v7.85, curl essiempreresolviendo localhost a 127.0.0.1.

Ver :

https://curl.se/changes.html#7_85_0

https://github.com/curl/curl/issues/9192

Bajé la versión de curl y mis cosas funcionan bien ahora.

Respuesta2

Otra forma de hacer que esto funcione es agregar el nombre de la red docker-compose como último TLD encima del nombre de la red configurada, por ejemplo, keycloak.localhostfalla pero keycloak.localhost.myfolder_defaultse resuelve.

Elaborar:

Con esta estructura de carpetas:

myfolder
└── docker-compose.yml

Y esta ventana acoplable compone:

services:
  backend:
    image: backend:latest
    container_name: backend.localhost

  keycloak:
    image: keycloak:latest
    container_name: keycloak.localhost

El contenedor backend podrá resolver keycloak.localhost utilizando cualquier herramienta que lea /etc/resolv.conf correctamente (puede comprobar si la herramienta abre el archivo /etc/resolv.conf ejecutándolo con strace). Cualquiera de estas herramientas funcionará:

  • wget http://keycloak.localhost:8443
  • getent hosts keycloak.localhost
  • nslookup keycloak.localhost
  • nc keycloak.localhost 8443 -v

Pero en mi caso netcatmostró el problema:

# nc keycloak.localhost 8443 -v
DNS fwd/rev mismatch: keycloak.localhost != keycloak.localhost.myfolder_default
keycloak.localhost [10.201.1.4] 8443 (?) open

El uso de FQND finalmente funcionó correctamente con libcurl:

curl http://keycloak.localhost.myfolder_default:8443

Pude dejar los nombres de mis contenedores como están porque se resuelven bien para el 90% de los programas que respetan /etc/resolv.conf y usan libc resolutor. Para los programas que usan libcurl comencé a agregar el .myfolder_defaultTLD a todas las URL.

Para que conste, estaba usando Debian, curl versión 7.88.1 con las siguientes configuraciones de nsswitch:

# /etc/nsswitch.conf
hosts:          files dns
networks:       files

información relacionada