找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2672

积分

0

好友

343

主题
发表于 9 小时前 | 查看: 1| 回复: 0

在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安全配置案例。安全是一个持续的过程,建议根据自身的业务特点和安全需求,组合使用这些配置,并定期进行安全审计与配置更新。如果你想了解更多服务器与架构的实战经验,欢迎在云栈社区与大家一起交流探讨。




上一篇:Linux内核项目正式制定继任计划,确保后Linus时代平稳过渡
下一篇:AI修仙模拟器cultivation-world-simulator:LLM驱动的开放世界与上帝视角玩法
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-7 19:24 , Processed in 0.308372 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表