You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Docker Swarm+Traefik将HTTPS流量转发至容器

解决Traefik透传SSL流量至Docker Swarm容器的配置方案

你之前的配置错误在于使用了HTTP路由规则,Traefik会自动终止客户端的SSL连接后再转发请求到容器——这和你想要的「直接转发SSL流量到容器」需求不符。要实现纯TCP层的SSL透传,需要改用Traefik的TCP路由功能,具体配置如下:

第一步:确保Traefik静态配置开启TCP入口支持

在Traefik的服务配置中,需要将websecure(即443端口)入口点配置为支持TCP协议。以Docker Compose部署Traefik为例,修改其command参数:

services:
  traefik:
    image: traefik:v2.10
    command:
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      # 开启websecure入口点的TCP路由支持
      - "--entrypoints.websecure.asDefaultForTCP=true"
      # 其他Traefik静态配置保持不变
      - "--providers.docker.swarmMode=true"
      - "--providers.docker.exposedbydefault=false"

第二步:配置服务的TCP路由标签

将你服务的Traefik标签替换为TCP路由相关配置,完全移除原有的HTTP路由和服务标签:

services:
  your-service:
    image: your-image:latest
    deploy:
      labels:
        # TCP路由规则:通过SNI匹配域名(TCP层唯一可用的路由标识)
        - traefik.tcp.routers.localhost-ssl.rule=HostSNI(`{subdomain:[a-z0-9]+}.mydomain.com`)
        - traefik.tcp.routers.localhost-ssl.entrypoints=websecure
        - traefik.tcp.routers.localhost-ssl.service=localhost-ssl
        - traefik.tcp.routers.localhost-ssl.priority=2

        # TCP服务配置:直接转发到容器的443端口
        - traefik.tcp.services.localhost-ssl.loadbalancer.server.port=443

        # 可选:如果容器使用自签名SSL证书,无需额外验证(Traefik仅转发流量)
        # - traefik.tcp.services.localhost-ssl.loadbalancer.server.tls.insecureSkipVerify=true

关键说明

  1. TCP vs HTTP路由的区别:TCP路由仅做纯流量转发,不会解析或加密/解密SSL连接,客户端的SSL握手直接和容器完成;而HTTP路由会先终止SSL,再以HTTP或HTTPS协议和容器通信,这是你之前配置失败的核心原因。
  2. HostSNI规则:TCP层没有HTTP的Host头,只能通过SSL握手时的SNI(Server Name Indication)字段来匹配域名,所以必须使用HostSNI作为路由规则。
  3. 端口配置:确保容器的443端口已正确暴露,且服务内部确实在监听443端口并提供SSL服务。

内容的提问来源于stack exchange,提问作者Cédric Boivin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:33:17