TLS yapılandırması etkinken Traefik TCP Hizmetlerine nasıl bağlanılır?


13

Traefik'i , alan adları aracılığıyla hizmetlere erişebileceğim ve farklı bağlantı noktaları ayarlamak zorunda kalmayacak şekilde yapılandırmaya çalışıyorum . Örneğin, hem varsayılan bağlantı noktasında, ancak farklı etki alanlarında iki MongoDB hizmeti example.localhostve example2.localhost. Sadece bu örnek işe yarar. Yani, diğer vakalar muhtemelen işe yarıyor, ancak onlara bağlanamıyorum ve sorunun ne olduğunu anlamıyorum. Bu muhtemelen Traefik ile ilgili bir sorun bile değil.

İşe yarayan bir örnekle bir depo hazırladım . Sadece mkcert ile kendi sertifikanızı oluşturmanız gerekir . Adresindeki sayfa hatayı example.localhostdöndürür 403 Forbiddenancak endişelenmemelisiniz, çünkü bu yapılandırmanın amacı SSL'nin çalıştığını göstermek (asma kilit, yeşil durum). Yani odaklanmayın 403.

Yalnızca mongohizmetin SSL bağlantısı çalışır. Robo 3T programıyla test ettim . SSL bağlantısını seçtikten sonra, ana bilgisayarı açıp example.localhostkendinden imzalı (veya kendi) bir bağlantı için sertifikayı seçtikten sonra çalışır. Ve bu şekilde çalışan tek şey bu. Yapılan bağlantılar redis( Redis Masaüstü Yöneticisi ) ve pgsql( PhpStorm , DBeaver , DbVisualizer ) bakılmaksızın ben sertifikaları temin edip etmediğinden değil, iş yapmak. SSL'yi hizmetlere yönlendirmiyorum, sadece Traefik'e bağlanıyorum. Üzerinde uzun saatler geçirdim. İnterneti aradım. Henüz cevabı bulamadım. Bunu çözen var mı?

PS. Linux Mint üzerinde çalışıyorum, bu yüzden yapılandırmamın bu ortamda sorunsuz çalışması gerekiyor. Linux için çözümler isteyecektim.


Depoya göz atmak istemiyorsanız , en önemli dosyaları ekliyorum:

liman işçisi-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"

İnşa Et ve Çalıştır

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

Adım adım hazırlayın

  1. Yükleme mkcert (ayrıca çalıştırmak mkcert -installCA için)
  2. Kodumu klonla
  3. Gelen certsklasör vadedemkcert example.localhost
  4. Kapsayıcıyı şu şekilde başlat: docker-compose up -d
  5. Https: //example.localhost/ sayfasını açın ve güvenli bağlantı olup olmadığını kontrol edin
  6. Adres Eğer http: //example.localhost/ erişilemiyor eklemek 127.0.0.1 example.localhostiçin/etc/hosts

certs:

  • Halka açık: ./certs/example.localhost.pem
  • Özel: ./certs/example.localhost-key.pem
  • CA: ~/.local/share/mkcert/rootCA.pem

Test MongoDB

  1. Robo 3T'yi yükleyin
  2. Yeni bağlantı oluştur:
    • Adres: example.localhost
    • SSL protokolünü kullan
    • CA Sertifikası: rootCA.pem(veya Kendinden İmzalı Sertifika)
  3. Test aracı:

Ölçek

Test Redis

  1. RedisDesktopManager'ı yükleyin
  2. Yeni bağlantı oluştur:
    • Adres: example.localhost
    • SSL
    • Genel anahtar: example.localhost.pem
    • Özel anahtar: example.localhost-key.pem
    • Yetki: rootCA.pem
  3. Test aracı:

Ölçek


Şimdiye kadar:

  1. Postgres'e IP üzerinden bağlanabilir (Traefik'ten bilgi)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin


Telet yapmayı deneyin (IP, her bağlantı biriminin yeniden başlatılmasını değiştirir):

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

Postgres'e doğrudan bağlanırsam veriler güzeldir. Traefik ile bağlanırsam, bağlantıyı kapatırken Kötü İstek var. Bunun ne anlama geldiği ve bir şey ifade etmesi gerekip gerekmediği hakkında hiçbir fikrim yok.


I can't connect to them-> nasıl test ettiniz ve hata neydi?
Jan Garaj

@JanGaraj Adım adım talimat ekledim
Gander

Connections to redis (Redis Desktop Manager) ... do not work, ancak ekran görüntüsü gösteriyor Successful connection-? Neden düşük seviyede test yapmıyorsunuz curl, openssl, telnet, ...? Neden netstatbu uygulama portlarının 127.0.0.1arayüzde traefik için gerçekten bağlı olup olmadığını test etmiyorsunuz ?
Jan Garaj

Traefik ve veritabanlarına sahip konteyner aynı ana bilgisayarda çalışıyor mu?
Ryabchenko Alexander

Alexander Evet, docker kaplarında
Gander

Yanıtlar:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.