将 TCP 流量从 Traefik 转发到 Docker 容器

时间:2021-02-06 06:47:16

标签: docker traefik

我目前有一个 Traefik 实例,它正在使用以下内容运行。它可以很好地将 HTTP 连接转发到适当的后端。

  services_lb:
    image: traefik:v2.2
    cmd: |
      --entrypoints.web.address=:80
      --entrypoints.websecure.address=:443
      --entrypoints.web.http.redirections.entryPoint.to=websecure
      --entrypoints.web.http.redirections.entryPoint.scheme=https
      --entrypoints.web.http.redirections.entrypoint.permanent=true
      --entrypoints.matrixfederation.address=:8448
      --entrypoints.prosodyc2s.address=:5222
      --entrypoints.prosodys2s.address=:5269
      --providers.docker
      --providers.docker.constraints=Label(`lb.net`,`services`)
      --providers.docker.network=am-services
      --certificatesresolvers.lec.acme.email=notify@battlepenguin.com
      --certificatesresolvers.lec.acme.storage=/letsencrypt/acme.json
      --certificatesresolvers.lec.acme.tlschallenge=true
      --entryPoints.web.forwardedHeaders.trustedIPs=172.50.0.1/24
    ports:
      - 80
      - 443
      # Matrix
      - 8448
      # XMPP
      - 5222
      - 5269

我的 Web 和 Matrix 联合连接工作正常,因为它们都是 HTTP。但是对于 Prosody (XMPP) 我需要直接转发 5222 和 5269 而没有任何 HTTP 路由。我这样配置容器:

  xmpp:
    image: prosody/prosody:0.11
    network:
      - services
      - database
    labels:
      lb.net: services
      traefik.tcp.services.prosodyc2s.loadbalancer.server.port: "5222"
      traefik.tcp.services.prosodys2s.loadbalancer.server.port: "5269"
      traefik.http.routers.am-app-xmpp.entrypoints: "websecure"
      traefik.http.routers.am-app-xmpp.rule: "Host(`xmpp.example.com`)"
      traefik.http.routers.am-app-xmpp.tls.certresolver: "lec"
      traefik.http.services.am-app-xmpp.loadbalancer.server.port: "5280"
    volumes:
      - prosody-config:/etc/prosody:rw
      - services_certs:/certs:ro
      - prosody-logs:/var/log/prosody:rw
      - prosody-modules:/usr/lib/prosody-modules:rw

使用 tcp 服务,我仍然无法让 Traefik 将原始 TCP 连接转发到此容器。我已经尝试从 Traefik 实例中删除 --entrypoints,当然,Traefik 停止侦听这些端口。我假设 traefik.tcp.service 定义会导致该入口点切换到 TCP 直通模式,但事实并非如此。我在 Traefik 文档中没有看到任何关于将入口点本身置于 TCP 模式而不是 HTTP 模式的内容。

如何使用容器上的标签和 Traefik 的 CLI 选项将原始 TCP 连接从 Traefik 传递到此特定容器?

1 个答案:

答案 0 :(得分:0)

我想通了。您不能使用任何标准的 Traefik TLS 卸载 due to the differences in how Traefik and Prosidy handle TLS。我必须完全禁用 TLS 并使用下面的特殊 HostSNI(*) 规则来允许直接通过。我还缺少将 Traefik 入口点连接到 TCP 服务的路由器。

        labels:
          lb.net: services
          # client to server
          traefik.tcp.routers.prosodyc2s.entrypoints: prosodyc2s
          traefik.tcp.routers.prosodyc2s.rule: HostSNI(`*`)
          traefik.tcp.routers.prosodyc2s.tls: "false"
          traefik.tcp.services.prosodyc2s.loadbalancer.server.port: "5222"
          traefik.tcp.routers.prosodyc2s.service: prosodyc2s
          # server to server
          traefik.tcp.routers.prosodys2s.entrypoints: prosodys2s
          traefik.tcp.routers.prosodys2s.rule: HostSNI(`*`)
          traefik.tcp.routers.prosodys2s.tls: "false"
          traefik.tcp.services.prosodys2s.loadbalancer.server.port: "5269"
          traefik.tcp.routers.prosodys2s.service: prosodys2s
          # web
          traefik.http.routers.am-app-xmpp.entrypoints: "websecure"
          traefik.http.routers.am-app-xmpp.rule: "Host(`xmpp.example.com`)"
          traefik.http.routers.am-app-xmpp.tls.certresolver: "lec"
          traefik.http.services.am-app-xmpp.loadbalancer.server.port: "5280"
相关问题