Nginx反向代理和负载均衡的安全加固方案

 更新时间:2026年03月10日 09:25:06   作者:BullSmall  
这篇文章给大家介绍了Nginx反向代理和负载均衡的安全加固方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

针对 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

总结

  1. 反向代理核心:隐藏后端信息、限制请求范围、防止缓存污染、验证 Host 头,避免后端服务暴露;
  2. 负载均衡核心:隔离后端节点(仅内网访问)、强化健康检查、控制流量速率 / 并发,防止 DDoS 穿透到所有节点;
  3. 通用加固:端到端 HTTPS 加密、详细审计日志、最小权限配置,形成代理→后端的完整安全链路。

到此这篇关于Nginx(反向代理、负载均衡)安全加固的文章就介绍到这了,更多相关nginx安全加固内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx内网环境开启https双协议的实现

    Nginx内网环境开启https双协议的实现

    本文主要介绍了Nginx内网环境开启https双协议,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • 详解如何设置Nginx实现内外网端口映射

    详解如何设置Nginx实现内外网端口映射

    在 Nginx 中实现内外网端口映射是一种常见的做法,本文详细介绍如何设置 Nginx 实现内外网端口映射,有需要的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • windows系统安装配置nginx环境

    windows系统安装配置nginx环境

    这篇文章介绍了windows系统安装配置nginx环境的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Nginx与Lua灰度发布的实现

    Nginx与Lua灰度发布的实现

    这篇文章主要介绍了Nginx与Lua灰度发布的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Nginx配置Https安全认证的实现

    Nginx配置Https安全认证的实现

    为了保障应用的安全性,我们在架构网络层的时候需要采用HTTPS协议。本文介绍了Nginx配置Https安全认证的实现,分享给大家,感兴趣的可以了解一下
    2021-05-05
  • 利用Nginx实现URL重定向的简单方法

    利用Nginx实现URL重定向的简单方法

    使用Nginx的重定向功能时,除了可以重定向到新域名,还可以将请求重定向到特定的协议上,下面这篇文章主要给大家介绍了关于如何利用Nginx实现URL重定向的简单方法,需要的朋友可以参考下
    2022-04-04
  • 基于nginx实现上游服务器动态自动上下线无需reload的实现方法

    基于nginx实现上游服务器动态自动上下线无需reload的实现方法

    这篇文章主要介绍了基于nginx实现上游服务器动态自动上下线无需reload,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Nginx + Tomcat实现请求动态数据和请求静态资源的分离详解

    Nginx + Tomcat实现请求动态数据和请求静态资源的分离详解

    这篇文章主要给大家介绍了关于Nginx + Tomcat实现请求动态数据和请求静态资源的分离的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 一文了解nginx中的signal处理机制

    一文了解nginx中的signal处理机制

    nginx利用信号处理机制,可以捕获和处理各种信号,本文主要介绍了nginx中的signal处理机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • nginx部署前端项目location时root和alias配置指南

    nginx部署前端项目location时root和alias配置指南

    nginx指定文件路径有两种方式root和alias,下面这篇文章主要给大家介绍了关于nginx部署前端项目location时root和alias配置的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01

最新评论