Wie kann ich bei aktivierter TLS-Konfiguration eine Verbindung zu Traefik TCP Services herstellen?

13

Ich versuche, Traefik so zu konfigurieren , dass ich über Domänennamen auf Dienste zugreifen kann und keine anderen Ports festlegen muss. Zum Beispiel zwei MongoDB-Dienste, beide am Standardport, aber in verschiedenen Domänen, example.localhostund example2.localhost. Nur dieses Beispiel funktioniert. Ich meine, andere Fälle funktionieren wahrscheinlich, aber ich kann keine Verbindung zu ihnen herstellen, und ich verstehe nicht, wo das Problem liegt. Dies ist wahrscheinlich nicht einmal ein Problem mit Traefik.

Ich habe ein Repository mit einem Beispiel vorbereitet , das funktioniert. Sie müssen nur Ihr eigenes Zertifikat mit mkcert erstellen . Die Seite unter example.localhostgibt den 403 ForbiddenFehler zurück, aber Sie sollten sich darüber keine Sorgen machen, da der Zweck dieser Konfiguration darin besteht, anzuzeigen, dass SSL funktioniert (Vorhängeschloss, grüner Status). Konzentrieren Sie sich also nicht auf 403.

Nur die SSL-Verbindung zum mongoDienst funktioniert. Ich habe es mit dem Robo 3T- Programm getestet . Nach Auswahl der SSL- example.localhostVerbindung funktioniert die Bereitstellung des Hosts und die Auswahl des Zertifikats für eine selbstsignierte (oder eigene) Verbindung. Und das ist das einzige, was so funktioniert. Verbindungen zu redis( Redis Desktop Manager ) und zu pgsql( PhpStorm , DBeaver , DbVisualizer ) funktionieren nicht, unabhängig davon, ob ich Zertifikate bereitstelle oder nicht. Ich leite SSL nicht an Dienste weiter, sondern verbinde mich nur mit Traefik. Ich habe lange Stunden damit verbracht. Ich habe im Internet gesucht. Ich habe die Antwort noch nicht gefunden. Hat jemand das gelöst?

PS. Ich arbeite unter Linux Mint, daher sollte meine Konfiguration in dieser Umgebung problemlos funktionieren. Ich würde nach Lösungen für Linux fragen.


Wenn Sie das Repository nicht durchsuchen möchten, hänge ich die wichtigsten Dateien an:

docker-compose.yml

version: "3.7"

services:
    traefik:
        image: traefik:v2.0
        ports:
            - 80:80
            - 443:443
            - 8080:8080
            - 6379:6379
            - 5432:5432
            - 27017:27017
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock:ro
            - ./config.toml:/etc/traefik/traefik.config.toml:ro
            - ./certs:/etc/certs:ro
        command:
            - --api.insecure
            - --accesslog
            - --log.level=INFO
            - --entrypoints.http.address=:80
            - --entrypoints.https.address=:443
            - --entrypoints.traefik.address=:8080
            - --entrypoints.mongo.address=:27017
            - --entrypoints.postgres.address=:5432
            - --entrypoints.redis.address=:6379
            - --providers.file.filename=/etc/traefik/traefik.config.toml
            - --providers.docker
            - --providers.docker.exposedByDefault=false
            - --providers.docker.useBindPortIP=false

    apache:
        image: php:7.2-apache
        labels:
            - traefik.enable=true
            - traefik.http.routers.http-dev.entrypoints=http
            - traefik.http.routers.http-dev.rule=Host(`example.localhost`)
            - traefik.http.routers.https-dev.entrypoints=https
            - traefik.http.routers.https-dev.rule=Host(`example.localhost`)
            - traefik.http.routers.https-dev.tls=true
            - traefik.http.services.dev.loadbalancer.server.port=80
    pgsql:
        image: postgres:10
        environment:
            POSTGRES_DB: postgres
            POSTGRES_USER: postgres
            POSTGRES_PASSWORD: password
        labels:
            - traefik.enable=true
            - traefik.tcp.routers.pgsql.rule=HostSNI(`example.localhost`)
            - traefik.tcp.routers.pgsql.tls=true
            - traefik.tcp.routers.pgsql.service=pgsql
            - traefik.tcp.routers.pgsql.entrypoints=postgres
            - traefik.tcp.services.pgsql.loadbalancer.server.port=5432
    mongo:
        image: mongo:3
        labels:
            - traefik.enable=true
            - traefik.tcp.routers.mongo.rule=HostSNI(`example.localhost`)
            - traefik.tcp.routers.mongo.tls=true
            - traefik.tcp.routers.mongo.service=mongo
            - traefik.tcp.routers.mongo.entrypoints=mongo
            - traefik.tcp.services.mongo.loadbalancer.server.port=27017
    redis:
        image: redis:3
        labels:
            - traefik.enable=true
            - traefik.tcp.routers.redis.rule=HostSNI(`example.localhost`)
            - traefik.tcp.routers.redis.tls=true
            - traefik.tcp.routers.redis.service=redis
            - traefik.tcp.routers.redis.entrypoints=redis
            - traefik.tcp.services.redis.loadbalancer.server.port=6379

