如何在启用TLS配置的情况下连接到Traefik TCP服务?

时间:2019-12-10 09:51:35

标签: postgresql docker ssl tcp traefik

我正在尝试配置Traefik,以便可以通过域名访问服务,而不必设置其他端口。例如,两个MongoDB服务都在默认端口上,但位于不同的域example.localhostexample2.localhost中。仅此示例有效。我的意思是,其他情况也可能有效,但是我无法连接到它们,并且我不明白问题出在哪里。 Traefik可能甚至都不是问题。

我准备了一个repository,并附有一个有效的示例。您只需要使用mkcert生成自己的证书即可。 example.localhost处的页面返回403 Forbidden错误,但您不必担心,因为此配置的目的是表明SSL正常(挂锁,绿色状态)。因此,不要专注于403

仅与mongo服务的SSL连接有效。我使用 Robo 3T 程序对其进行了测试。选择SSL连接后,可以在example.localhost上提供主机并选择用于自签名(或自己)连接的证书。那是唯一以这种方式工作的东西。与redis Redis Desktop Manager )和pgsql PhpStorm DBeaver DbVisualizer < / em>)无效,无论我是否提供证书。我不将SSL转发给服务,仅连接到Traefik。我花了很长时间。我搜索了互联网。我还没有找到答案。有人解决了吗?

PS。我在Linux Mint上工作,因此我的配置应该可以在此环境下正常工作。我会要求Linux的解决方案。


如果您不想浏览repository,请附加最重要的文件:

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 个答案:

答案 0 :(得分:3)

至少对于PostgreSQL问题,似乎连接以明文形式启动,然后升级为TLS:

因此,如果代理不支持明文握手+升级到协议的TLS功能,则基本上不可能将 TLS终止与代理一起使用。