Tôi đang cố gắng định cấu hình Traefik để tôi có quyền truy cập vào các dịch vụ thông qua tên miền và tôi sẽ không phải đặt các cổng khác nhau. Ví dụ: hai dịch vụ MongoDB, cả trên cổng mặc định, nhưng trong các miền khác nhau example.localhost
và example2.localhost
. Chỉ ví dụ này hoạt động. Ý tôi là, các trường hợp khác có thể hoạt động, nhưng tôi không thể kết nối với họ và tôi không hiểu vấn đề là gì. Đây có lẽ không phải là một vấn đề với Traefik.
Tôi đã chuẩn bị một kho lưu trữ với một ví dụ hoạt động. Bạn chỉ cần tạo chứng chỉ của riêng bạn với mkcert . Trang example.localhost
trả về 403 Forbidden
lỗi nhưng bạn không nên lo lắng về nó, vì mục đích của cấu hình này là cho thấy SSL đang hoạt động (khóa, trạng thái màu xanh lá cây). Vì vậy, đừng tập trung vào 403
.
Chỉ kết nối SSL với mongo
dịch vụ hoạt động. Tôi đã thử nghiệm nó với chương trình Robo 3T . Sau khi chọn kết nối SSL, cung cấp máy chủ lưu trữ example.localhost
và chọn chứng chỉ cho kết nối tự ký (hoặc sở hữu) hoạt động. Và đó là điều duy nhất hoạt động theo cách đó. Kết nối đến redis
( Redis Desktop Manager ) và pgsql
( PhpStorm , DBeaver , DbVisualizer ) không làm việc, cho dù tôi cung cấp giấy chứng nhận hay không. Tôi không chuyển tiếp SSL đến các dịch vụ, tôi chỉ kết nối với Traefik. Tôi đã dành nhiều giờ cho nó. Tôi đã tìm kiếm trên mạng. Tôi chưa tìm thấy câu trả lời. Có ai đã giải quyết điều này?
Tái bút Tôi làm việc trên Linux Mint, vì vậy cấu hình của tôi sẽ hoạt động trong môi trường này mà không gặp vấn đề gì. Tôi sẽ yêu cầu các giải pháp cho Linux.
Nếu bạn không muốn duyệt kho lưu trữ , tôi đính kèm các tệp quan trọng nhất:
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
cấu hình
[tls]
[[tls.certificates]]
certFile = "/etc/certs/example.localhost.pem"
keyFile = "/etc/certs/example.localhost-key.pem"
Xây dựng và chạy
mkcert example.localhost # in ./certs/
docker-compose up -d
Chuẩn bị từng bước
- Cài đặt mkcert (cũng chạy
mkcert -install
cho CA) - Sao chép mã của tôi
- Trong
certs
thư mục chạymkcert example.localhost
- Bắt đầu container bằng cách
docker-compose up -d
- Mở trang https: //example.localhost/ và kiểm tra xem nó có kết nối an toàn không
- Nếu địa chỉ http: //example.localhost/ không thể truy cập, hãy thêm
127.0.0.1 example.localhost
vào/etc/hosts
Ngũ cốc:
- Công cộng:
./certs/example.localhost.pem
- Riêng tư:
./certs/example.localhost-key.pem
- CA:
~/.local/share/mkcert/rootCA.pem
Kiểm tra MongoDB
- Cài đặt Robo 3T
- Tạo kết nối mới:
- Địa chỉ:
example.localhost
- Sử dụng giao thức SSL
- Chứng chỉ CA:
rootCA.pem
(hoặc Chứng chỉ tự ký)
- Địa chỉ:
- Công cụ kiểm tra:
Kiểm tra Redis
- Cài đặt RedisDesktopManager
- Tạo kết nối mới:
- Địa chỉ:
example.localhost
- SSL
- Khóa công khai:
example.localhost.pem
- Khóa riêng:
example.localhost-key.pem
- Thẩm quyền:
rootCA.pem
- Địa chỉ:
- Công cụ kiểm tra:
Cho đến nay:
- Có thể kết nối với Postgres qua IP (thông tin từ Traefik)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable
jdbc:postgresql://172.21.0.4:5432/postgres?sslfactory=org.postgresql.ssl.NonValidatingFactory
Hãy thử telet (IP thay đổi mỗi lần khởi động lại docker):
> 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.
Nếu tôi kết nối trực tiếp với postgres, dữ liệu là tốt đẹp. Nếu tôi kết nối qua Traefik thì tôi có Yêu cầu Không hợp lệ khi đóng kết nối. Tôi không biết điều này có nghĩa là gì và liệu nó phải có ý nghĩa gì.
Connections to redis (Redis Desktop Manager) ... do not work
, nhưng ảnh chụp màn hình cho thấy Successful connection
-? Tại sao bạn không thử nghiệm ở cấp độ thấp curl, openssl, telnet, ...
? Tại sao bạn không thử nghiệm netstat
nếu các cổng ứng dụng đó thực sự bị ràng buộc cho traefik trên 127.0.0.1
giao diện?
I can't connect to them
-> bạn đã kiểm tra nó như thế nào và lỗi là gì?