我们正在使用 CentOS,并希望禁止几个亚洲国家访问整个服务器。我们检查的几乎每个试图侵入我们服务器的 IP 都分配给亚洲国家(俄罗斯、中国、巴基斯坦等)
我们有一个国家 MySQL 数据库的 IP,我们可以有效地查询并想尝试类似的东西:
-A INPUT -p tcp -m tcp --dport 80 -j /path/to/perlscript.pl
脚本需要将 IP 作为参数传入,然后它会返回 ACCEPT 或 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 帐户等。几乎我曾经使用过的每台 Web 服务器迟早都会受到损害。在我们的案例中,99.99% 来自亚洲国家的流量都带有犯罪意图。
我们希望它通过 iptables 运行,以便覆盖所有端口,而不仅仅是 HTTP,例如通过使用 .htaccess 中的指令。
您认为 ipset 还会更快、更高效吗?
最佳答案
为每个匹配的数据包启动 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
,并从 ipset 命令中删除 ,80
。
关于mysql - 如何从 iptables 调用 shell 或 Perl 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29263943/