Come connettersi ai servizi TCP Traefik con la configurazione TLS abilitata?


13

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.localhoste 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.localhostrestituisce l' 403 Forbiddenerrore ma non dovresti preoccuparti, perché lo scopo di questa configurazione è mostrare che SSL funziona (lucchetto, stato verde). Quindi non concentrarti su 403.

mongoFunziona solo la connessione SSL al servizio. L'ho provato con il programma Robo 3T . Dopo aver selezionato la connessione SSL, fornire l'host example.localhoste 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

  1. Installa mkcert (esegui anche mkcert -installper CA)
  2. Clona il mio codice
  3. In certsesecuzione cartellamkcert example.localhost
  4. Inizia contenitore da docker-compose up -d
  5. Apri la pagina https: //example.localhost/ e verifica se si tratta di una connessione protetta
  6. Se l'indirizzo http: //example.localhost/ non è raggiungibile, aggiungere 127.0.0.1 example.localhosta/etc/hosts

certs:

  • Pubblico: ./certs/example.localhost.pem
  • Privato: ./certs/example.localhost-key.pem
  • CIRCA: ~/.local/share/mkcert/rootCA.pem

Test MongoDB

  1. Installa Robo 3T
  2. Crea una nuova connessione:
    • Indirizzo: example.localhost
    • Usa il protocollo SSL
    • Certificato CA: rootCA.pem(o certificato autofirmato)
  3. Strumento di prova:

test

Test Redis

  1. Installa RedisDesktopManager
  2. Crea una nuova connessione:
    • Indirizzo: example.localhost
    • SSL
    • Chiave pubblica: example.localhost.pem
    • Chiave privata: example.localhost-key.pem
    • Autorità: rootCA.pem
  3. Strumento di prova:

test


Finora:

  1. Può connettersi a Postgres via IP (informazioni da Traefik)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine


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.


I can't connect to them-> come lo hai provato e qual è stato l'errore?
Jan Garaj,

@JanGaraj Ho aggiunto un'istruzione passo-passo
Gander

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 netstatse quelle porte delle app sono davvero vincolate per il traefik 127.0.0.1sull'interfaccia?
Jan Garaj,

Il contenitore con traefik e database funziona sullo stesso host?
Ryabchenko Alexander,

@RyabchenkoAlexander sì, in contenitori docker
Gander

Risposte:


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.