Linux:阻止大量 IP 列表?

Linux:阻止大量 IP 列表?

阻止访问 8-10k IP 地址的最有效方法是什么?

我的服务器在 Debian 上运行 EngineX。

如果可能的话,我想向所有地址显示内部服务器错误(500)。

IP 比较分散,不属于任何特定的子集。

答案1

如果地址被分组在一个或几个连续的子网中[例如几个/ 24] - 我会创建简单的预路由规则,将端口 80 上的所有流量从它们 DNAT 到侦听端口 81 的某个东西[例如来自 nginx 的 vhost],只会提供错误页面:

iptables -t nat -A PREROUTING -p tcp -s 194.88.0.0/16 --dport 80 -j REDIRECT --to 81

如果这是 8-10k 个独立 IP,分散在“四周”……那将会很有趣 ;-] - 我仍然会采用上述方案,但为了进行匹配,我会使用ipset.像这样:

ipset --create ban iphash
ipset --add ban 80.1.2.3
ipset --add ban 90.4.5.6
ipset --add ban 153.17.18.19
# ....
iptables -t nat -A PREROUTING -p tcp -m set --set ban src --dport 80 -j REDIRECT --to 81

答案2

可以看一下:http://www.hipac.org/ 它可以很好地处理大量规则。如果您尝试阻止的 IP 存在模式,则可以使用 MATCH 规则。pQd 的预路由规则可以与 nf-hipac 配合使用,后者使用哈希表来存储规则,并且比默认的 iptables 查找快得多。

您可以将规则集写入位置块中的拒绝行。为了简单起见,您可以包含一个包含拒绝块的文件,并每小时重新加载配置。由于它位于 nginx 配置文件中,因此不会对性能产生太大影响。

答案3

如果您在文件中有这些地址的列表,您可以在 Nginx 配置中尝试以下操作:

1 使用 geo 指令定义 IP 组(在 http 块内):

http {
...
  地理 $block {
    默认0;
    包括黑名单;
  }
...
}

这意味着变量 $block 将默认设置为 0。

2 准备一个黑名单文件,如下所示:

192.168.0.0/24 1;
192.168.2.0/24 1;
10.0.0.0/8 1;

也就是说,将这些地址的变量 $block 设置为 1。

3 在“location”块中,检查此变量,如果为 1,则报告 500 错误:

如果 ($block = 1) {
   返回500;
 }

PS:此解决方案的效率值得商榷,因为来自被禁止 IP 的连接将被 accept() 并传递到 Web 服务器。但是,如果这个微小的开销对您的主机来说并不重要,我宁愿使用 Nginx,而不是 iptables。

相关内容