背景
当网站在上线运行后,总会受到各种攻击,包括但不限于爬取内容的爬虫、扫码漏洞、尝试攻击以及暴力破解等。当我们通过日志发现了攻击IP后,我们要做的就是将IP封禁了。IP封禁后,这个IP就无法再访问网站的服务器了,就彻底阻断了攻击。但是Linux防火墙阻断有reject和drop两种,它们有什么区别呢?一般我们使用reject,这个是否合适呢?这个就需要我们详细讨论一下他们的区别,这样就可以更好的匹配我们的应用场景。
分析
当检测到攻击IP时,我们就需要封禁IP,以免持续攻击,造成服务器的资源浪费,更可以避免找到了突破口而攻陷服务器。
一般Linux使用的防火墙有iptables或firewall。如果要封禁一个IP,使用下面的命令:
iptables -I INPUT -s 1.1.1.1 -j REJECT
iptables -I INPUT -s 1.1.1.1 -j DROP
firewall-cmd --add-rich-rule="rule family='ipv4' source address='1.1.1.1' reject"
firewall-cmd --add-rich-rule="rule family='ipv4' source address='1.1.1.1' drop"
iptables和firewall-cmd分别有两个,都可以阻断1.1.1.1的访问。
reject是拒绝的意思,drop为丢弃的意思。
从字面意思来看,reject是比较有礼貌的,别人问你话,你不想回答,你就说我拒绝回答,你找别人吧。
而drop就显得很不礼貌,因为别人问你话,你直接把别人的问话丢到了垃圾桶,别人一直在等你回话呢,这样让别人在等待过程中不知道你的态度,所以一直要等到他觉得不想等了为止。这样依赖,drop就导致别人不确定你还在不在,而且每次询问一直要等到极限才行。
所以,reject会让别人很快知道你拒绝了,所以别人可以尝试用其他的马甲(新IP)来换一种方式询问。反正可以很快确认是拒绝还是同意,这样尝试的成本很低,用时很短。因此这样尝试成功率很高。
另外,reject还隐含透露出来一个重要信息,那就是我还在呢!这样攻击者就会持续的攻击,因为你一直在,可以被攻击。
然而drop则不一样。drop直接将攻击的请求丢了,不做任何回复。从攻击者角度看,发出去的请求就石沉大海了。
在错综复杂的网络里,有可能是网络不通、有可能是已经下线,还有可能是防火墙拦截了。
这样给攻击的脚本的判断带来了难度。至少在每次请求时,因为没有回应,所以攻击者会等待回复。
等待的最长时间相对reject的响应时间就长很多了。这样就导致单位时间内攻击尝试次数就少了很多。
也因为网络不通、下线和drop的效果对攻击者来说是一样的,所以需要通过其他辅助手段才能判断到底是哪种情况,这个就给攻击带来了难度,提高了攻击的成本,从而有效遏制攻击的强度。
在明确应用在攻击的场景时,目标时增加攻击成本,从而保护服务器免受攻击或减少被攻击的强度。
在网络上,隐藏的越深,也就越安全。drop可以实现隐身的效果。网络就是一座黑暗森林,别人发出去的请求得不到响应,才是最安全的。一旦有了响应,就可以被追踪到位置,从而开始猎杀。
如果是应用在内部的访问控制上,只是为了限制访问,而不是应对攻击。此时需要回应reject,被拒绝后,请求者就知道被拒绝了,从而知道自己是被限制了。这样可以减少因为网络不通增加的调试和维护的成本。毕竟网络故障也是时有发生的,如果drop来处理,就经常需要有人来排查是不是网络出现了故障。
总结
防火墙中巧妙的使用reject和drop,可以达到事半功倍的效果。如果滥用reject,只是给攻击者提供攻击的方向标而已。
来源: http://www.yu7s.com/article/20240326110110180.html