昨天接到客户服务器告警,看到一个nginx+php网站正在遭受CC攻击,导致服务器复制居高不下,正常业务访问大多数时候出现502错误。
CC攻击是 DDOS(分布式拒绝服务) 的一种,DDoS是针对IP的攻击,而CC攻击的是网页。CC攻击来的IP都是真实的,分散的。数据包都是正常的数据包,攻击的请求全都是有效的请求,无法拒绝的请求。服务器可以连接,但是网页就是访问不了,也见不到特别大的异常流量,但是持续时间长,仍能造成服务器无法进行正常连接,危害更大。
查看服务器日志,大量IP访问网站,导致负载居高不下。user-agent也伪装成正常浏览器或者搜索引擎,不能直接通过agent屏蔽。
一、增加nginx防CC限制
在nginx.conf配置的http模块中增加类似如下代码
limit_req_zone $http_x_forwarded_for zone=one:10m rate=3r/s;
limit_conn_zone $http_x_forwarded_for zone=addr:10m;
因为网站使用了cdn,所以限制的时候使用$http_x_forwarded_for参数来获取真实IP。
然后在网站的server模块中添加
limit_req zone=one burst=5 nodelay;
limit_conn addr 3;