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


13

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

我准备了一个带有示例的存储库。您只需要使用mkcert生成自己的证书即可。位于的页面会example.localhost返回403 Forbidden错误,但您不必担心,因为此配置的目的是显示SSL正常(挂锁,绿色状态)。所以不要专心403

仅与mongo服务的SSL连接有效。我使用Robo 3T程序对其进行了测试。选择SSL连接后,提供主机example.localhost并选择用于自签名(或自有)连接的证书即可。那是唯一以这种方式工作的东西。不管我是否提供证书,与redisRedis Desktop Manager)和pgsqlPhpStormDBeaverDbVisualizer)的连接均不起作用。我不将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. 测试工具:

测试

测试Redis

  1. 安装RedisDesktopManager
  2. 创建新连接:
    • 地址: example.localhost
    • SSL协议
    • 公钥: example.localhost.pem
    • 私钥: example.localhost-key.pem
    • 权威: rootCA.pem
  3. 测试工具:

测试


至今:

  1. 可以通过IP连接到Postgres(来自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(每次docker重新启动时更改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->您是如何测试的?错误是什么?
Jan Garaj

@JanGaraj我添加了分步说明
Gander

Connections to redis (Redis Desktop Manager) ... do not work,但屏幕截图显示Successful connection-?为什么不使用进行低水平测试curl, openssl, telnet, ...?为什么不测试netstat这些应用程序端口是否真的在127.0.0.1接口上绑定了traefik ?
Jan Garaj

包含traefik的容器和数据库是否在同一主机上运行?
Ryabchenko亚历山大

@RyabchenkoAlexander是的,在码头集装箱中
Gander

Answers:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.