Почему я не могу связаться с панелью управления traefik через HTTPS? - PullRequest
1 голос
/ 02 июля 2019

Я пытаюсь запустить контейнер traefik на моем кластере Docker Swarm. Поскольку мы используем TLS-шифрование, я хочу, чтобы панель мониторинга traefik была доступна через https.

В моем браузере я пытаюсь получить доступ к traefik через имя хоста менеджера роя docker через https://my.docker.manager, и поэтому я смонтировал сертификат и ключ хостов в сервис traefik.

Когда я пытаюсь открыть https://my.docker.manager в своем браузере, я получаю тайм-аут.

Когда я пытаюсь curl https://my.docker.manager непосредственно на хосте (my.docker.manager), я получаю HTTP-код 403 в качестве ответа

Мой конфиг traefik:

debug=true
logLevel = "DEBUG"

defaultEntryPoints = ["http","https"]
[entryPoints]
 [entryPoints.http]
  address = ":80"
  [entryPoints.http.redirect]
   entryPoint = "https"

 [entryPoints.https]
  address = ":443"
  [entryPoints.https.tls]
   [[entryPoints.https.tls.certificates]]
    certFile = "/etc/traefik/certs/my.docker.manager.crt"
    keyFile = "/etc/traefik/certs/my.docker.manager.key"
   [entryPoints.https.tls.defaultCertificate]
    certFile = "/etc/traefik/certs/my.docker.manager.crt"
    keyFile = "/etc/traefik/certs/my.docker.manager.key"

[api]
 address = ":8080"

[docker]
 watch = true
 swarmMode = true

Мой файл составления traefik:

version: "3.7"

services:
        traefik:
                image: traefik
                ports:
                        - 80:80
                        - 443:443
                networks:
                        - devops-net
                volumes:
                        - /var/run/docker.sock:/var/run/docker.sock
                        - /mnt/docker-data/secrets/certs/:/etc/traefik/certs/
                configs:
                        - source: traefik.conf
                          target: /etc/traefik/traefik.toml
                deploy:
                        placement:
                                constraints:
                                        - node.role == manager
                        labels:
                                - "traefik.docker.network=devops-net"
                                - "traefik.frontend.rule=Host:my.docker.manager"
                                - "traefik.port=8080"

networks:
        devops-net:
                driver: overlay
                external: true

configs:
        traefik.conf:
                external: true

Как описано в этой статье (https://www.digitalocean.com/community/tutorials/how-to-use-traefik-as-a-reverse-proxy-for-docker-containers-on-ubuntu-16-04), Я ожидал увидеть панель управления traefik, когда я вызываю https://my.docker.manager в своем браузере. Но я получаю только тайм-аут. При использовании curl https://my.docker.manager я получаю HTTP-код 403. Я следовал упомянутой статье за ​​исключением двух отличий: 1) я не настраивал учетные данные 2) Я использовал собственные сертификаты хостов вместо letsencrypt

1 Ответ

0 голосов
/ 08 июля 2019

Тем временем я нашел причину моей проблемы (не уверен, что является лучшим решением). На случай, если кому-то интересно, я постараюсь объяснить.

У меня Рой из трех узлов, в сети prod.company.de

Мой клиент находится в другой сети intranet.comnpany.de

Мой менеджер роя обращен к docker-manager.prod.company.de. На этом хосте я развернул службу traefik, доступ к которой я хочу получить через https://docker -manager.prod.company.de (Это порт 443 и из-за конфигурации traefik, перенаправленной на панель мониторинга traefik на 8080 внутри контейнера).

Если я отслеживаю свой сетевой трафик, я вижу, что запрос https (https://docker -manager.prod.company.de ) от моего клиентского браузера достигает сервера, а затем трафик перенаправляется на адрес docker_gwbridge 17.18.0.2. Но ответ не находит пути к моему клиенту из-за конфигурации NAT докера.

iptables -t nat -L -v

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    8   504 MASQUERADE  all  --  any    docker_gwbridge  anywhere             anywhere             ADDRTYPE match src-type LOCAL
    0     0 MASQUERADE  all  --  any    !docker0  172.17.0.0/16        anywhere
    0     0 MASQUERADE  all  --  any    !docker_gwbridge  172.18.0.0/16        anywhere

MASQERADE говорит, что исходный IP-адрес запроса должен быть заменен на IP-адрес моста (в моем случае 172.18.0.1), чтобы ответы направлялись обратно на этот IP-адрес. В приведенном выше случае правило 8 504 MASQUERADE all -- any docker_gwbridge anywhere anywhere будет делать это, но оно ограничено запросами от LOCAL ADDRTYPE match src-type LOCAL, что означает, что использование браузера на хосте докера будет работать, но мои подключения от клиента не будут работать, потому что ответ не найдет пути к моему адресу клиента.

В настоящее время я добавил еще одно правило NAT в свои iptables: iptables -t nat -A POSTROUTING -o docker_gwbridge -j MASQUERADE

, что приводит к

1    52 MASQUERADE  all  --  any    docker_gwbridge  anywhere             anywhere

После этого я вижу трафик Dashboard при открытии https://docker -manager.prod.company.de в моем браузере на клиенте.

Но я не понимаю, зачем мне это делать, потому что я ничего не нашел об этом ни в одной документации, и я не думаю, что мой случай использования действительно редок. Вот почему я был бы счастлив, если бы кто-то мог взглянуть на этот пост и, возможно, проверить, сделал ли я что-то другое неправильно или объяснить, почему я должен делать такие вещи, чтобы заставить работать стандартный сценарий использования.

С уважением

...