Bagaimana menghubungkan ke Traefik TCP Services dengan konfigurasi TLS diaktifkan?

13

Saya mencoba mengkonfigurasi Traefik sehingga saya akan memiliki akses ke layanan melalui nama domain, dan bahwa saya tidak perlu mengatur port yang berbeda. Misalnya, dua layanan MongoDB, keduanya pada port default, tetapi dalam domain yang berbeda, example.localhostdan example2.localhost. Hanya contoh ini yang berfungsi. Maksudku, kasus lain mungkin berhasil, tetapi saya tidak dapat terhubung ke mereka, dan saya tidak mengerti apa masalahnya. Ini mungkin bahkan bukan masalah dengan Traefik.

Saya sudah menyiapkan repositori dengan contoh yang berfungsi. Anda hanya perlu membuat sertifikat sendiri dengan mkcert . Halaman di example.localhostmengembalikan 403 Forbiddenkesalahan tetapi Anda tidak perlu khawatir, karena tujuan dari konfigurasi ini adalah untuk menunjukkan bahwa SSL berfungsi (gembok, status hijau). Jadi jangan fokus 403.

Hanya koneksi SSL ke mongolayanan yang berfungsi. Saya mengujinya dengan program Robo 3T . Setelah memilih koneksi SSL, menyediakan host pada example.localhostdan memilih sertifikat untuk koneksi yang ditandatangani sendiri (atau milik sendiri) berfungsi. Dan itulah satu-satunya yang bekerja seperti itu. Koneksi ke redis( Redis Desktop Manager ) dan ke pgsql( PhpStorm , DBeaver , DbVisualizer ) tidak berfungsi, terlepas dari apakah saya memberikan sertifikat atau tidak. Saya tidak meneruskan SSL ke layanan, saya hanya terhubung ke Traefik. Saya menghabiskan waktu berjam-jam untuk itu. Saya mencari di internet. Saya belum menemukan jawabannya. Adakah yang memecahkan ini?

PS. Saya bekerja di Linux Mint, jadi konfigurasi saya harus bekerja di lingkungan ini tanpa masalah. Saya akan meminta solusi untuk Linux.


Jika Anda tidak ingin menelusuri repositori , saya lampirkan file yang paling penting:

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"

Bangun & Jalankan

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

Persiapkan langkah demi langkah

  1. Instal mkcert (jalankan juga mkcert -installuntuk CA)
  2. Kloning kode saya
  3. Di certsfolder runmkcert example.localhost
  4. Mulai wadah dengan docker-compose up -d
  5. Buka halaman https: //example.localhost/ dan periksa apakah koneksi aman
  6. Jika alamat http: //example.localhost/ tidak dapat dijangkau, tambahkan 127.0.0.1 example.localhostke/etc/hosts

Sertifikat:

  • Publik: ./certs/example.localhost.pem
  • Pribadi: ./certs/example.localhost-key.pem
  • CA: ~/.local/share/mkcert/rootCA.pem

Uji MongoDB

  1. Instal Robo 3T
  2. Buat koneksi baru:
    • Alamat: example.localhost
    • Gunakan protokol SSL
    • Sertifikat CA: rootCA.pem(atau Sertifikat yang ditandatangani sendiri)
  3. Alat uji:

uji

Tes Redis

  1. Instal RedisDesktopManager
  2. Buat koneksi baru:
    • Alamat: example.localhost
    • SSL
    • Kunci Publik: example.localhost.pem
    • Kunci Pribadi: example.localhost-key.pem
    • Wewenang: rootCA.pem
  3. Alat uji:

uji


Sejauh ini:

  1. Dapat terhubung ke Postgres via IP (info dari Traefik)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable

masukkan deskripsi gambar di sini

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

masukkan deskripsi gambar di sini


Coba telet (IP mengubah setiap docker restart):

> 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.

Jika saya terhubung langsung ke postgres, datanya bagus. Jika saya terhubung melalui Traefik maka saya memiliki Permintaan Buruk ketika menutup koneksi. Saya tidak tahu apa artinya ini dan apakah itu harus berarti sesuatu.

Memandang sebentar
sumber
I can't connect to them-> bagaimana Anda mengujinya dan apa kesalahannya?
Jan Garaj
@JanGaraj Saya menambahkan instruksi langkah demi langkah
Gander
Connections to redis (Redis Desktop Manager) ... do not work, tetapi tangkapan layar menunjukkan Successful connection-? Mengapa Anda tidak menguji pada level rendah dengan curl, openssl, telnet, ...? Mengapa Anda tidak menguji dengan netstatapakah port aplikasi tersebut benar-benar diikat untuk traefik pada 127.0.0.1antarmuka?
Jan Garaj
Apakah container dengan traefik dan database berjalan pada host yang sama?
Ryabchenko Alexander
@RyabchenkoAlexander ya, dalam wadah buruh pelabuhan
Gander

Jawaban:

2

Setidaknya untuk masalah PostgreSQL, tampaknya koneksi dimulai dalam teks-bersih dan kemudian ditingkatkan ke TLS:

Jadi pada dasarnya tidak mungkin untuk menggunakan terminasi TLS dengan proxy jika proxy tersebut tidak mendukung + handshake cleartext ini ditingkatkan ke fungsi TLS protokol.

Jose Liber
sumber