MEAN栈Docker Compose部署:如何隐藏后端禁止外部直接访问
配置有效性判定
你当前的核心网络逻辑已经可以实现禁止外部网络直接访问后端服务的目标:
front、back服务均未配置端口映射,Docker默认不会将两个服务的端口暴露到宿主机公网,外部用户无法直接通过服务器IP+端口的形式访问后端- 所有服务归属同一自定义bridge网络,仅Nginx服务对外暴露80、443端口,后端仅能接收同网络内Nginx转发的请求,不存在直接暴露公网的风险
待调整配置项
1. Docker Compose 配置加固
当前配置没有显式声明服务的网络归属,存在服务意外接入Docker默认网络、导致端口暴露的风险,建议显式为所有服务指定网络,调整后参考配置如下:
version: '3' services: front: # 原有业务配置,不要添加任何ports端口映射配置 networks: - app-network back: # 原有业务配置,不要添加任何ports端口映射配置 networks: - app-network nginx: # 原有业务配置 ports: - "80:80" - "443:443" networks: - app-network certbot: # 原有业务配置 networks: - app-network networks: app-network: driver: bridge
注意不要给back、front服务添加任何端口映射,包括绑定127.0.0.1的映射也不需要,彻底切断外部直接访问两个服务的路径。
2. Nginx 反向代理规则修正
你当前的/back路由配置存在逻辑问题,会导致接口请求返回404:
- 现有规则用
try_files $uri @back先匹配静态文件,再走反向代理,对于纯接口请求属于多余逻辑 - 单独写rewrite规则做路径裁剪容易出现匹配错误,可直接通过
proxy_pass的尾斜杠实现路径自动裁剪
修正后的/back路由配置参考:
location ^~ /back/ { # 自动裁剪/back前缀,将请求转发到后端3001端口 proxy_pass http://back:3001/; # 传递客户端真实信息到后端 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-Proto $scheme; # 原有安全头配置可保留 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always; }
另外80端口的强制跳转规则可以简化,去掉多余的try_files逻辑,减少不必要的静态文件查找:
server { listen 80; server_name example.com www.example.com; location ~ /.well-known/acme-challenge { allow all; root /var/www/html; } location / { return 301 https://$host$request_uri; } }
3. 后端服务监听配置校验
确保Node.js后端服务监听地址为0.0.0.0:3001,不要绑定127.0.0.1,否则Docker内部网络无法访问后端,Nginx反向代理会返回502错误。
可选安全加固项
- 可以在
/back路由中添加请求方法限制,仅放行业务实际用到的HTTP方法(如GET、POST、PUT、DELETE),拦截TRACE、CONNECT等无用方法 - 如果后端不需要主动请求公网接口,可以为
back服务单独配置internal: true的内部网络,仅允许和Nginx服务通信,进一步缩小攻击面
内容的提问来源于stack exchange,提问作者Galina
相关产品推荐
相关产品推荐

