Як підключитися до Traefik TCP Services з увімкненою конфігурацією TLS?


13

Я намагаюся налаштувати Traefik так, щоб у мене був доступ до служб через доменні імена, і щоб мені не довелося встановлювати різні порти. Наприклад, два сервіси MongoDB, як на порту за замовчуванням, але в різних областях, example.localhostі example2.localhost. Тільки цей приклад працює. Я маю на увазі, що інші випадки, ймовірно, працюють, але я не можу з ними підключитися, і я не розумію, у чому проблема. З Traefik це, мабуть, навіть не проблема.

Я підготував сховище з прикладом, який працює. Вам просто потрібно створити власний сертифікат за допомогою mkcert . Сторінка, що example.localhostповертається, повертає 403 Forbiddenпомилку, але не варто її турбувати, оскільки мета цієї конфігурації - показати, що SSL працює (замок, зелений статус). Тому не зосереджуйтесь на цьому 403.

mongoПрацює тільки підключення SSL до сервісу. Я перевірив це за допомогою програми Robo 3T . Після вибору з'єднання SSL, включення хоста example.localhostта вибір сертифіката для самопідписаного (або власного) з'єднання працює. І це єдине, що працює таким чином. Підключення до redis( Redis Desktop Manager ) та до pgsql( PhpStorm , DBeaver , DbVisualizer ) не працюють, незалежно від того, надаю я сертифікати чи ні. Я не пересилаю SSL до сервісів, я підключаюся лише до Traefik. Я витратив на це довгі години. Я шукав в Інтернеті. Я ще не знайшов відповіді. Хтось вирішив це?

PS. Я працюю над Linux Mint, тому моя конфігурація повинна працювати в цьому середовищі без проблем. Я б попросив рішення для Linux.


Якщо ви не хочете переглядати сховище , я додаю найважливіші файли:

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"

Побудувати і запустити

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

Підготуйтеся поетапно

  1. Встановити mkcert (запустіть також mkcert -installдля CA)
  2. Клоніруйте мій код
  3. У certsпапціmkcert example.localhost
  4. Почати контейнер до docker-compose up -d
  5. Відкрийте сторінку https: //example.localhost/ і перевірте, чи надійне з'єднання
  6. Якщо адреса http: //example.localhost/ недоступна, додайте 127.0.0.1 example.localhostдо/etc/hosts

Серти:

  • Загальнодоступне: ./certs/example.localhost.pem
  • Приватний: ./certs/example.localhost-key.pem
  • CA: ~/.local/share/mkcert/rootCA.pem

Тестовий MongoDB

  1. Встановіть Robo 3T
  2. Створіть нове з'єднання:
    • Адреса: example.localhost
    • Використовуйте протокол SSL
    • Сертифікат CA: rootCA.pem(або самопідписаний сертифікат)
  3. Інструмент тестування:

тест

Тест Редіс

  1. Встановіть RedisDesktopManager
  2. Створіть нове з'єднання:
    • Адреса: example.localhost
    • SSL
    • Публічний ключ: example.localhost.pem
    • Приватний ключ: example.localhost-key.pem
    • Орган: rootCA.pem
  3. Інструмент тестування:

тест


Так далеко:

  1. Можна підключитися до Postgres через IP (інформація від Traefik)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable

введіть тут опис зображення

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

введіть тут опис зображення


Спробуйте telet (IP змінює кожен перезапуск докера):

> 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, дані є приємними. Якщо я підключаюся до Traefik, тоді у мене поганий запит при закритті з'єднання. Я поняття не маю, що це означає і чи повинен він щось означати.


I can't connect to them-> як ти це тестував і в чому помилка?
Ян Гараж

@JanGaraj Я додав покрокову інструкцію
Gander

Connections to redis (Redis Desktop Manager) ... do not work, але показує скріншот Successful connection-? Чому ви не тестуєте на низькому рівні curl, openssl, telnet, ...? Чому ви не тестуєте, netstatчи справді ці порти програми прив’язані до traefik в 127.0.0.1інтерфейсі?
Ян Гарай

Чи працює контейнер з traefik та базами даних на одному хості?
Рябченко Олександр

@RyabchenkoAlexander так, у докерних контейнерах
Gander

Відповіді:


2

Принаймні, для проблеми PostgreSQL, здається, що з'єднання запускається в чіткому тексті, а потім оновляється до TLS:

Тому в основному неможливо використовувати термінал TLS з проксі, якщо зазначений проксі не підтримує це рукостискання чіткого тексту + оновлення до TLS функції протоколу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.