Làm cách nào để kết nối với Traefik TCP Services với cấu hình TLS được bật?


13

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.localhostexample2.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.localhosttrả về 403 Forbiddenlỗ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 mongodị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.localhostvà 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

  1. Cài đặt mkcert (cũng chạy mkcert -installcho CA)
  2. Sao chép của tôi
  3. Trong certsthư mục chạymkcert example.localhost
  4. Bắt đầu container bằng cách docker-compose up -d
  5. Mở trang https: //example.localhost/ và kiểm tra xem nó có kết nối an toàn không
  6. Nếu địa chỉ http: //example.localhost/ không thể truy cập, hãy thêm 127.0.0.1 example.localhostvà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

  1. Cài đặt Robo 3T
  2. 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ý)
  3. Công cụ kiểm tra:

kiểm tra

Kiểm tra Redis

  1. Cài đặt RedisDesktopManager
  2. 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
  3. Công cụ kiểm tra:

kiểm tra


Cho đến nay:

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây


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


I can't connect to them-> bạn đã kiểm tra nó như thế nào và lỗi là gì?
Jan Garaj

@JanGaraj Tôi đã thêm một hướng dẫn từng bước
Gander

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 netstatnếu các cổng ứng dụng đó thực sự bị ràng buộc cho traefik trên 127.0.0.1giao diện?
Jan Garaj

Liệu container với traefik và cơ sở dữ liệu chạy trên cùng một máy chủ?
Ryabunn Alexander

@RyabchenkoAlexander có, trong các container docker
Gander

Câu trả lời:


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.