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

更新日期: 2019-05-14 阅读次数: 9614 分类: 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.

如何监控到

参考

爱评论不评论

近期节日

2019年08月23日 处暑
2019年09月03日 抗日胜利纪念日
2019年09月08日 白露
2019年09月08日 国际扫盲日
2019年09月10日 教师节
2019年09月13日 中秋节
2019年09月16日 国际臭氧层保护日
2019年09月16日 世界清洁地球日
2019年09月18日 "九一八"事变纪念日
2019年09月20日 国际爱牙日
2019年09月21日 国际和平日
2019年09月22日 世界无车日
查看更多节日