【问题标题】:Why can't I reach my traefik dashboard via HTTPS?为什么我无法通过 HTTPS 访问我的 traefik 仪表板?
【发布时间】:2019-07-02 11:01:17
【问题描述】:

我正在尝试在我的 docker swarm 集群上运行一个 traefik 容器。因为我们使用的是 TLS 加密通信,所以我希望 traefik 仪表板可以通过 https 访问。

在我的浏览器中,我尝试通过 docker swarm manager 主机名通过https://my.docker.manager 访问 traefik,因此我将我的主机证书和密钥安装到 traefik 服务中。

当我尝试在浏览器中打开 https://my.docker.manager 时,出现超时。

当我尝试直接在主机 (my.docker.manager) 上 curl https://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) 中所述,当我在浏览器中调用 https://my.docker.manager 时,我希望看到 traefik 仪表板。但我只得到一个超时。使用 curl https://my.docker.manager 时,我得到 HTTP 代码 403。除了两个不同之处外,我遵循了上述文章: 1)我没有配置凭据 2)我使用我的主机自己的证书而不是 letencrypt

【问题讨论】:

    标签: docker ssl https docker-swarm traefik


    【解决方案1】:

    与此同时,我找到了问题的原因(不确定什么是最佳解决方案)。对于有人感兴趣的情况,我会尽力解释。

    我有一个由三个节点组成的 Swarm,在网络 prod.company.de 中

    我的客户在另一个网络 intranet.comnpany.de

    我的 swarm 管理器的地址是 docker-manager.prod.company.de。在这台主机上,我已经部署了 traefik 服务,我想通过https://docker-manager.prod.company.de 访问它(这是端口 443,因为 traefik 配置转发到容器内 8080 上的 traefik 仪表板)。

    如果我跟踪我的网络流量,我可以看到来自客户端浏览器的 https 请求 (https://docker-manager.prod.company.de) 到达服务器,然后流量被转发到 docker_gwbridge 地址 17.18.0.2。但是由于 docker NAT 配置,答案找不到返回我的客户端的方法。

    iptables -t nat -L -v

    Chain POSTROUTING(策略接受 0 个数据包,0 个字节) pkts bytes target prot opt in out source destination 8 504 MASQUERADE all -- 任何 docker_gwbridge 任何地方 ADDRTYPE 匹配 src-type LOCAL 0 0 MASQUERADE all -- any !docker0 172.17.0.0/16 任何地方 0 0 MASQUERADE all -- any !docker_gwbridge 172.18.0.0/16 任何地方

    MASQERADE 表示请求的源 IP 应替换为网桥 IP(在我的情况下为 172.18.0.1),以便将答案路由回此 IP。在上述情况下,规则8 504 MASQUERADE all -- any docker_gwbridge anywhere anywhere 会执行此操作,但仅限于来自ADDRTYPE match src-type LOCAL 的LOCAL 请求,这意味着在docker 主机上使用浏览器可以工作,但我来自客户端的连接不起作用,因为答案将找不到返回我的客户地址的方法。

    目前,我在 iptables 中又添加了一条 NAT 规则: iptables -t nat -A POSTROUTING -o docker_gwbridge -j MASQUERADE

    导致

    1 52 MASQUERADE all -- 任何地方的任何 docker_gwbridge 

    之后,当我在客户端的浏览器中打开 https://docker-manager.prod.company.de 时,我可以看到 traefik 仪表板。

    但我不明白,为什么我必须这样做,因为我在任何文档中都没有发现任何相关内容,而且我认为我的用例并不罕见。这就是为什么我会很高兴,如果有人可以看看这篇文章并检查我是否做错了其他事情或向我解释为什么我必须做这些事情才能使标准用例正常工作。

    亲切的问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2011-12-23
      相关资源
      最近更新 更多