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

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

NGINX 流控
limit_req_zone:通过“漏桶”算法限制每个 IP 发起的请求频率。

limit_conn_zone:限制每个 IP 发起的连接数。

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

实践配置
NGINX 部分
在 http 部分中配置:

limit_req_zone binaryremoteaddrzone=sym:10mrate=5r/s;limitconnzone b i n a r y r e m o t e a d d r z o n e = s y m : 10 m r a t e = 5 r / s ; l i m i t c o n n z o n e binary_remote_addr zone=conn_sym:10m;12
然后在需要流控的 location 部分配置:

limit_req zone=sym burst=5; limit_conn conn_sym 10;12
重启 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”1
此时请求已经被 NGINX 限流,但是客户端仍然能够继续发送请求,占用服务器资源。

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

[sym-cc]enabled = trueport = https,httpfilter = symlogpath = /var/log/nginx/*error.logmaxretry = 120findtime = 60bantime = 120action = iptables-multiport[name=Sym, port=”https,http”, protocol=tcp] sendmail-whois-lines[name=Sym, dest=youremail@gmail.com]12345678910
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.1211
另外:

fail2ban-client status、fail2ban-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 模块中 burst 和 nodelay 两个参数的组合使用。

rate:按照固定速率“漏请求”给后端服务器

burst:可理解为桶大小,能装多少个请求

nodelay:带了这个参数的话在桶装不下时将请求“全部倒给”后端服务器;如果不带的话请求还是按照速率慢慢漏

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

参考
CC *

DoS *

Module ngx_http_limit_req_module

Module ngx_http_limit_conn_module

fail2ban

### 使用 Fail2ban 防止 DDoS 攻击的最佳实践 #### 修改默认设置增加防护力度 为了增强 Fail2ban 对 DDoS 的防御能力,建议调整 `/etc/fail2ban/jail.conf` 文件中的参数来适应特定环境的需求。例如,可以通过修改 `bantime` 参数延长封禁时间,使得攻击者的 IP 地址被更长时间阻止访问服务[^4]。 ```bash sed -i "234a bantime = 7200" /etc/fail2ban/jail.conf ``` 这行命令会将失败登录后的封禁时间设定为两小时。 #### 自定义过滤器检测异常行为 创建自定义的过滤规则可以帮助识别并响应针对 Web 应用程序或其他网络服务的大规模请求模式。这些规则可以根据日志文件中记录的信息触发相应的行动,比如当发现短时间内来自同一源地址过多连接尝试时就立即采取措施加以限制。 对于 HTTP/HTTPS 量而言,在 Apache 或 Nginx 日志基础上构建专门用于抵御层七 (L7) 类型 DoS/DDoS 的 filter 是非常有效的策略之一;而对于 SSH、FTP 等协议,则应关注其特有的认证过程相关事件作为监重点对象。 #### 调整 maxretry findtime 值优化反应速度 适当调高最大重试次数 (`maxretry`) 并缩短查找窗口期(`findtime`) ,可以让系统更快地察觉到潜在威胁并作出回应。这样即使面对较为隐蔽或是经过伪装处理过的恶意量也能及时做出有效拦截动作而不至于让真正合法用户的正常操作受到影响。 需要注意的是,虽然提高敏感度有助于提升安全性,但也可能带来误判风险——即把正常的高频次但良性的互动错认为是攻击的一部分而错误封锁了无辜访客。因此找到两者之间的平衡至关重要。 #### 定期更新规则集保持有效性 随着新型态网络安全挑战不断涌现以及现有技术手段的发展变化,持续维护升级所使用的防护机制同样不可忽视。官方仓库里定期会有新的改进版本发布出来供社区成员选用,同时也鼓励管理员根据自己站点的具体情况定制专属方案以获得最佳效果。 完成上述配置更改之后记得要重启 Fail2ban 来使新设置生效[^1]: ```bash systemctl restart fail2ban ``` 尽管如此,仍需认识到单靠 Fail2ban 这样的工具并不能完全解决所有的 DDoS 问题,特别是在面临高度复杂化、分布式的大型攻击面前存在一定的局限性[^2]。综合运用多种安全措施才是保障在线资产稳定运行的关键所在。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值