Traefik を構成して、ドメイン名を介してサービスにアクセスできるようにし、別のポートを設定する必要がないようにしています。たとえば、2つのMongoDBサービスは、どちらもデフォルトポートにありますが、異なるドメインではexample.localhost
とexample2.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)は、証明書を提供するかどうかに関係なく機能しません。 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
mkcert -install
も実行)certs
フォルダーでmkcert example.localhost
を実行しますdocker-compose up -d
でコンテナを開始127.0.0.1 example.localhost
を/etc/hosts
に追加します./certs/example.localhost.pem
./certs/example.localhost-key.pem
~/.local/share/mkcert/rootCA.pem
example.localhost
rootCA.pem
(または自己署名証明書)example.localhost
example.localhost.pem
example.localhost-key.pem
rootCA.pem
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable
jdbc:postgresql://172.21.0.4:5432/postgres?sslfactory=org.postgresql.ssl.NonValidatingFactory
> 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経由でに接続すると、接続を閉じるときに不正なリクエストが発生します。これが何を意味するのか、それが何かを意味するのかどうかはわかりません。
少なくともPostgreSQLの問題では、接続がクリアテキストで開始され、TLSにアップグレードされているようです。
したがって、プロキシがこのクリアテキストハンドシェイクとプロトコルのTLS機能へのアップグレードをサポートしていない場合、プロキシでTLSターミネーションを使用することは基本的に不可能です。