在Web服务部署中,Nginx不仅是高效的负载均衡器与反向代理,更是抵御外部攻击的第一道坚实防线。通过合理的配置,它可以有效拦截恶意流量,保护后端接口与服务器的安全。本文将分享8个实用的Nginx安全防护配置案例,涵盖从信息隐藏、访问控制到DDoS缓解的多个层面,帮助你构建更安全的服务入口。
1. 基础防护:隐藏服务器标识(防信息收集)
核心目标:彻底隐藏Nginx版本号,移除或篡改响应头中的Server字段,防止攻击者通过nmap等工具探测版本并发起针对性攻击。
http {
# 1. 隐藏 Nginx 版本号(核心指令)
server_tokens off;
# 2. 移除或替换响应头中的 Server 字段(需安装 ngx_http_headers_more 模块)
# 若未安装该模块,可跳过此步;安装后可直接清空或伪装成其他服务器
more_set_headers "Server: WebServer";
# 3. 禁止在错误页面中显示 Nginx 版本(如 404/502 页面)
# 配合 server_tokens off 生效,确保错误页无版本泄露
fastcgi_hide_header Server;
proxy_hide_header Server;
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend_upstream;
}
}
}
2. 接口访问控制:仅允许内网 + 指定公网 IP 访问
核心目标:限制核心接口仅对内网服务和指定公网IP(如公司办公网、合作方服务器)开放,拦截其他公网IP的非法访问。
http {
# 定义允许访问的 IP 白名单(内网段 + 指定公网 IP)
# 内网段示例:192.168.0.0/16(局域网)、10.0.0.0/8(内网)、172.16.0.0/12(内网)
# 公网 IP 示例:203.0.113.100(公司办公网出口 IP)、198.51.100.200(合作方服务器 IP)
geo $allowed_api_ip {
default 0;
127.0.0.1 1;
192.168.0.0/16 1;
10.0.0.0/8 1;
203.0.113.100 1;
198.51.100.200 1;
}
server {
listen 80;
server_name api.example.com;
location /api/ {
# 校验白名单,非白名单 IP 直接返回 403
if ($allowed_api_ip = 0) {
return 403 Forbidden;
}
# 传递真实 IP 给后端(若有多层代理,需配合 realip 模块)
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend_upstream;
}
}
}
3. 敏感接口防护:禁止外部访问管理类接口
核心目标:管理类接口(如后台登录、数据删改、配置管理)仅对内网开放,完全禁止公网IP访问,从源头规避后台被暴力破解的风险。
server {
listen 80;
server_name api.example.com;
# 精确匹配管理接口(如 /admin/、/api/admin/、/manage/)
# 优先匹配精确路径,避免误拦截普通接口
location ^~ /admin/ {
# 仅允许内网访问,公网直接拒绝
allow 127.0.0.1;
allow 192.168.0.0/16;
allow 10.0.0.0/8;
deny all;
# 匹配到公网 IP 时,返回 403(也可返回 404 伪装接口不存在)
return 403 Forbidden;
}
# 管理类 API 接口防护
location ^~ /api/admin/ {
allow 192.168.1.0/24;
deny all;
# 伪装成接口不存在,迷惑攻击者
return 404 Not Found;
}
# 普通业务接口正常放行
location /api/ {
proxy_pass http://backend_upstream;
}
}
4. 高并发防护:限制请求频率与并发数(防接口刷爆)
核心目标:通过限频(每秒请求数)与限并发(同时连接数)双重控制,抵御接口刷量、CC攻击,避免后端服务因过载崩溃。这是保障Nginx作为反向代理稳定性的关键配置。
http {
# 1. 定义限频规则(基于客户端真实 IP)
# zone=api_limit:10m :创建名为 api_limit 的共享内存区,大小 10MB(可存储约 16 万 IP 记录)
# rate=20r/s :限制单个 IP 每秒最多 20 个请求(可根据业务调整)
limit_req_zone $remote_addr zone=api_limit:10m rate=20r/s;
# 2. 定义限并发规则(基于客户端真实 IP)
# zone=api_conn:10m :创建名为 api_conn 的共享内存区
# limit_conn :限制单个 IP 同时最多 10 个连接
limit_conn_zone $remote_addr zone=api_conn:10m;
limit_conn api_conn 10;
server {
listen 80;
server_name api.example.com;
location /api/ {
# 应用限频规则
# burst=40 :允许 40 个突发请求排队(超过 rate 的请求先排队,不直接拒绝)
# nodelay :排队请求不延迟处理,避免用户等待超时
limit_req zone=api_limit burst=40 nodelay;
# 应用限并发规则(与全局 limit_conn 配合)
limit_conn api_conn 10;
# 限流/限并发后的返回状态码(默认 503,可改为 429 更标准)
limit_req_status 429;
limit_conn_status 429;
# 后端代理配置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://backend_upstream;
}
}
}
5. 请求方法防护:仅放行合法 HTTP 方法(防恶意试探)
核心目标:限制接口仅接受GET、POST等业务必需的请求方法,拦截PUT、DELETE、OPTIONS、TRACE等易被用于攻击或探测的方法,减少攻击面。
server {
listen 80;
server_name api.example.com;
# 仅允许 GET、POST、HEAD 方法,其余直接返回 405(方法不允许)
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 405 Method Not Allowed;
}
# 针对接口目录生效
location /api/ {
proxy_pass http://backend_service;
proxy_set_header Host $host;
}
}
6. 慢速攻击防护:抵御 Slowloris / 慢速 POST 等 DDoS 攻击
核心目标:拦截慢速发送请求头或请求体的恶意连接,避免攻击者长期占用Nginx连接数,导致合法请求无法处理。
http {
# 全局配置,适用于所有服务器
# 1. 限制请求头读取超时时间(10秒内未读完则断开)
client_header_timeout 10s;
# 2. 限制请求体读取超时时间(10秒内未读完则断开)
client_body_timeout 10s;
# 3. 限制连接空闲超时时间(60秒无活动则断开)
keepalive_timeout 60s;
# 4. 限制请求头缓冲区大小(超过则拒绝,防超大头攻击)
client_header_buffer_size 4k;
large_client_header_buffers 4 8k;
server {
location /api/ {
proxy_pass http://backend_service;
# 后端响应超时时间(避免被后端慢接口拖死)
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
}
}
}
7. HTTPS 强安全防护:禁用弱协议与强制 HSTS
核心目标:关闭不安全的TLS协议,禁用弱加密算法,同时通过HSTS强制浏览器长期使用HTTPS,防止HTTPS降级攻击和中间人攻击。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2; # 兼容 IPv6
server_name api.example.com;
# 证书配置(替换为您的实际路径)
ssl_certificate /etc/nginx/certs/api.crt; # 公钥证书
ssl_certificate_key /etc/nginx/certs/api.key; # 私钥文件
ssl_trusted_certificate /etc/nginx/certs/ca.crt; # 根证书(可选,用于OCSP装订)
# 1. 仅启用安全的 TLS 协议(禁用 TLS1.0/1.1、SSLv3 等)
ssl_protocols TLSv1.2 TLSv1.3;
# 2. 优先使用服务器端加密套件,禁用弱加密算法(MD5/SHA1/3DES 等)
ssl_prefer_server_ciphers on;
# 仅保留 AES-GCM/CHACHA20 等强加密套件,适配 TLS1.2/TLS1.3
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
# 3. HSTS 配置(强制浏览器长期使用 HTTPS,防降级攻击)
# max-age=31536000:1年有效期(单位秒)
# includeSubDomains:所有子域名均生效
# preload:提交至浏览器 HSTS 预加载列表(需提前在 https://hstspreload.org/ 提交)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 4. 性能与安全优化(可选但推荐)
ssl_session_cache shared:SSL:10m; # 共享 SSL 会话缓存,提升握手速度
ssl_session_timeout 1d; # 会话超时时间 1 天
ssl_session_tickets off; # 禁用会话票据,防止会话劫持
ssl_stapling on; # 启用 OCSP 装订,减少证书验证耗时
ssl_stapling_verify on; # 验证 OCSP 响应有效性
resolver 8.8.8.8 8.8.4.4 valid=300s; # DNS 解析器(用于 OCSP 验证)
resolver_timeout 5s; # DNS 解析超时时间
# 5. 后端代理配置(根据实际业务调整)
location / {
proxy_pass http://backend_upstream;
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;
}
# 强制 HTTP 跳转至 HTTPS(配套配置,避免 HTTP 入口)
server {
listen 80;
listen [::]:80;
server_name api.example.com;
return 301 https://$host$request_uri;
}
}
8. 流量联动防护:透明转发至 WAF 进行深度检测
核心目标:将Nginx作为流量入口,将所有请求透明转发至专业的Web应用防火墙(WAF)。利用WAF的规则引擎对流量进行深度清洗,拦截SQL注入、XSS、文件上传等复杂攻击,实现“Nginx抗并发 + WAF做检测”的分层防御架构,这正是构建高安全Web安全体系的有效实践。
场景 A:Nginx前置,WAF串联模式(标准架构)
所有公网流量先经过Nginx,再转发给WAF,WAF检测通过后再回源到后端业务。
http {
# 1. 定义 WAF 服务器地址
upstream waf_servers {
server 10.0.0.5:8080; # WAF 节点 1(内网 IP)
server 10.0.0.6:8080; # WAF 节点 2(高可用)
keepalive 32;
}
server {
listen 443 ssl http2;
server_name api.example.com;
# SSL 终结(证书卸载在 Nginx)
ssl_certificate /etc/nginx/certs/api.crt;
ssl_certificate_key /etc/nginx/certs/api.key;
# ... 其他 HTTPS 强安全配置(如禁用弱协议)
location / {
# 2. 透传真实客户端 IP 给 WAF(关键)
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;
proxy_set_header Host $host;
# 3. 将流量转发至 WAF 集群进行检测
proxy_pass http://waf_servers;
# 4. 超时配置(根据 WAF 检测性能调整)
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
}
}
}
场景 B:仅转发敏感接口至 WAF(性能优化)
对于静态资源直接由Nginx回源,仅将动态接口转发给WAF检测,以节省WAF资源。
server {
listen 443 ssl http2;
server_name api.example.com;
# ... SSL 配置省略
# 1. 静态资源:直接回源,不经过 WAF
location ~* \.(jpg|png|gif|js|css)$ {
proxy_pass http://backend_upstream;
expires 7d;
}
# 2. 动态接口:强制经过 WAF 检测
location /api/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 转发至 WAF
proxy_pass http://waf_servers;
}
}
以上就是8个常见的Nginx安全配置案例。安全是一个持续的过程,建议根据自身的业务特点和安全需求,组合使用这些配置,并定期进行安全审计与配置更新。如果你想了解更多服务器与架构的实战经验,欢迎在云栈社区与大家一起交流探讨。