Nginx 常见安全攻击原理与防御配置详解
最好的防御方式就是理解攻击。知己知彼,百战不殆。掌握攻击者的套路才能有效抵御攻击。
一、Nginx 基础概述
Nginx 是一款高性能的 Web 服务器和反向代理服务器。它可以用来搭建网站、做应用服务器,能够处理大量的并发连接和请求。
核心功能
- 静态内容托管:用于网页、图片、文件的静态资源托管。
本文详细介绍了 Nginx 作为 Web 服务器和反向代理的核心功能,分析了常见的安全攻击场景包括反向代理滥用、DDoS 攻击、慢速攻击及网络钓鱼。重点阐述了防御策略,涵盖限流配置、黑名单机制、负载均衡算法选择、SSL/TLS 安全加固、客户端请求限制以及日志监控分析。通过具体的 Nginx 配置示例,指导如何构建安全的 Web 服务架构,强调合法合规使用技术的重要性。

最好的防御方式就是理解攻击。知己知彼,百战不殆。掌握攻击者的套路才能有效抵御攻击。
Nginx 是一款高性能的 Web 服务器和反向代理服务器。它可以用来搭建网站、做应用服务器,能够处理大量的并发连接和请求。
类似于一个快递收发室,指挥流量应该投递到哪个后端服务。
使用 Nginx 作为反向代理服务器,攻击者可以将恶意流量转发到目标服务器。这样能隐藏攻击流量的真实地址,利用被控制的 Nginx 节点进行反射放大攻击或隐藏源 IP。
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
www.example.com:80 的流量全部都会转发到 http://backend_server 服务器上。proxy_set_header X-Real-IP $remote_addr; 设置请求头提供真实来源 IP。X-Forwarded-For 头来隐藏真实 IP,让攻击更难以被追踪和防御。防御建议:
X-Forwarded-For 头的真实性,只信任受信任的内部代理。DDoS(分布式拒绝服务)攻击借助工具瞬间发动大量请求,让服务器资源耗尽,无法正常响应其他用户的请求。
攻击者会编写脚本或利用僵尸网络,在网络上传播开来。病毒运行时可以直接疯狂访问服务器,或者利用 Nginx 提供的反向代理和其支持的 socket、SSL,不断建立握手请求,消耗服务器连接数和带宽。
攻击者保持大量连接打开但不发送完整请求,占用服务器的 Worker 进程。Nginx 默认配置下可能无法有效处理此类攻击。
黑客可以使用 Nginx 伪装成一个合法的网站,诱骗用户输入敏感信息。例如,构造一个伪造的登录页面,让用户输入用户名和密码,然后将这些信息发送给黑客服务器。
这通常是静态托管 + 反向代理功能的组合误用。
server {
listen 80;
server_name example.com;
# 静态网站托管
location / {
root /var/www/mywebsite/dist;
index index.html index.htm;
}
# API 代理转发
location /api {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
/api 路由转发到 api 服务上。这是防御 DDoS 和 CC 攻击的基础手段。
http {
# 定义限流区域,基于二进制远程地址,大小 10MB,速率每秒 5 个请求
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
# 定义 IP 黑名单变量
geo $block {
default 0;
include /path/to/block_ip.txt;
}
server {
listen 80;
location / {
# 应用限流规则,突发 10 个请求,不延迟
limit_req zone=one burst=10 nodelay;
# 检查黑名单
if ($block) {
return 403;
}
proxy_pass http://backend;
}
}
}
limit_req_zone 定义了限流区域,需根据业务实际 QPS 调整 rate。limit_req 指定使用限制规则,burst 允许短时间突发流量,nodelay 表示立即处理超出部分的请求(否则排队)。对于高防场景,建议去掉 nodelay 或直接丢弃。geo $block 是黑名单模块,文件可包含需要屏蔽的 IP 列表。防止单个 IP 占用过多连接资源。
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 10; # 限制每个 IP 同时连接数为 10
proxy_pass http://backend;
}
}
}
假设我有两个后端服务器,通过负载均衡分散压力。
http {
upstream backend {
# 轮询方式的负载均衡
server backend1.example.com;
server backend2.example.com;
}
...
server {
...
}
}
建议:生产环境推荐使用 least_conn 或 hash 结合健康检查,避免单点过载。
确保传输层安全,防止中间人攻击。
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
# 禁用不安全协议
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 隐藏版本号
server_tokens off;
}
防止大文件上传或超长请求头导致资源耗尽。
http {
client_max_body_size 10M; # 限制上传文件大小
client_header_buffer_size 1k; # 限制请求头大小
large_client_header_buffers 4 8k; # 限制大请求头缓冲区
keepalive_timeout 65; # 长连接超时时间
}
开启详细日志以辅助安全审计。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
定期分析日志,识别异常 IP、高频访问路径和错误率突增情况。
真正有不良居心的人,总是会有更复杂的攻击方法。这些攻击行为都是违法的,建议大家学会以后用于合法的安全测试和防御建设。
本文的核心目的是教大家学会 Nginx 的常用配置方法和安全加固思路。在实际生产环境中,应结合 WAF(Web 应用防火墙)、CDN 清洗服务等综合手段构建纵深防御体系。务必遵守法律法规,切勿利用所学知识从事非法活动。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online