V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Richard14
V2EX  ›  问与答

Nginx 能实现类似于 fail2ban 一样的,限制访问频率的效果吗?

  •  
  •   Richard14 · 2021-02-15 23:13:47 +08:00 · 836 次点击
    这是一个创建于 1136 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学 Nginx,很多东西不是很懂,百度搜了一下没有类似解决方案。

    想要实现的效果是用 NGinx 限制单个 IP 对登录 api 的调用次数,比如每 30 分钟里最多访问五次之类的。类似于 fail2ban,但是不用判断成功与否,到次数都一律屏蔽就对了。百度搜到的大多是每秒钟访问多少次的限制说明,感觉不是很符合需求

    Phant0m
        1
    Phant0m  
       2021-02-16 02:08:30 +08:00 via iPhone
    有限速模块 ngx_http_limit_req_module
    或者 ngx lua 自己写一个
    wakzz
        2
    wakzz  
       2021-02-16 12:52:54 +08:00
    ngx_http_limit_req_module 满足楼主的需求
    LeeReamond
        3
    LeeReamond  
       2021-02-16 17:35:57 +08:00
    @Phant0m
    @wakzz 感谢大佬回复,查了一下发现百度搜到的方法也是这个模块的,但是百度文章一般都没写模块全名,导致学的不是很清楚。我按照网上的配置方法,它需要先在 http 段里启用这个模块,然后再到 server 段里进行配置。我遇到一个问题是我的配置文件都是写在 /etc/nginx/conf.d 里的,但是这里的文件不允许修改 http 段,如果修改 /etc/nginx/nginx.conf 的话,比如加入下面这一句

    limit_req_zone $binary_remote_addr zone=example_com:10m rate=1r/s;

    不是对全局都加上 1r/s 的限制了么,感觉不太对啊。

    另外我在看 nginx.conf 的时候发现 gzip 模块居然默认是开的,但是我反向代理的时候返回的请求从来没被压缩过。。这是怎么回事
    wakzz
        4
    wakzz  
       2021-02-17 13:38:27 +08:00   ❤️ 1
    ```
    http {
    # 区域名称为 limit_ip,大小为 10m,同一个请求 IP 限流为每秒 1 次请求
    limit_req_zone $binary_remote_addr zone=limit_ip:10m rate=1r/s;
    # 设置拒绝请求或延迟处理请求的日志级别
    limit_req_log_level error;
    # 设置拒绝请求的响应状态码
    limit_req_status 503;
    ...

    server {
    ...

    # 仅登录接口做限流
    location /login {
    limit_req zone=limit_ip nodelay;
    ...
    }

    # 其余接口不做限流
    location ... {
    ...
    }
    }
    }
    ```
    LeeReamond
        5
    LeeReamond  
       2021-02-18 18:11:24 +08:00
    @wakzz 感谢回复,已经配置成功,不过想问一下这个是不是还是基于秒内请求的配置,因为我设置了 10r/m 以后,得到的结果并不是一分钟以内访问 10 次就会被 ban,而是每 6 秒访问一次就会被 ban,感觉不是很符合需求啊。因为正常用户也会偶尔一下子多开几个网页,我希望可接受范围内的次数都能正常访问不受影响,他这个好像只要连续开第二个网页一定会 503 的样子
    wakzz
        6
    wakzz  
       2021-02-19 19:51:10 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3004 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 14:43 · PVG 22:43 · LAX 07:43 · JFK 10:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.