You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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可能变动,你可以:

  1. 保持在docker-compose.yaml中给前端容器固定IP的配置(你已经这么做了,这是最稳妥的方式);
  2. 若想依赖Docker内置DNS,可尝试通过前端容器名称(比如ui_frontend_server)限制,但需要额外配置Nginx解析Docker内部DNS,不如固定IP直接高效。

验证方法

  • 从外部机器访问https://你的公网IP/_api/any_path,应该得到403错误;
  • 进入前端容器内部,用curl https://nginx容器内网IP/_user/login测试,应该能正常转发到认证服务并获取响应。

内容的提问来源于stack exchange,提问作者Gryffe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:49:53