config.toml

[tls]
[[tls.certificates]]
certFile = "/etc/certs/example.localhost.pem"
keyFile = "/etc/certs/example.localhost-key.pem"

Build & Run

mkcert example.localhost # in ./certs/
docker-compose up -d

Schritt für Schritt vorbereiten

  1. Installieren Sie mkcert (auch mkcert -installfür CA ausführen )
  2. Klone meinen Code
  3. Im certsOrdner ausführenmkcert example.localhost
  4. Container starten mit docker-compose up -d
  5. Öffnen Sie die Seite https: //example.localhost/ und prüfen Sie, ob es sich um eine sichere Verbindung handelt
  6. Wenn die Adresse http: //example.localhost/ nicht erreichbar ist, fügen Sie 127.0.0.1 example.localhostzu/etc/hosts

Zertifikate:

  • Öffentlichkeit: ./certs/example.localhost.pem
  • Privat: ./certs/example.localhost-key.pem
  • CA: ~/.local/share/mkcert/rootCA.pem

Testen Sie MongoDB

  1. Installieren Sie Robo 3T
  2. Neue Verbindung erstellen:
    • Adresse: example.localhost
    • Verwenden Sie das SSL-Protokoll
    • CA-Zertifikat: rootCA.pem(oder selbstsigniertes Zertifikat)
  3. Testwerkzeug:

Prüfung

Testen Sie Redis

  1. Installieren Sie RedisDesktopManager
  2. Neue Verbindung erstellen:
    • Adresse: example.localhost
    • SSL
    • Öffentlicher Schlüssel: example.localhost.pem
    • Privat Schlüssel: example.localhost-key.pem
    • Behörde: rootCA.pem
  3. Testwerkzeug:

Prüfung


Bisher:

  1. Kann über IP eine Verbindung zu Postgres herstellen (Informationen von Traefik)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable

Geben Sie hier die Bildbeschreibung ein

jdbc:postgresql://172.21.0.4:5432/postgres?sslfactory=org.postgresql.ssl.NonValidatingFactory

Geben Sie hier die Bildbeschreibung ein


Versuchen Sie es mit Telet (IP ändert sich bei jedem Neustart des Dockers):

> telnet 172.27.0.5 5432
Trying 172.27.0.5...
Connected to 172.27.0.5.
Escape character is '^]'.
^]
Connection closed by foreign host.
> telnet example.localhost 5432
Trying ::1...
Connected to example.localhost.
Escape character is '^]'.
^]
HTTP/1.1 400 Bad Request
Content-Type: text/plain; charset=utf-8
Connection: close

400 Bad RequestConnection closed by foreign host.

Wenn ich mich direkt mit postgres verbinde, sind die Daten nett. Wenn ich über Traefik eine Verbindung herstelle, habe ich beim Schließen der Verbindung eine schlechte Anfrage. Ich habe keine Ahnung, was das bedeutet und ob es etwas bedeuten muss.

Gänserich
quelle
I can't connect to them-> wie hast du es getestet und was war der Fehler?
Jan Garaj
@ JanGaraj Ich habe eine Schritt-für-Schritt-Anleitung hinzugefügt
Gander
Connections to redis (Redis Desktop Manager) ... do not work, aber Screenshot zeigt Successful connection-? Warum testen Sie nicht auf niedrigem Niveau mit curl, openssl, telnet, ...? Warum testen Sie nicht, netstatob diese App-Ports wirklich für Traefik auf der 127.0.0.1Benutzeroberfläche gebunden sind ?
Jan Garaj
Läuft ein Container mit Traefik und Datenbanken auf demselben Host?
Ryabchenko Alexander
@ RyabchenkoAlexander ja, in Docker-Containern
Gander

Antworten:

2

Zumindest für das PostgreSQL-Problem scheint die Verbindung im Klartext gestartet und dann auf TLS aktualisiert zu werden:

Daher ist es grundsätzlich unmöglich, die TLS-Terminierung mit einem Proxy zu verwenden, wenn dieser Proxy diesen Klartext-Handshake + Upgrade auf die TLS-Funktion des Protokolls nicht unterstützt.

Jose Liber
quelle