Docker Swarm部署Traefik在Unifi架构下无法通过外部域名访问
Traefik v2.x 搭配 Docker Swarm 外网无法访问排查方案
故障匹配
当前场景:单容器直连暴露80端口外网可正常访问,内网任意节点curl USG地址可连通Traefik后端服务,切换Traefik反向代理后外网访问完全断连——这类100%是Swarm网络模式和链路转发的兼容问题,和域名解析、Traefik核心配置无关。
排查操作(按优先级从高到低)
- 修正Swarm服务的端口发布模式
当前Compose配置中的ports段未指定发布模式,默认走Swarm内置的ingress overlay网络模式,和传统docker run -p的直连转发逻辑完全不同:ingress模式的流量会经过VXLAN隧道二次封装、二次NAT,USG这类有状态防火墙会将回程包识别为无对应连接记录的非法包直接丢弃,这也是内网访问正常、外网被拦截的核心原因。
将Traefik服务的端口配置替换为host直连模式,对齐传统端口映射的流量路径:
重新部署Traefik栈后,若外网可正常访问即定位问题根源。主机存在多网卡时,可将ports: - target: 80 published: 80 mode: host - target: 8080 published: 8080 mode: hostpublished字段替换为“服务器在USG下的实际内网IP:80”,和USG端口转发的目标IP完全匹配,避免监听优先级冲突。 - 清理主机残留的旧iptables规则
此前单独运行测试容器暴露80端口时,Docker会自动在iptables的nat、filter表插入对应DNAT、FORWARD规则,切换到Swarm+Traefik后,旧容器虽已停止,对应规则不会被自动清理,会出现规则优先级冲突,将本该转发给Traefik的流量导向已失效的旧容器IP。
操作前确认SSH连接的IP段,避免规则清理断连,执行以下命令查看nat表的入站规则:iptables -t nat -L PREROUTING -n --line-number
删除输出中和当前运行的Swarm服务无关的旧DNAT规则即可。 - 验证Traefik路由配置正确性
排除网络层问题后,无需反复从外网测试,直接在服务器本地执行命令验证Traefik的路由匹配逻辑:curl -H "Host: test.mydomain.com" http://127.0.0.1
若返回Nginx默认欢迎页,说明Traefik的标签、网络配置完全正常,所有问题均集中在外网到服务器的转发链路。若返回404,检查两个服务是否都正确接入traefik-public外部网络、Traefik是否正常识别Swarm服务的部署标签。
内容的提问来源于stack exchange,提问作者kjc
相关产品推荐
相关产品推荐

