Nginx环境中的防火墙是系统层、Nginx模块与WAF构成的分层防线,IP控制需协同操作系统防火墙(限端口、限源IP、禁ICMP)、Nginx access模块(按location白名单/黑名单)、real_ip配置(防代理污染)及CORS、限流、安全头等实现纵深防御。

在 Nginx 环境中,“防火墙”不是单一组件,而是由系统层、Nginx 自身模块和可选 WAF 共同构成的分层防线。IP 控制是其中最基础也最关键的逻辑门禁,必须与其它防护机制协同设计,才能真正筑牢边界安全。
用操作系统防火墙守好入口大门
这是第一道物理/网络层屏障,目标是减少无效流量触达 Nginx 进程:
- 只开放 80 和 443 端口,其他端口默认拒绝;管理通道(如 SSH)单独放行且限定源 IP 段
- 对高敏感服务(如运维后台、API 管理接口),直接在 ufw 或 iptables 中限制允许访问的公网 IP 范围
- 禁用 ICMP 响应(ping),降低暴露面;避免使用过于激进的 default deny 策略,确保出站连接和已建立会话不受影响
用 Nginx access 模块做精准路径级门禁
当流量穿过系统防火墙后,Nginx 的 allow/deny 指令承担细粒度控制职责,必须按业务路径收敛配置:
- 白名单必须绑定具体
location,例如/api/internal/只允许内网段:location /api/internal/ { allow 10.0.0.0/8; allow 172.16.0.0/12; deny all; proxy_pass http://internal-svc; } - 合作方接口如
/api/partner/应精确到固定公网 IP:location /api/partner/ { allow 203.0.113.45; allow 203.0.113.46; deny all; } - 每条
allow独立成行,deny all必须放在最后且不可省略——否则未匹配请求将默认放行 - 禁止直接访问敏感路径:
location /\.git { deny all; }或location ~ ^/wp-(admin|config) { deny all; }
确保真实 IP 可靠获取,避免代理污染
若 Nginx 前有 CDN、SLB 或云负载均衡,$remote_addr 是代理 IP,直接用于访问控制会完全失效:
- 启用
real_ip_header X-Forwarded-For;并通过set_real_ip_from明确指定可信代理网段(如云厂商 SLB 地址段) - 或用
geo模块预定义可信 IP 列表:geo $real_ip_allowed { default 0; 10.20.0.0/16 1; 192.168.100.0/24 1; }
再在 location 中判断:if ($real_ip_allowed = 0) { return 403; }
联动 CORS、限流与安全头实现纵深防御
IP 控制不能孤立存在,需与其它网关策略形成闭环:
- 对白名单内路径(如内网管理接口),可动态放宽
Access-Control-Allow-Origin;对外部路径则严格限制或关闭 CORS - 在 IP 允许基础上叠加限速:对
/api/login使用limit_req zone=login burst=5 nodelay;,按$binary_remote_addr$uri组合计数防暴力枚举 - 所有响应统一加安全头:
add_header X-Frame-Options "DENY";add_header X-Content-Type-Options "nosniff";add_header Content-Security-Policy "default-src 'self';";
不复杂但容易忽略。


















