如何限制恶意用户刷站 - Nginx 限速规则

更新日期: 2020-05-04 阅读次数: 21216 字数: 512 分类: Nginx

真实案例

收到短信报警,调用一些三方 API 接口超时。从 Nginx 看,发现是一个调用三方 API 接口被刷。 短时间内超过了百万次。不可避免的影响了正常业务。

刷站请求特征

  • 短时间内,单 IP 针对单一有利用价值接口做大量请求
  • 请求头为非浏览器
  • 请求量暴涨,日请求总量为平时量的 20 倍

解决方法

在 Nginx 上限制单 IP 单位时间的请求数,以及单 IP 的并发连接数。

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=8r/s;

    server {
        location /search/ {
            limit_req zone=one burst=5;
        }

如何估算 limit_req_zone size

One megabyte zone can keep about 16 thousand 64-byte states.

那么 10M 就可以存储 16 万的 IP 统计信息, 这个对普通应用足够了,16 万每秒的 UV,已经屌爆了。

如果 size 的大小如果设置小了, 例如设置成 1M,那么当一秒内的请求 IP 数超过 16000 的时候,超出的 IP 对应的用户看到的均为 503 Service Temporarily Unavailable 页面了。参考, 漏桶算法 Leaky Bucket。 同时,rate 的单位用 r/s 非常合适,如果换成按天,按小时计数,10M 的内存肯定不够用。

如何估算 limit_req_zone rate

首先需要知道的是,普通浏览器的同时并发数量。按照 Dropbox 技术博客里所谈到的,目前主流浏览器限制 AJAX 对同一个子域名的并发连接数是6个。IE 6,IE 7 是两个。

most browsers have a limit of 6 concurrent connections per host name

参考

假设每个请求都能在 100 毫秒内完成,那么每秒的限制应该是 10 个。

基于统计的方法

统计 nginx access.log 中最近5分钟/10分钟的请求 IP top 榜, 超过一定数值自动添加 iptables.

如何监控到

参考

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式