如何从iptables调用shell或Perl脚本?

时间:2015-03-25 18:43:11

标签: mysql perl centos iptables

我们正在使用CentOS,并希望禁止几个亚洲国家访问整个服务器。我们检查的几乎所有试图侵入我们服务器的IP都被分配到一个亚洲国家(俄罗斯,中国,巴基斯坦等)

我们有一个IP国家MySQL数据库,我们可以有效地查询,并希望尝试类似:

-A INPUT -p tcp -m tcp --dport 80 -j /path/to/perlscript.pl

脚本需要传入的IP作为参数,然后它会返回ACCEPT或DROP目标吗?

感谢您的回答,这是我的跟进。

你知道它是否可能吗?有规则指向返回目标的脚本吗? (ACCPET / DROP)

不完全确定ipset是如何工作的,我必须进行实验,但看起来它会创建一个规则。例如,俄罗斯如何处理超过6000个范围?我们希望总共增加20到40个国家,因此我们最终可能需要添加超过100,000个范围。单个MySQL查询的开销不会减少负担吗?

SELECT country FROM ip_countries WHERE $VAR{ip} >= range1 && $VAR{ip} <= range2

我们使用的数据库可在此处免费获取:http://software77.net/geo-ip/

它通过使用以下公式将IP转换为数字来表示数据库中的IP:

$VAR{numberedIP} = $octs[3] + ($octs[2] * 256) + ($octs[1] * 256 * 256) + ($octs[0] * 256 * 256 * 256); 

它会将范围的起点存储在“range1”列中,并将范围的结尾存储在“range2”列中。

因此,您可以看到我们如何使用上述查询查找IP。从字面上看,只需不到百分之一秒即可获得结果,而且非常准确。我们在专用服务器上有一个网站,流量很低。但是就像我检查过的所有服务器一样,这个服务器每天都会被黑客的机器人,电子邮件帐户,FTP帐户等等所击中。而且我工作过的每一台网络服务器迟早都会受到影响。在我们的案例中,来自亚洲国家的99.99%的流量具有犯罪意图。

我们希望通过iptables运行以便覆盖所有端口,而不仅仅是HTTP,例如使用.htaccess中的指令。

你认为ipset仍然会更快更有效吗?

1 个答案:

答案 0 :(得分:3)

为每个匹配的数据包启动perl会太慢。适合此类事情的工具是ipsetipset man page上提供了更多信息和文档。

在CentOS中,您可以使用yum进行安装。当然,所有这些命令和脚本都需要以root身份运行:

# yum install ipset

接下来安装内核模块(你也希望在启动时发生这种情况):

# modprobe -v ipset ip_set_hash_netport

然后使用以下脚本填充ipset并使用iptables阻止其范围内的IP:

#!/usr/bin/env perl
use strict;
use warnings; 
use DBI; 

my $dbh = DBI->connect('... your DSN ...',...);
# I have no knowledge of your schema, but if you can pull the 
# address range in the form: AA.BB.CC.DD/NN
my $ranges = $dbh->selectcol_arrayref(
   q{SELECT cidr FROM your_table WHERE country_code IN ('CN',...)});

`ipset create geoblock hash:netport`;
for (@$ranges) { 
    # to match on port 80:
    `ipset add geoblock $_,80`; 
}
`iptables -I INPUT -m set --set geoblock src -j DROP`;

如果您想阻止所有端口而不是80,请使用ip_set_hash_net模块而不是ip_set_hash_netport,将hash:netport更改为hash:net,然后移除{{1来自ipset命令。