Nginx 限流:如何保护你的服务器免受暴力破解攻击
|
admin
2025年11月25日 11:27
本文热度 648
|
你的 Web 应用每天都在面对各种自动化攻击,其中最常见的一种就是 暴力破解登录 —— 黑客会不停尝试不同的用户名和密码,直到猜中为止。
暴力破解不仅有安全风险,还会把你的服务器拖慢,甚至直接干趴。
如果你的站点是通过 Nginx 对外服务,那你已经有了非常好用的防御工具 —— 限流(Rate Limiting)。
这篇文章会手把手教你如何使用 Nginx 的限流功能来减少暴力破解尝试,并附上常用配置和最佳实践。
为什么要做限流?
限流并不是“可选项”,而是非常必要的安全措施,因为:
一句话总结:
限流 = 防止被薅秃 = 提升系统安全与稳定性
Nginx 的限流功能有哪些?
Nginx 提供两个核心限流模块:
limit_req_zone + limit_req:限制每秒/每分钟的请求数(常用于登录接口)
limit_conn_zone + limit_conn:限制同时连接数(常用于下载、流媒体)
防暴力破解主要使用 请求限流。
Step 1:定义一个限流区域(limit_req_zone)
首先需要在 http {} 里定义一个限流区域,用来记录每个客户端(IP)的请求情况。
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/m;
server { listen 80; server_name example.com;
location /login {
limit_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:更多可选优化与技巧
✔ 登录接口:限得越严格越好
例如:
✔ API 接口:限制要合理,不要误伤用户
例如:
✔ 静态资源不需要限流
CSS/JS/图片一般不限制。
✔ 白名单 IP(如公司内网、管理员 IP)
location /login { allow 192.168.1.100; deny all; limit_req zone=one burst=10 nodelay; proxy_pass http://backend;}
特别提醒:
限流不是万能的,但它是非常重要的一层防御。
你还应该:
安全不是“做一次就完”,而是“持续防御”。
总结:
Nginx 限流能帮你:
限制登录接口请求频率
阻断暴力破解攻击
降低恶意流量对服务器的冲击
让系统更稳定、更安全
只需要几行配置,
你的应用安全性就能提升一个档次。
该文章在 2025/11/25 11:27:04 编辑过