404攻击,就是不存在的文件攻击了。攻击者大量的向服务器请求不存在的每次都不相同的链接,cdn/waf将会将所有的请求回源,因为cdn并没有此请求的cache,也无法验证此请求的合法性。404攻击基本可以穿透所有的cdn,当然,也包括cf。
一个404请求无所谓,但是,如果同一时间几千几万个ip并发过来然后每秒10次8次,源服务器也就被回源崩了。(不要对cf等的rate limit有幻想,它只是限制单ip的频率。) 现在的后端系统,比如各php框架和应用,喜欢将所有请求接管,包括404,而不是使用nginx等直接处理,更上雪上加霜。
基于上面的分析,404是无法在cdn层面用普通方式拦截的,所以,必须在源服务器上进行处理,在源服务器还没有被打死前,发现404攻击,然后做出相应对策。在套用cf的前提下,就是直接启用5秒盾,识别不了,就全拦掉,总比挂了好。
下面的代码可以参考:

main.go

这个一个后台进程,它建立一个本地web服务器, http://127.0.0.1:8080/handle_404,如果应用系统接收到404时,就调用此链接。这个进程,它会判断404的频率,在例子中,10秒内超过了100次404,就会激活5秒盾5分钟。
之所以将其单独出来而不是写入应用逻辑,是为了结构和通用性方面的原因。
比如,如果nginx没有特殊设定, 那么可以在nginx的location中,将404错误重写到此链接,而在本博客的typecho中,当捕获到错误时,只需要修改/usr/themes/default/404.php即可:

$url = "http://172.17.0.1:8080/handle_404";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);
?>

好了,这下基本随便404了,超了100/10就5秒盾挡一会,完事。。 当然,我设置的10秒100次其实限制很紧,稍微大些都不是问题,因为404攻击会远远超过这频率,大一点防止误报更好。

标签: none

添加新评论

*如果只是需要与我沟通联系,请telegram @ohyessure, 而不要用评论方式,因为没有你的个人资料,我无法回复及联络你。