我正在尝试配置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
或自签名证书)
- 地址:
- 测试工具:
测试Redis
- 安装RedisDesktopManager
- 创建新连接:
- 地址:
example.localhost
- SSL协议
- 公钥:
example.localhost.pem
- 私钥:
example.localhost-key.pem
- 权威:
rootCA.pem
- 地址:
- 测试工具:
至今:
- 可以通过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连接,则在关闭连接时出现错误请求。我不知道这意味着什么,是否一定意味着什么。
Connections to redis (Redis Desktop Manager) ... do not work
,但屏幕截图显示Successful connection
-?为什么不使用进行低水平测试curl, openssl, telnet, ...
?为什么不测试netstat
这些应用程序端口是否真的在127.0.0.1
接口上绑定了traefik ?
I can't connect to them
->您是如何测试的?错误是什么?