如何通过Traefik实现内网与外网服务的域名访问控制?
当然支持!Traefik 完全能实现你的需求
Traefik 天生就具备细粒度的访问控制能力,刚好能匹配你「部分服务外网开放、部分仅限内网访问」的场景。核心思路是给内网服务绑定IP白名单中间件,只放行内网IP段的请求,外网服务则不添加这个限制。下面是具体的实现步骤和配置示例:
1. 定义内网IP白名单中间件
首先在Traefik的动态配置中(可以是单独的middleware.yml,也可以写在traefik.yml里),创建一个只允许内网IP访问的中间件:
http: middlewares: internal-only: ipWhiteList: sourceRange: - "192.168.0.0/24" # 替换成你的内网IP段 - "10.0.0.0/8" # 如果有其他内网网段也一并添加 - "127.0.0.1/32" # 允许服务器本地访问
这个中间件的作用是:只有来自上述IP段的请求会被放行,外网IP发起的请求会直接返回403 Forbidden。
2. 给不同服务配置路由规则
接下来在你的Docker服务配置(比如Docker Compose)里,分别给博客和文件服务器设置对应的路由和中间件:
博客服务(外网开放)
不需要绑定白名单中间件,直接配置域名和HTTPS规则即可:
services: blog: image: your-blog-image:latest labels: - "traefik.enable=true" # 匹配blog.mydomain.com域名 - "traefik.http.routers.blog.rule=Host(`blog.mydomain.com`)" # 使用HTTPS入口点(需提前在Traefik静态配置中定义websecure) - "traefik.http.routers.blog.entrypoints=websecure" # 自动申请Let's Encrypt证书(需配置certresolver) - "traefik.http.routers.blog.tls.certresolver=letsencrypt"
这样所有外网用户访问blog.mydomain.com时,Traefik都会正常转发到你的博客服务。
文件服务器(仅限内网访问)
关键是要绑定刚才定义的internal-only中间件,确保只有内网能访问:
services: fileserver: image: your-fileserver-image:latest labels: - "traefik.enable=true" # 匹配files.mydomain.com域名 - "traefik.http.routers.fileserver.rule=Host(`files.mydomain.com`)" - "traefik.http.routers.fileserver.entrypoints=websecure" - "traefik.http.routers.fileserver.tls.certresolver=letsencrypt" # 绑定内网白名单中间件,@file表示从文件配置加载该中间件 - "traefik.http.routers.fileserver.middlewares=internal-only@file"
配置完成后,外网用户访问files.mydomain.com会收到403拒绝,只有内网设备能正常访问。
3. 额外注意事项
- 域名解析:确保
blog.mydomain.com和files.mydomain.com都解析到你的家庭公网IP(如果用了DDNS服务,要保证IP地址实时更新)。 - 端口转发:在路由器上把80和443端口转发到Traefik所在服务器的对应端口,这样外网才能访问
blog.mydomain.com。 - 测试验证:可以用手机切换到移动数据(外网环境)访问
files.mydomain.com,确认返回403;内网设备访问则能正常打开文件服务器。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

