Я намагаюся налаштувати 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
Підготуйтеся поетапно
- Встановити mkcert (запустіть також
mkcert -install
для CA) - Клоніруйте мій код
- У
certs
папціmkcert example.localhost
- Почати контейнер до
docker-compose up -d
- Відкрийте сторінку https: //example.localhost/ і перевірте, чи надійне з'єднання
- Якщо адреса 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
- Встановіть Robo 3T
- Створіть нове з'єднання:
- Адреса:
example.localhost
- Використовуйте протокол SSL
- Сертифікат CA:
rootCA.pem
(або самопідписаний сертифікат)
- Адреса:
- Інструмент тестування:
Тест Редіс
- Встановіть RedisDesktopManager
- Створіть нове з'єднання:
- Адреса:
example.localhost
- SSL
- Публічний ключ:
example.localhost.pem
- Приватний ключ:
example.localhost-key.pem
- Орган:
rootCA.pem
- Адреса:
- Інструмент тестування:
Так далеко:
- Можна підключитися до 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, тоді у мене поганий запит при закритті з'єднання. Я поняття не маю, що це означає і чи повинен він щось означати.
Connections to redis (Redis Desktop Manager) ... do not work
, але показує скріншот Successful connection
-? Чому ви не тестуєте на низькому рівні curl, openssl, telnet, ...
? Чому ви не тестуєте, netstat
чи справді ці порти програми прив’язані до traefik в 127.0.0.1
інтерфейсі?
I can't connect to them
-> як ти це тестував і в чому помилка?