针对 nginx 反向代理和负载均衡场景的安全加固,核心是保护代理链路、控制后端服务暴露、防止流量攻击和强化节点安全。下面我会结合反向代理 / 负载均衡的核心特性,给出可落地的加固方案,包含具体配置和权限设置。
一、反向代理安全加固
反向代理的核心风险是:代理配置不当导致后端服务暴露、请求伪造、缓存攻击、ddos 穿透到后端等。
1. 隐藏后端服务信息(核心)
避免通过响应头泄露后端服务器的 ip、版本等信息:
http {
# 1. 隐藏 nginx 自身版本(基础加固)
server_tokens off;
# 2. 清除/重写后端响应头(防止泄露后端信息)
proxy_hide_header x-powered-by; # 隐藏后端语言(如 php/java)标识
proxy_hide_header server; # 隐藏后端服务器版本
proxy_hide_header x-aspnet-version;
# 3. 自定义响应头(可选)
add_header server "proxy server" always;
# 4. 禁止传递客户端 ip 外的敏感头
proxy_set_header accept-encoding ""; # 防止压缩攻击
proxy_set_header x-real-ip $remote_addr; # 仅传递真实ip(按需)
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
}2. 限制代理请求范围(防止越权访问后端)
仅代理指定路径 / 域名,禁止访问后端敏感接口:
server {
listen 443 ssl;
server_name proxy.example.com;
# 仅代理 /api 路径到后端
location /api/ {
proxy_pass http://backend_server/;
proxy_set_header host $host;
proxy_connect_timeout 5s; # 缩短连接超时,防止挂起
proxy_read_timeout 10s;
proxy_send_timeout 10s;
# 禁止访问后端敏感路径
if ($request_uri ~* "/admin|/config|/sql|/phpmyadmin") {
return 403;
}
}
# 禁止直接访问代理服务器的其他路径
location / {
return 403;
}
}3. 防止请求伪造(csrf/host 头攻击)
server {
# 1. 验证 host 头,防止 host 头伪造
if ($host !~ ^(proxy.example.com|www.example.com)$) {
return 403;
}
# 2. 限制请求方法(仅允许必要的方法)
if ($request_method !~ ^(get|post|head)$) {
return 405;
}
# 3. 添加 csrf 防护头(针对后端接口)
add_header x-csrf-protection "1; mode=block" always;
}4. 代理缓存安全(防止缓存污染)
若启用代理缓存,需避免缓存敏感数据:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location /api/ {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 1. 不缓存认证/敏感请求
proxy_cache_bypass $http_cookie $http_authorization;
proxy_no_cache $http_cookie $http_authorization;
# 2. 缓存文件权限加固
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
# 3. 防止缓存键污染
proxy_cache_key "$scheme$request_method$host$request_uri";
}
}
}
# 缓存目录权限加固(仅 nginx 用户可访问)
chown -r nginx:nginx /var/cache/nginx
chmod -r 700 /var/cache/nginx二、负载均衡安全加固
负载均衡的核心风险是:节点暴露、流量不均导致单点过载、健康检查漏洞、ddos 攻击穿透到所有节点。
1. 后端节点隐藏与隔离
http {
# 1. 定义后端节点池(仅内网可访问,禁止公网暴露)
upstream backend_pool {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
# 负载均衡算法(默认轮询,可选更安全的方式)
ip_hash; # 绑定ip到固定节点,防止会话劫持(适合有状态服务)
# least_conn; # 最少连接数,防止节点过载
# 2. 启用慢启动(防止故障恢复后瞬间过载)
slow_start 60s;
# 3. 禁用不健康节点自动恢复(需手动确认)
# down; # 标记节点为永久下线
}
server {
listen 443 ssl;
server_name lb.example.com;
location / {
proxy_pass http://backend_pool;
# 4. 禁止客户端直接访问后端节点ip
if ($http_referer ~* "192.168.1.") {
return 403;
}
}
}
}2. 健康检查加固(防止流量路由到故障节点)
nginx 原生健康检查基础版,进阶可使用 ngx_http_upstream_module 或第三方模块(如 nginx-plus):
upstream backend_pool {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
# 基础健康检查(通过失败次数判断)
# max_fails:失败3次标记为不可用
# fail_timeout:30秒内不重试故障节点
}
# 进阶:主动健康检查(需 nginx plus 或 openresty)
# upstream backend_pool {
# zone backend 64k;
# server 192.168.1.10:8080;
# server 192.168.1.11:8080;
# health_check interval=5s fails=2 passes=2 uri=/health;
# }3. 流量控制(防止 ddos 穿透到后端)
限制单 ip / 单节点的并发和请求速率,保护后端集群:
http {
# 1. 限制单ip并发连接(负载均衡层拦截)
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 50; # 单ip最大50个并发
# 2. 限制请求速率(防cc攻击)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
listen 443 ssl;
server_name lb.example.com;
location / {
# 速率限制:突发20个请求,超出返回503
limit_req zone=req_limit burst=20 nodelay;
# 3. 限制后端节点的最大连接数
proxy_pass http://backend_pool;
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
proxy_buffering on; # 启用缓冲,减少后端压力
}
}
}4. 负载均衡节点权限加固
# 1. 负载均衡服务器仅开放 80/443 端口(防火墙) firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp firewall-cmd --reload # 2. 禁止负载均衡服务器访问互联网(仅内网通向后端) # 编辑 /etc/sysctl.conf,禁用ip转发(防止成为跳板) echo "net.ipv4.ip_forward = 0" >> /etc/sysctl.conf sysctl -p # 3. 后端节点仅允许负载均衡服务器访问 # 在后端节点防火墙添加规则(以 firewalld 为例) firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="负载均衡ip" port protocol="tcp" port="8080" accept' firewall-cmd --permanent --add-port=8080/tcp --remove-port=8080/tcp # 禁止其他ip访问 firewall-cmd --reload
三、通用加固(反向代理 + 负载均衡)
1. https 端到端加密(代理→后端也加密)
避免代理与后端之间的明文传输:
upstream backend_pool {
# 后端节点使用 https
server 192.168.1.10:443;
server 192.168.1.11:443;
}
server {
listen 443 ssl;
server_name lb.example.com;
location / {
proxy_pass https://backend_pool;
# 验证后端证书(防止中间人攻击)
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_ssl_trusted_certificate /etc/nginx/ssl/backend_ca.crt;
proxy_ssl_session_reuse on;
}
}2. 审计日志加固
记录所有代理 / 负载均衡的访问日志,便于溯源攻击:
http {
log_format proxy_log '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$upstream_addr $upstream_status $upstream_response_time';
server {
listen 443 ssl;
server_name lb.example.com;
# 访问日志记录详细信息
access_log /var/log/nginx/proxy_access.log proxy_log;
error_log /var/log/nginx/proxy_error.log warn;
}
}
# 日志权限加固
chown -r nginx:nginx /var/log/nginx
chmod -r 700 /var/log/nginx四、验证加固效果
# 1. 检查配置语法 nginx -t # 2. 重启 nginx systemctl restart nginx # 3. 验证后端节点是否暴露 curl -i http://lb.example.com # 响应头不应包含后端节点ip/版本 # 4. 验证速率限制 ab -n 100 -c 60 http://lb.example.com/ # 模拟高并发,应返回503 # 5. 检查日志是否正常记录 tail -f /var/log/nginx/proxy_access.log
总结
- 反向代理核心:隐藏后端信息、限制请求范围、防止缓存污染、验证 host 头,避免后端服务暴露;
- 负载均衡核心:隔离后端节点(仅内网访问)、强化健康检查、控制流量速率 / 并发,防止 ddos 穿透到所有节点;
- 通用加固:端到端 https 加密、详细审计日志、最小权限配置,形成代理→后端的完整安全链路。
到此这篇关于nginx(反向代理、负载均衡)安全加固的文章就介绍到这了,更多相关nginx安全加固内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论