J'essaie de configurer Traefik pour avoir accès aux services via des noms de domaine et pour ne pas avoir à définir de ports différents. Par exemple, deux services MongoDB, tous deux sur le port par défaut, mais dans des domaines différents, example.localhost
et example2.localhost
. Seul cet exemple fonctionne. Je veux dire, d'autres cas fonctionnent probablement, mais je ne peux pas me connecter à eux et je ne comprends pas quel est le problème. Ce n'est probablement même pas un problème avec Traefik.
J'ai préparé un référentiel avec un exemple qui fonctionne. Il vous suffit de générer votre propre certificat avec mkcert . La page sur example.localhost
renvoie l' 403 Forbidden
erreur mais vous ne devez pas vous en soucier, car le but de cette configuration est de montrer que SSL fonctionne (cadenas, état vert). Alors ne vous concentrez pas sur 403
.
Seule la connexion SSL au mongo
service fonctionne. Je l'ai testé avec le programme Robo 3T . Après avoir sélectionné la connexion SSL, activer l'hôte example.localhost
et sélectionner le certificat pour une connexion auto-signée (ou propre) fonctionne. Et c'est la seule chose qui fonctionne de cette façon. Les connexions à redis
( Redis Desktop Manager ) et à pgsql
( PhpStorm , DBeaver , DbVisualizer ) ne fonctionnent pas, que je fournisse des certificats ou non. Je ne transfère pas SSL aux services, je me connecte uniquement à Traefik. J'y ai passé de longues heures. J'ai cherché sur internet. Je n'ai pas encore trouvé la réponse. Quelqu'un a-t-il résolu cela?
PS. Je travaille sur Linux Mint, donc ma configuration devrait fonctionner dans cet environnement sans aucun problème. Je demanderais des solutions pour Linux.
Si vous ne souhaitez pas parcourir le référentiel , je joins les fichiers les plus importants:
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
Préparez étape par étape
- Installer mkcert (exécuté également
mkcert -install
pour CA) - Cloner mon code
- Dans le
certs
dossier exécutémkcert example.localhost
- Démarrer le conteneur par
docker-compose up -d
- Ouvrez la page https: //example.localhost/ et vérifiez s'il s'agit d'une connexion sécurisée
- Si l'adresse http: //example.localhost/ n'est pas accessible, ajoutez
127.0.0.1 example.localhost
à/etc/hosts
Certs:
- Publique:
./certs/example.localhost.pem
- Privé:
./certs/example.localhost-key.pem
- CALIFORNIE:
~/.local/share/mkcert/rootCA.pem
Testez MongoDB
- Installer Robo 3T
- Créez une nouvelle connexion:
- Adresse:
example.localhost
- Utiliser le protocole SSL
- Certificat CA:
rootCA.pem
(ou certificat auto-signé)
- Adresse:
- Outil de test:
Test Redis
- Installer RedisDesktopManager
- Créez une nouvelle connexion:
- Adresse:
example.localhost
- SSL
- Clé publique:
example.localhost.pem
- Clé privée:
example.localhost-key.pem
- Autorité:
rootCA.pem
- Adresse:
- Outil de test:
Jusque là:
- Peut se connecter à Postgres via IP (informations de Traefik)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable
jdbc:postgresql://172.21.0.4:5432/postgres?sslfactory=org.postgresql.ssl.NonValidatingFactory
Essayez telet (l'IP change à chaque redémarrage du docker):
> 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.
Si je me connecte directement à postgres, les données sont belles. Si je me connecte via Traefik, j'ai une mauvaise demande lors de la fermeture de la connexion. Je n'ai aucune idée de ce que cela signifie et si cela doit signifier quelque chose.
I can't connect to them
-> comment l'avez-vous testé et quelle a été l'erreur?Connections to redis (Redis Desktop Manager) ... do not work
, mais la capture d'écran montreSuccessful connection
-? Pourquoi vous ne testez pas à bas niveau aveccurl, openssl, telnet, ...
? Pourquoi vous ne testez pas avecnetstat
si ces ports d'application sont vraiment liés pour traefik sur l'127.0.0.1
interface?Réponses:
Au moins pour le problème PostgreSQL, il semble que la connexion soit démarrée en texte clair puis mise à niveau vers TLS:
Il est donc fondamentalement impossible d'utiliser la terminaison TLS avec un proxy si ce dernier ne prend pas en charge cette négociation en texte clair + la mise à niveau vers la fonction TLS du protocole.
la source