应仅监听127.0.0.1或内网地址,禁用0.0.0.0绑定;配合iptables/ufw限制端口访问源,nginx透传x-forwarded-by头并在后端校验,同时关闭敏感管理端点。

直接暴露后端服务端口(如 8080、3000)是常见安全隐患,攻击者可绕过 Nginx 的限流、鉴权和 HTTPS 等防护,直连后端造成越权、信息泄露甚至服务瘫痪。核心思路是:**让后端只响应来自 Nginx 的可信请求,拒绝一切外部直连**。
关闭后端服务器对外监听
最基础也最关键的一步:后端服务不应绑定 0.0.0.0:端口,而应仅监听本地回环或内网地址。
- Spring Boot 应用:启动时加
--server.address=127.0.0.1或配置application.yml中server.address: 127.0.0.1 - Node.js:
app.listen(3000, '127.0.0.1') - Docker 容器:发布端口时避免
-p 8080:8080,改用--network host或仅内部网络通信(如自定义 bridge 网络 +extra_hosts)
用防火墙限制后端端口访问范围
即使后端监听了内网 IP,仍需操作系统级兜底防护。
- Linux(iptables):
iptables -A INPUT -p tcp --dport 8080 ! -s 127.0.0.1 -j DROP(仅允许本机访问) - 若 Nginx 与后端不在同一台机器(如跨主机部署),则只放行 Nginx 所在服务器的 IP:
iptables -A INPUT -p tcp --dport 8080 -s 192.168.1.5 -j ACCEPT,再加-j DROP拒绝其余所有 - 使用
ufw更简洁:ufw allow from 192.168.1.5 to any port 8080,然后ufw enable
在 Nginx 层校验请求来源可信
后端可通过检查请求头识别是否来自 Nginx 代理,作为第二道验证。
- Nginx 配置中透传自定义标识:
proxy_set_header X-Forwarded-By "nginx-lb"; - 后端代码(如 Express)中拦截非该标识的请求:
if (req.headers['x-forwarded-by'] !== 'nginx-lb') return res.status(403).end(); - 也可结合
X-Real-IP或X-Forwarded-For做白名单校验,但注意这些头可被伪造,必须配合防火墙使用才可靠
禁用后端服务的默认管理接口和调试端点
很多框架自带健康检查、Actuator、/admin 等路径,一旦暴露极易被探测利用。
- Spring Boot:设
management.endpoints.web.exposure.include=health,info,关闭env、beans等敏感端点 - Node.js:移除未授权的
/status、/debug路由,或统一加中间件鉴权 - Nginx 反向代理时,显式禁止访问这些路径:
location ^~ /actuator/ { return 404; }











