使用 Iptables 的 Ipset 和大量的 IP 范围列表(CIDR)

使用 Iptables 的 Ipset 和大量的 IP 范围列表(CIDR)

我在这里读过一些关于阻止 IP 地址范围的答案,并且iptables之前已经为此使用过。建议ipset与结合使用iptables

我只安装了ipset但尚未配置。

我找到了这个网站ip2location.com生成按国家/地区禁止的 IP 列表。我选择了经常针对我们网站的 5 个国家/地区,但列表很长,256000 行

  • 这个庞大的列表在使用时会减慢我的服务器速度吗ipset(在尝试仅使用 IPtables 之前,我曾质疑这么大的文件可能会降低性能。)
  • 如果是这样,那么该怎么做呢?目前我使用 fail2ban,但我认为 nginx 的配置设置不正确(我假设是正则表达式)。无论如何,我需要一种更强大的方法。
  • 最后,我并不声称自己足够了解 CIDR,因此无法缩小这个列表(如果可能的话,聚合相似的 IP 范围)。

例如,有多个 /21 条目:

185.179.152.0/22

在线工具显示其解析为:185.179。152.0 到 185.179.155.255

我认为没有任何简单的方法可以减少条目数,因此请提供有关实施和性能问题的任何建议。

答案1

有一个名为 的命令行实用程序aggregate。它获取 CIDR 网络块列表并将连续的块聚合到相应的较大块中。它还会删除冗余的网络块。

例如:

$ aggregate -q << EOF
> 192.168.0.0/24
> 192.168.1.0/24
EOF
192.168.0.0/23

输入一个仅包含 CIDR 块的文本文件,它将尝试聚合它们,从而减小列表的大小。

从手册页中:

DESCRIPTION
       Takes  a list of prefixes in conventional format on stdin, and performs
       two optimisations to attempt to reduce the length of the prefix list.

       The first optimisation is to remove any supplied prefixes which are su‐
       perfluous because they are already included in another supplied prefix.
       For example, 203.97.2.0/24 would be removed if 203.97.0.0/17  was  also
       supplied.

       The  second  optimisation identifies adjacent prefixes that can be com‐
       bined under a single, shorter-length prefix. For example, 203.97.2.0/24
       and 203.97.3.0/24 can be combined into the single prefix 203.97.2.0/23.

aggregate包含在大多数主流 Linux 发行版中,包括 Ubuntu。

(请注意,我从该网站提取了一个列表并尝试聚合它们但什么也没发生,因此它们可能已经被聚合了。您当然可以使用多个 ipset,这可能是这里最好的做法。)

答案2

通常,ipset 列表的最大长度为 65536 个元素,因此您可能必须对要阻止的每个国家/地区使用单独的列表。

使用 hash:net set,您可以直接添加要禁止的 CIDR 记录。您可能需要检查https://www.ipdeny.com/ipblocks/对于国家级区块

至于你的问题

  • ipset 不会显著降低你的系统速度 - 它会使用一些内存来保存设置,但除此之外,负载不应该很明显
  • fail2ban 是值得保留的,因为攻击者可以使用任何国家的云/vps 服务器

最后,关于使用 iptables 和 ipset 来屏蔽特定国家,还有很多类似的问题,所以我就不多说 iptables 的设置细节了,只要检查一下 https://askubuntu.com/questions/868334/block-china-with-iptables或类似

答案3

您可以使用xt_geoipxtables 插件呢?

geoip vs ipset xt_geoip 使用(可能)最有效的格式,即(非压缩)打包 blob。将一个国家加载到内核的成本与磁盘上的文件成本相同。

由于 ipset 不支持任意 IPaddr–IPaddr 范围,因此需要使用多个 Network/Prefixlength 条目来近似该范围。此外,如果使用哈希集类型,则可以假设,根据哈希和/或树的性质,某些存储桶保持为空和/或需要额外的元数据。因此,基于 ipset 的 geoip 的内存占用自然更大。用户报告1表明在某些情况下它可以变得高出两个数量级(iptreemap)。

xt_geoip 的查找时间为 O(log2(ranges)),因此要在 20,000 个范围内查找地址,最多需要 15 次迭代,每次迭代进行地址比较(最多 3 次)。ipset 使用 Jenkins3 进行散列,这本身就有一定的时间成本。

目前尚未进行过实证时间测试。

相关内容