如何保护服务器免受暴力破解攻击

你的 Web 应用每天都在面对各种自动化攻击,其中最常见的一种就是 暴力破解登录 —— 黑客会不停尝试不同的用户名和密码,直到猜中为止。
暴力破解不仅有安全风险,还会把你的服务器拖慢,甚至直接干趴。
如果你的站点是通过 Nginx 对外服务,那你已经有了非常好用的防御工具 —— 限流(Rate Limiting)。
这篇文章会手把手教你如何使用 Nginx 的限流功能来减少暴力破解尝试,并附上常用配置和最佳实践。
为什么要做限流?
限流并不是“可选项”,而是非常必要的安全措施,因为:
- 防止暴力破解登录,限制单个 IP 重复尝试密码
- 保护服务器资源,避免被恶意流量拖垮
- 让资源使用更公平,避免某个用户或脚本把服务器占满
- 增强整体安全性,配合 WAF、防火墙、监控构成多层防御
一句话总结:限流 = 防止被薅秃 = 提升系统安全与稳定性
Nginx 的限流功能有哪些?
Nginx 提供两个核心限流模块:
- limit_req_zone + limit_req:限制每秒/每分钟的请求数(常用于登录接口)
- limit_conn_zone + limit_conn:限制同时连接数(常用于下载、流媒体)
防暴力破解主要使用 请求限流。
Step 1:定义一个限流区域(limit_req_zone)
首先需要在 http {} 里定义一个限流区域,用来记录每个客户端(IP)的请求情况。
http {# 定义名为 one 的限流区# 10MB 内存,可存约 16 万个 IPlimit_req_zone $binary_remote_addr zone=one:10m rate=5r/m;server {listen 80;server_name example.com;location /login {# 使用限流区 onelimit_req zone=one burst=10 nodelay;proxy_pass http://backend;}}}
配置说明:
- $binary_remote_addr:按 IP 地址限流
- rate=5r/m:每个 IP 每分钟最多 5 次请求
- burst=10:允许瞬间突发多 10 次(超过就被拒绝)
- nodelay:超过限制就直接返回错误,不排队
对于登录接口,这个限流已经非常严格,可以大幅降低暴力破解成功率。
Step 2:测试限流效果
测试是否生效:
for i in {1..20}; do curl -I http://example.com/login; done当超过限制后,你会看到:
HTTP/1.1 503 Service Temporarily Unavailable说明限流已开始工作。Step 3:自定义限流后的提示页面你可能不想让用户看到默认的 503 错误,这里可以自定义返回内容:server { listen 80; server_name example.com; error_page 503 @custom_limit; location @custom_limit { return 429 "请求太频繁,请稍后再试。"; } location /login { limit_req zone=one burst=10 nodelay; proxy_pass http://backend; }}现在当用户触发限流,会看到更友好的提示。Step 4:更多可选优化与技巧✔ 登录接口:限得越严格越好例如:5 次/分钟burst=5✔ API 接口:限制要合理,不要误伤用户例如:30 次/秒✔ 静态资源不需要限流CSS/JS/图片一般不限制。✔ 白名单 IP(如公司内网、管理员 IP)location /login { allow 192.168.1.100; # 内部管理员 deny all; limit_req zone=one burst=10 nodelay; proxy_pass http://backend;}特别提醒:限流不是万能的,但它是非常重要的一层防御。你还应该:强制 HTTPS,避免密码被截取使用 强密码策略 + 登录失败次数限制配合 验证码 / MFA 多因子认证使用 Fail2ban 等工具根据日志自动封 IP定期监控 Nginx 日志/var/log/nginx/access.log/var/log/nginx/error.log安全不是“做一次就完”,而是“持续防御”。总结:Nginx 限流能帮你:限制登录接口请求频率阻断暴力破解攻击降低恶意流量对服务器的冲击让系统更稳定、更安全只需要几行配置,你的应用安全性就能提升一个档次。说明限流已开始工作。
Step 3:自定义限流后的提示页面
你可能不想让用户看到默认的 503 错误,这里可以自定义返回内容:
server {
listen 80;
server_name example.com;
error_page 503 @custom_limit;
location @custom_limit {
return 429 "请求太频繁,请稍后再试。";
}
location /login {
limit_req zone=one burst=10 nodelay;
proxy_pass http://backend;
}
}
现在当用户触发限流,会看到更友好的提示。
Step 4:更多可选优化与技巧
✔ 登录接口:限得越严格越好
例如:
5 次/分钟
burst=5
✔ API 接口:限制要合理,不要误伤用户
例如:
30 次/秒
✔ 静态资源不需要限流
CSS/JS/图片一般不限制。
✔ 白名单 IP(如公司内网、管理员 IP)
location /login {
allow 192.168.1.100; # 内部管理员
deny all;
limit_req zone=one burst=10 nodelay;
proxy_pass http://backend;
}
特别提醒:
限流不是万能的,但它是非常重要的一层防御。
你还应该:
强制 HTTPS,避免密码被截取
使用 强密码策略 + 登录失败次数限制
配合 验证码 / MFA 多因子认证
使用 Fail2ban 等工具根据日志自动封 IP
定期监控 Nginx 日志
/var/log/nginx/access.log
/var/log/nginx/error.log
安全不是“做一次就完”,而是“持续防御”。
总结:
Nginx 限流能帮你:
限制登录接口请求频率
阻断暴力破解攻击
降低恶意流量对服务器的冲击
让系统更稳定、更安全
只需要几行配置,
你的应用安全性就能提升一个档次。
本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。



