Curl hat eine falsche DNS-Auflösung in einem Dind-Kontext

Curl hat eine falsche DNS-Auflösung in einem Dind-Kontext

Ich betreibe einen docker:20.10.7-dindContainer.

Darin führe ich eine App mit mehreren Containern aus.

Ein Container ist ein backContainer. Ein anderer ist ein keycloakContainer.

Ich verbinde mich mit dem backContainer und habe:

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

Wenn es jedoch um Locken geht:

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

Mir ist aufgefallen, dass sich die Locken nicht gut auflösen, keycloak.localhostaber ich kann nicht herausfinden, warum?

Beachten Sie, dass es wie am Schnürchen klappt, wenn ich curl bei der Lösung helfe:

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 
...

Ich wäre für jeden Hinweis dankbar, der mir beim Verständnis hilft.

Prost

Antwort1

OK, ich habe es endlich herausgefunden.

Es liegt an der curl/libcurl-Version.

Seit v7.85 ist curlstetsAuflösung von localhost in 127.0.0.1.

Sehen :

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

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

Ich habe Curl heruntergestuft und mein Zeug funktioniert jetzt einwandfrei.

Antwort2

Eine andere Möglichkeit, dies zum Laufen zu bringen, besteht darin, den Docker-Compose-Netzwerknamen als letztes TLD an den konfigurierten Netzwerknamen anzuhängen. Dies schlägt beispielsweise keycloak.localhostfehl, wird aber keycloak.localhost.myfolder_defaultaufgelöst.

Um es genauer zu erläutern:

Mit dieser Ordnerstruktur:

myfolder
└── docker-compose.yml

Und dieses Docker-Composer:

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

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

Der Backend-Container kann keycloak.localhost mit allen Tools auflösen, die /etc/resolv.conf richtig lesen (Sie können überprüfen, ob das Tool die Datei /etc/resolv.conf öffnet, indem Sie es mit ausführen strace). Jedes dieser Tools funktioniert:

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

Aber in meinem Fall netcatzeigte sich das Problem:

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

Die Verwendung des FQND funktionierte mit libcurl endlich korrekt:

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

Ich konnte die Namen meiner Container so lassen, wie sie sind, da sie für 90 % der Programme, die /etc/resolv.conf respektieren und den libc-Resolver verwenden, problemlos aufgelöst werden. Für Programme, die libcurl verwenden, habe ich begonnen, die .myfolder_defaultTLD an alle URLs anzuhängen.

Fürs Protokoll: Ich habe Debian, Curl Version 7.88.1 mit folgenden NSswitch-Konfigurationen verwendet:

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

verwandte Informationen