如何在Traefik中配置DDNS实现本地服务公网访问?
Traefik 使用DDNS域名无法外部访问问题描述
- 已完成操作1:No-Ip DDNS配置
- 主机名:myhost.ddns.net
- 目标/IP:my-external-ip
- 类型:A
- 已完成操作2:路由器端口转发配置


- 已完成操作3:配置文件编写
docker-compose.yml内容:
version: '3.7' services: traefik: image: traefik:v2.0.1 container_name: traefik restart: unless-stopped security_opt: - no-new-privileges:true networks: - external ports: - 80:80 - 443:443 volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./traefik.yml:/traefik.yml:ro - ./acme.json:/acme.json labels: - "traefik.enable=true" - "traefik.http.routers.traefik.entrypoints=http" - "traefik.http.routers.traefik.rule=Host(`traefik.myhost.ddns.net`)" - "traefik.http.middlewares.traefik-auth.basicauth.users=*user:password*" - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https" - "traefik.http.routers.traefik.middlewares=traefik-https-redirect" - "traefik.http.routers.traefik-secure.entrypoints=https" - "traefik.http.routers.traefik-secure.rule=Host(`traefik.myhost.ddns.net`)" # - "traefik.http.routers.traefik-secure.middlewares=traefik-auth" - "traefik.http.routers.traefik-secure.tls=true" - "traefik.http.routers.traefik-secure.tls.certresolver=http" - "traefik.http.routers.traefik-secure.service=api@internal" - "traefik.http.services.traefik.loadbalancer.server.port=8080" # 其他服务配置... networks: external: external: truetraefik.yml内容:
api: dashboard: true # 日志以JSON格式写入文件 log: level: DEBUG filePath: "log-file.log" format: json # 配置100行缓存 accessLog: filePath: "log-access.log" bufferingSize: 100 entryPoints: http: address: ":80" https: address: ":443" providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false certificatesResolvers: http: acme: email: my-email@hotmail.com storage: acme.json httpChallenge: entryPoint: http - 问题现象:
执行docker-compose up -d后服务正常启动,访问traefik.myhost.ddns.net提示找不到站点,但将Host规则改为Host('traefik.localhost')后,访问traefik.localhost可正常打开仪表盘。
解决方案
- 排查DNS解析有效性
切换到公网环境(比如关闭WiFi用手机流量),pingtraefik.myhost.ddns.net,确认返回的IP和你的公网IP一致。如果解析错误,先检查No-Ip后台的A记录配置是否正确,同时确认DDNS更新客户端正常运行,避免运营商动态更换公网IP后记录没有同步更新。 - 排查端口连通性
同样在公网环境下,测试公网IP的80、443端口是否可连通。国内多数家庭宽带的80、443端口会被运营商默认封锁,如果检测端口不通,可联系运营商申请解封,或者调整端口映射规则:将Traefik的80端口映射到主机非80端口(比如8080),443端口映射到8443,路由器转发规则同步修改,访问时带端口即可,示例:https://traefik.myhost.ddns.net:8443。 - 解决内网回环限制问题
如果你是在内网环境下用DDNS域名访问,多数家用路由器默认不支持NAT回环,会导致无法访问。解决方案有两种:一是修改本地设备的hosts文件,将traefik.myhost.ddns.net指向运行Traefik服务的内网主机IP;二是在路由器后台配置DNS重写规则,将*.myhost.ddns.net的解析结果直接指向内网主机IP。 - 修正配置文件细节问题
你提供的docker-compose.yml中basicauth配置行末尾缺失闭合双引号,先补全。另外acme.json文件权限必须设置为600,否则证书申请会失败,启动容器前先执行chmod 600 ./acme.json。 - 验证路由规则生效状态
执行docker exec traefik traefik show config查看输出的路由规则,确认traefik.myhost.ddns.net已经正确绑定到对应的路由上,也可以查看Traefik的debug日志排查是否有其他报错。
内容的提问来源于stack exchange,提问作者Evandro Brunassi
相关产品推荐
相关产品推荐

