Nginx配置:Docker内网中限制后端服务仅内网访问
解决Nginx仅允许Docker内网前端访问后端路径的问题
根据你的场景,核心需求是只让Docker内网中的前端容器(172.28.1.4)访问后端服务的代理路径,同时阻止外部用户直接访问这些路径。你已经搭建好了反向代理框架,只需要在Nginx的后端location块中添加IP访问控制规则即可实现目标。
核心思路:用Nginx的allow/deny指令做IP白名单
你的前端容器有固定的内网IP(172.28.1.4),而外部请求的$remote_addr会是客户端的公网/局域网IP。我们可以针对后端代理的location块,只放行前端容器的IP,拒绝所有其他来源的请求。
修改后的完整Nginx配置示例
server { listen 443; server_name localhost; # 认证服务代理:仅允许前端容器IP访问 location ~/_user(/.*)*/?$ { # 只放行前端容器的内网IP allow 172.28.1.4; # 拒绝所有其他来源 deny all; proxy_pass http://authentication_server:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } # 数据库API代理:仅允许前端容器IP访问 location ~/_api(/.*)*/?$ { allow 172.28.1.4; deny all; proxy_pass http://database_server:80; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } # 前端页面代理:允许外部正常访问(保留原有配置) location ~/ { proxy_pass http://ui_frontend_server:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } }
生效逻辑说明
- 外部用户直接访问
https://external.ip.address/_user/login时,Nginx检测到请求的$remote_addr是外部IP,会触发deny all规则,返回403 Forbidden错误。 - 当前端容器(172.28.1.4)发起请求到Nginx时,
$remote_addr就是前端的内网IP,符合allow 172.28.1.4的规则,会正常转发到对应的后端服务。
额外优化建议
如果未来前端容器的IP可能变动,你可以:
- 保持在
docker-compose.yaml中给前端容器固定IP的配置(你已经这么做了,这是最稳妥的方式); - 若想依赖Docker内置DNS,可尝试通过前端容器名称(比如
ui_frontend_server)限制,但需要额外配置Nginx解析Docker内部DNS,不如固定IP直接高效。
验证方法
- 从外部机器访问
https://你的公网IP/_api/any_path,应该得到403错误; - 进入前端容器内部,用
curl https://nginx容器内网IP/_user/login测试,应该能正常转发到认证服务并获取响应。
内容的提问来源于stack exchange,提问作者Gryffe
相关产品推荐
相关产品推荐

