web-dev-qa-db-ja.com

Traefikに接続する方法TCP TLS構成を有効にしたサービス?

Traefik を構成して、ドメイン名を介してサービスにアクセスできるようにし、別のポートを設定する必要がないようにしています。たとえば、2つのMongoDBサービスは、どちらもデフォルトポートにありますが、異なるドメインではexample.localhostexample2.localhostです。この例だけが機能します。つまり、他のケースはおそらく機能しますが、それらに接続できず、問題が何であるか理解できません。これはおそらくTraefikの問題でもありません。

私は repository を用意し、動作する例を示しました。 mkcert を使用して独自の証明書を生成する必要があります。 example.localhostのページは403 Forbiddenエラーを返しますが、この構成の目的はSSLが機能している(南京錠、緑のステータス)ことを示すことなので、心配する必要はありません。したがって、403に焦点を当てないでください。

mongoサービスへのSSL接続のみが機能します。Robo 3Tプログラムでテストしました。 SSL接続を選択した後、example.localhostにホストを提供し、自己署名(または独自の)接続の証明書を選択すると機能します。そして、それがそのように機能する唯一のものです。 redisRedis Desktop Manager)およびpgsqlPhpStormへの接続/、DBeaverDbVisualizer)は、証明書を提供するかどうかに関係なく機能しません。 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. インストール mkcert (CAの場合はmkcert -installも実行)
  2. 私のクローン code
  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. テストツール:

test

テストRedis

  1. インストール RedisDesktopManager
  2. 新しい接続を作成:
    • 住所:example.localhost
    • SSL
    • 公開鍵:example.localhost.pem
    • 秘密鍵:example.localhost-key.pem
    • 機関:rootCA.pem
  3. テストツール:

test


これまでのところ:

  1. IP経由でPostgresに接続できます(Traefikからの情報)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable

enter image description here

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

enter image description here


テレットを試します(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経由でに接続すると、接続を閉じるときに不正なリクエストが発生します。これが何を意味するのか、それが何かを意味するのかどうかはわかりません。

11
Gander

少なくともPostgreSQLの問題では、接続がクリアテキストで開始され、TLSにアップグレードされているようです。

したがって、プロキシがこのクリアテキストハンドシェイクとプロトコルのTLS機能へのアップグレードをサポートしていない場合、プロキシでTLSターミネーションを使用することは基本的に不可能です。

2
Jose Liber