我们正在使用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仍然会更快更有效吗?
答案 0 :(得分:3)
为每个匹配的数据包启动perl
会太慢。适合此类事情的工具是ipset
,ipset
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命令。