如何配置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
关键说明
- TCP vs HTTP路由的区别:TCP路由仅做纯流量转发,不会解析或加密/解密SSL连接,客户端的SSL握手直接和容器完成;而HTTP路由会先终止SSL,再以HTTP或HTTPS协议和容器通信,这是你之前配置失败的核心原因。
- HostSNI规则:TCP层没有HTTP的Host头,只能通过SSL握手时的SNI(Server Name Indication)字段来匹配域名,所以必须使用
HostSNI作为路由规则。 - 端口配置:确保容器的443端口已正确暴露,且服务内部确实在监听443端口并提供SSL服务。
内容的提问来源于stack exchange,提问作者Cédric Boivin
相关产品推荐
相关产品推荐

