Sto cercando di configurare Traefik in modo da avere accesso ai servizi tramite nomi di dominio e che non dovrei impostare porte diverse. Ad esempio, due servizi MongoDB, entrambi sulla porta predefinita, ma in domini diversi example.localhost
e example2.localhost
. Solo questo esempio funziona. Voglio dire, altri casi probabilmente funzionano, ma non riesco a collegarmi a loro e non capisco quale sia il problema. Questo probabilmente non è nemmeno un problema con Traefik.
Ho preparato un repository con un esempio che funziona. Devi solo generare il tuo certificato con mkcert . La pagina all'indirizzo example.localhost
restituisce l' 403 Forbidden
errore ma non dovresti preoccuparti, perché lo scopo di questa configurazione è mostrare che SSL funziona (lucchetto, stato verde). Quindi non concentrarti su 403
.
mongo
Funziona solo la connessione SSL al servizio. L'ho provato con il programma Robo 3T . Dopo aver selezionato la connessione SSL, fornire l'host example.localhost
e selezionare il certificato per una connessione autofirmata (o propria) funziona. E questa è l'unica cosa che funziona in questo modo. Le connessioni a redis
( Redis Desktop Manager ) e pgsql
( PhpStorm , DBeaver , DbVisualizer ) non funzionano, indipendentemente dal fatto che io fornisca certificati o meno. Non inoltro SSL ai servizi, mi collego solo a Traefik. Ci ho passato molte ore. Ho cercato su internet. Non ho ancora trovato la risposta. Qualcuno ha risolto questo?
PS. Lavoro su Linux Mint, quindi la mia configurazione dovrebbe funzionare in questo ambiente senza problemi. Vorrei chiedere soluzioni per Linux.
Se non si desidera sfogliare il repository , allego i file più importanti:
finestra mobile-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"
Costruisci ed esegui
mkcert example.localhost # in ./certs/
docker-compose up -d
Preparare passo dopo passo
- Installa mkcert (esegui anche
mkcert -install
per CA) - Clona il mio codice
- In
certs
esecuzione cartellamkcert example.localhost
- Inizia contenitore da
docker-compose up -d
- Apri la pagina https: //example.localhost/ e verifica se si tratta di una connessione protetta
- Se l'indirizzo http: //example.localhost/ non è raggiungibile, aggiungere
127.0.0.1 example.localhost
a/etc/hosts
certs:
- Pubblico:
./certs/example.localhost.pem
- Privato:
./certs/example.localhost-key.pem
- CIRCA:
~/.local/share/mkcert/rootCA.pem
Test MongoDB
- Installa Robo 3T
- Crea una nuova connessione:
- Indirizzo:
example.localhost
- Usa il protocollo SSL
- Certificato CA:
rootCA.pem
(o certificato autofirmato)
- Indirizzo:
- Strumento di prova:
Test Redis
- Installa RedisDesktopManager
- Crea una nuova connessione:
- Indirizzo:
example.localhost
- SSL
- Chiave pubblica:
example.localhost.pem
- Chiave privata:
example.localhost-key.pem
- Autorità:
rootCA.pem
- Indirizzo:
- Strumento di prova:
Finora:
- Può connettersi a Postgres via IP (informazioni da Traefik)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable
jdbc:postgresql://172.21.0.4:5432/postgres?sslfactory=org.postgresql.ssl.NonValidatingFactory
Prova telet (l'IP cambia ad ogni riavvio della finestra mobile):
> 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.
Se mi collego direttamente a Postgres, i dati sono utili. Se mi collego a via Traefik, ho una richiesta errata quando chiudo la connessione. Non ho idea di cosa significhi e se debba significare qualcosa.
Connections to redis (Redis Desktop Manager) ... do not work
, ma lo screenshot mostra Successful connection
-? Perché non stai testando a basso livello con curl, openssl, telnet, ...
? Perché non stai testando netstat
se quelle porte delle app sono davvero vincolate per il traefik 127.0.0.1
sull'interfaccia?
I can't connect to them
-> come lo hai provato e qual è stato l'errore?