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

标签 mysql perl centos iptables

我们正在使用 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 会太慢。这类事情的正确工具是 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,并从 ipset 命令中删除 ,80

关于mysql - 如何从 iptables 调用 shell 或 Perl 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29263943/

相关文章:

c++ - mysql/c++ 连接器错误 : Connection using old (pre-4. 1.1) 身份验证协议(protocol)被拒绝

svn - 在 Centos 上安装 SVN 时得到 "Transaction Error"

svn - 使用 SVN 的 SSL 握手失败

php - 如何在 Laravel 5.2 中创建表关系

c# - 如果表存在于 C# 中,则删除该表?

php - 发送带有消息主题和正文的图像(可选)?

perl 读取文件并抓取特定行

Perl:遍历 INI 文件

regex - 限制perl中的for循环

linux - 根据大小旋转文件