使用 NGINX 流控和 fail2ban 防止 CC 攻击

原创 2017年02月13日 00:09:04

背景知识

CC 攻击

攻击者通过创建大量请求导致服务器资源耗尽,主要针对特定服务接口,属于实现 DoS 攻击的一种方式(DoS 攻击更多是针对网络端口,而不是具体服务接口)。

NGINX 流控

  • limit_req_zone:通过“漏桶”算法限制每个 IP 发起的请求频率。
  • limit_conn_zone:限制每个 IP 发起的连接数。

fail2ban

通过匹配服务器日志操作 iptables 来限制客户端网络连接。

实践配置

NGINX 部分

在 http 部分中配置:

limit_req_zone $binary_remote_addr zone=sym:10m rate=5r/s;
limit_conn_zone $binary_remote_addr zone=conn_sym:10m;

然后在需要流控的 location 部分配置:

limit_req zone=sym burst=5;
limit_conn conn_sym 10;

重启 NGINX 后当有超流客户端请求时将在 NGINX error.log(默认在 /var/log/nginx/error.log) 中看到类似记录:

2017/02/12 18:03:57 [error]15965#15965: *61240 limiting requests, excess: 6.000 by zone "sym", client: 121.41.106.121, server: hacpai.com, request: "GET / HTTP/1.0", host: "hacpai.com"

此时请求已经被 NGINX 限流,但是客户端仍然能够继续发送请求,占用服务器资源。

fail2ban 部分

新建 /etc/fail2ban/jail.d/sym.conf 文件,加入如下内容:

[sym-cc]
enabled  = true
port     = https,http
filter   = sym
logpath  = /var/log/nginx/*error.log
maxretry = 120
findtime = 60
bantime  = 120
action   = iptables-multiport[name=Sym, port="https,http", protocol=tcp]
           sendmail-whois-lines[name=Sym, dest=youremail@gmail.com]

findtime 60 秒内如果有超过 maxretry 120 次匹配到则禁止连接 bantime 120 秒。禁止连接通过操作 iptables 实现 。(要发送邮件,需要安装配置好 sendmail)

重启 fail2ban 后当发生超流时可以在 /var/log/fail2ban.log 中看到类似记录:

2017-02-12 18:01:26,968 fail2ban.actions: WARNING [sym-cc] Ban 121.41.106.121

另外:

  • fail2ban-client statusfail2ban-client status sym-cc 可以查看当前禁止信息
  • fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/sym.conf 可以查看配置匹配情况。

注意事项

fail2ban

  • 服务重启可能较慢,耐心等待
  • findtime 不要小于 60 秒
  • action 用 iptables-multiport 同时设置 HTTPS 和 HTTP
  • 可能需要自己手动加入操作系统启动项

如果 NGINX 开了 access_log,其实也可以简单粗暴一点直接将 fail2ban 配置到访问日志上,这样就不用配置 NGINX 流控模块了,不过缺点是失去了“弹性”。

NGINX

上面提到的 NGINX 流控模块的“弹性”主要指的是 limit_req_zone 模块中 burstnodelay 两个参数的组合使用。

  • rate:按照固定速率“漏请求”给后端服务器
  • burst:可理解为桶大小,能装多少个请求
  • nodelay:带了这个参数的话在桶装不下时将请求“全部倒给”后端服务器;如果不带的话请求还是按照速率慢慢漏

日志清理

需要定时清理 NGINX、fail2ban 日志,防止磁盘空间占用过大。

参考

版权声明:欢迎加入开源技术 Q 群:242561391,让学习和分享成为一种习惯!

Nginx + fail2ban 提高安全性

通过Nginx做web server时,发现error.log中有很多连接尝试,这个时候fail2ban可以比较好的对付这些爬虫,探测程序等。 # Install fail2ban sudo ...
  • oyljerry
  • oyljerry
  • 2015年09月21日 10:59
  • 1781

How to Secure an nginx Server with Fail2Ban

http://snippets.aktagon.com/snippets/554-how-to-secure-an-nginx-server-with-fail2ban Our Se...
  • leonpengweicn
  • leonpengweicn
  • 2015年02月05日 13:25
  • 671

nginx介绍,流量及并发连接数限制,访问控制及ddos预防

本文来源于实验楼linux web运维(nginx)实战课程,原文链接:https://www.shiyanlou.com/courses/95, 对其进行总结回顾,如有侵权,私信删除。 1....
  • u013182675
  • u013182675
  • 2015年12月08日 19:21
  • 12355

nginx的upstream模块数据转发过程及流量控制分析

关于nginx的upstream模块的基本原理及设计,
  • zhaomangzheng
  • zhaomangzheng
  • 2014年04月24日 11:26
  • 3768

Nginx简单防御CC攻击的两种方法

CC攻击可以归为DDoS攻击的一种。他们之间都原理都是一样的,即发送大量的请求数据来导致服务器拒绝服务,是一种连接攻击。CC攻击又可分为代理CC攻击,和肉鸡CC攻击。代理CC攻击是黑客借助代理服务器生...
  • cnbird2008
  • cnbird2008
  • 2013年01月11日 18:13
  • 4085

Nginx流量控制

Nginx ngx_http_limit_req_module模块配置说明
  • a19881029
  • a19881029
  • 2017年11月02日 11:59
  • 444

ssh 和 fail2ban 的安全设置

选择 Debian-8 作为 vps 的操作系统,配置好 ssh 以及安全环境必不可少。选择 fail2ban 软件,通过扫描 log 文件发现恶意攻击者并自动 drop 流量同时通知管理员。...
  • B0rn_T0_W1n
  • B0rn_T0_W1n
  • 2016年09月23日 19:20
  • 1389

通过nginx配置文件抵御攻击,防御CC攻击的经典思路!

0x00 前言 大家好,我们是OpenCDN团队的Twwy。这次我们来讲讲如何通过简单的配置文件来实现nginx防御攻击的效果。 其实很多时候,各种防攻击的思路我们都明白,比如限制IP啊,过滤攻击...
  • TiaoZhanJi_Xian
  • TiaoZhanJi_Xian
  • 2016年02月19日 15:30
  • 3651

nginx防止DDOS攻击配置

防御DDOS是一个系统工程,攻击花样多,防御的成本高瓶颈多,防御起来即被动又无奈。DDOS的特点是分布式,针对带宽和服务攻击,也就 是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架...
  • nohaoye
  • nohaoye
  • 2017年04月01日 16:47
  • 3005

CentOS 安装配置 Fail2Ban

fail2ban是一款实用软件,可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作。1、支持大量服务。如sshd,apache,qmail,proftpd,sasl等等 2...
  • Gekkoou
  • Gekkoou
  • 2016年04月11日 10:25
  • 2651
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用 NGINX 流控和 fail2ban 防止 CC 攻击
举报原因:
原因补充:

(最多只允许输入30个字)