你的 Web 应用每天都在面对各种自动化攻击,其中最常见的一种就是 暴力破解登录 —— 黑客会不停尝试不同的用户名和密码,直到猜中为止。
暴力破解不仅有安全风险,还会把你的服务器拖慢,甚至直接干趴。
如果你的站点是通过 Nginx 对外服务,那你已经有了非常好用的防御工具 —— 限流(Rate Limiting)。
这篇文章会手把手教你如何使用 Nginx 的限流功能来减少暴力破解尝试,并附上常用配置和最佳实践。
限流并不是“可选项”,而是非常必要的安全措施,因为:
一句话总结: 限流 = 防止被薅秃 = 提升系统安全与稳定性
Nginx 提供两个核心限流模块:
防暴力破解主要使用 请求限流。
首先需要在 http {} 里定义一个限流区域,用来记录每个客户端(IP)的请求情况。
http {
# 定义名为 one 的限流区
# 10MB 内存,可存约 16 万个 IP
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/m;
server {
listen 80;
server_name example.com;
location /login {
# 使用限流区 one
limit_req zone=one burst=10 nodelay;
proxy_pass http://backend;
}
}
}配置说明:
$binary_remote_addr:按 IP 地址限流rate=5r/m:每个 IP 每分钟最多 5 次请求burst=10:允许瞬间突发多 10 次(超过就被拒绝)nodelay:超过限制就直接返回错误,不排队对于登录接口,这个限流已经非常严格,可以大幅降低暴力破解成功率。
测试是否生效:
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; } 特别提醒: 限流不是万能的,但它是非常重要的一层防御。 你还应该:
/var/log/nginx/access.log/var/log/nginx/error.log安全不是“做一次就完”,而是“持续防御”。
只需要几行配置, 你的应用安全性就能提升一个档次。 END
本文分享自 DevOps和k8s全栈技术 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!