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.localhost
und 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.localhost
gibt den 403 Forbidden
Fehler 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 mongo
Dienst funktioniert. Ich habe es mit dem Robo 3T- Programm getestet . Nach Auswahl der SSL- example.localhost
Verbindung 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
- Installieren Sie mkcert (auch
mkcert -install
für CA ausführen ) - Klone meinen Code
- Im
certs
Ordner ausführenmkcert example.localhost
- Container starten mit
docker-compose up -d
- Öffnen Sie die Seite https: //example.localhost/ und prüfen Sie, ob es sich um eine sichere Verbindung handelt
- Wenn die Adresse http: //example.localhost/ nicht erreichbar ist, fügen Sie
127.0.0.1 example.localhost
zu/etc/hosts
Zertifikate:
- Öffentlichkeit:
./certs/example.localhost.pem
- Privat:
./certs/example.localhost-key.pem
- CA:
~/.local/share/mkcert/rootCA.pem
Testen Sie MongoDB
- Installieren Sie Robo 3T
- Neue Verbindung erstellen:
- Adresse:
example.localhost
- Verwenden Sie das SSL-Protokoll
- CA-Zertifikat:
rootCA.pem
(oder selbstsigniertes Zertifikat)
- Adresse:
- Testwerkzeug:
Testen Sie Redis
- Installieren Sie RedisDesktopManager
- Neue Verbindung erstellen:
- Adresse:
example.localhost
- SSL
- Öffentlicher Schlüssel:
example.localhost.pem
- Privat Schlüssel:
example.localhost-key.pem
- Behörde:
rootCA.pem
- Adresse:
- Testwerkzeug:
Bisher:
- Kann über IP eine Verbindung zu Postgres herstellen (Informationen von Traefik)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable
jdbc:postgresql://172.21.0.4:5432/postgres?sslfactory=org.postgresql.ssl.NonValidatingFactory
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.
I can't connect to them
-> wie hast du es getestet und was war der Fehler?Connections to redis (Redis Desktop Manager) ... do not work
, aber Screenshot zeigtSuccessful connection
-? Warum testen Sie nicht auf niedrigem Niveau mitcurl, openssl, telnet, ...
? Warum testen Sie nicht,netstat
ob diese App-Ports wirklich für Traefik auf der127.0.0.1
Benutzeroberfläche gebunden sind ?Antworten:
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.
quelle