服务器是在CentOS 5.9上通过cpanelconfiguration的标准LAMP堆栈。
我们有一个文件,称之为bad.php,在我们的一个域名上被服务提供商错误地每秒钟访问10次。 该文件不再存在,我们希望以最有效的方式阻止这些请求。 目前,我们正在返回410个响应,但仍然涉及捆绑Apache线程,发送头文件等。
理想情况下,我想放弃请求,不发送任何回应。 由IP阻止不是一种select,因为我们需要允许这些IP合法地访问其他文件。 (不,我们不能要求他们停止)。我们也没有外部防火墙可以使用(租用服务器,自定义外部防火墙的额外费用)。
我的想法是,最好的select是这样的iptables规则:
iptables -I INPUT -p tcp --dport 80 --destination [ip address] -m string \ --algo kmp --string "bad\.php" -j DROP
两个问题:
首先,我尝试了这个规则(用域名的IP地址代替ip地址),但是没有任何效果。 这是iptables -L显示的第一条规则,所以不应该被以前的规则覆盖:
Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere [ip address] tcp dpt:http STRING match "bad\.php" ALGO name kmp TO 65535
我在那里搞错了吗? 我非常喜欢iptables noob。
第二个问题是,这有什么要注意的吗? 是否会有大量的iptablesstring匹配每个请求(与R = 410,现在我们正在使用的Apache重写规则相比)? 我过得好吗? 还是有更好的select? (mod_security也许?)服务器没有任何地方紧张,所以它不是必要的,只是一个优化。
编辑回应Saurabh Barjatiya:
这里是我向bad.php文件发出请求时从tcpdump看到的所有内容:
20:21:09.740217 IP [clientIP].62790 > [serverIP].http: S 3454863895:3454863895(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK> 20:21:09.740243 IP [serverIP].http > [clientIP].62790: S 4112555138:4112555138(0) ack 3454863896 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 7> 20:21:09.838595 IP [clientIP].62790 > [serverIP].http: . ack 1 win 16425 20:21:09.838606 IP [clientIP].62790 > [serverIP].http: . 1:1461(1460) ack 1 win 16425 20:21:09.838622 IP [serverIP].http > [clientIP].62790: . ack 1461 win 69 20:21:09.838632 IP [clientIP].62790 > [serverIP].http: P 1461:1476(15) ack 1 win 16425 20:21:09.838638 IP [serverIP].http > [clientIP].62790: . ack 1476 win 69
显然,实际的urlstring不在这里。 我的理解是,iptables 可以过滤urlstring,所以大概我检查错误的东西。
Hunch的是,iptables规则将比apacheconfiguration使用更多的CPU。 但是,使用iptables阻止传入的请求是有趣的。 由于请求没有被压缩,他们通常也在一个单一的数据包,我没有看到你的逻辑的任何警告。
要理解为什么现在的规则不起作用,我有两个build议: