封锁 VPS 上的 140 万个 IP 地址

封锁 VPS 上的 140 万个 IP 地址

如何阻止大约 140 万个 IP 地址的列表?我已经尝试使用 iptables PREROUTING 来做到这一点,例如:

-A PREROUTING -d IP_HERE/32 -j DROP

但是由于记录太多,当我进行速度测试时,我的带宽就会疯狂下降。

iptables 中没有阻止的 IP:

1 Gb/秒

使用 iptables 中阻止的 IP:

峰值为 3 Mb/s。

我想像这里一样使用 XDP_DROP(最后一步): https://blog.cloudflare.com/how-to-drop-10-million-packets/

但我不知道如何使用它。:/(我真的很不擅长编程)

这种方法还有其他选择吗?

答案1

你应该看看ipset

来自官方网站:

Ipset 可能是适合您的工具 [...] 用于存储多个 IP 地址或端口号并与 iptables 的集合进行匹配。

[...](Ipset)可以以某种方式存储IP地址、网络、(TCP/UDP)端口号、MAC地址、接口名称或它们的组合,以确保在将条目与集合进行匹配时以闪电般的速度进行。

要使用它,您需要创建一个ipset,添加IPs并创建一个iptables规则来匹配ipset

ipset create blacklist hash:ip hashsize 1400000
ipset add blacklist <IP-ADDRESS>
iptables -I INPUT -m set --match-set blacklist src -j DROP

可以找到真实生活中的使用示例这里。请注意,它使用ipset restore而不是循环遍历每一个,IP因为这样速度更快。

如果您的列表IPs有重叠,您可能需要对其进行预处理,以便IP ranges尽可能转换为。这里是一个可以实现此目的的工具示例。它不会提高您的性能,ipset但会减少列表的大小。


顺便提一下,就性能而言,它非常快,而且扩展性没有损失。正如博客中Cloudflare提到的,有更快的低级方法;但它要复杂得多,而且每秒只增加几个字节,除非您拥有云提供商的规模和野心,否则不值得付出努力。

答案2

框架挑战——较短的列表、授权的或阻止的地址是什么?

不需要拒绝 140 万个 IP,只需允许大约十几个您想要允许的 IP,然后默认拒绝所有 IP。

答案3

如果 IP 地址在明确定义的范围内运行,那么您可以使用ufw以下方式来阻止流量:

sudo ufw deny from 192.0.0.0/8 to any

上面的例子阻止了从192.0.0.1到 的所有流量192.255.255.254,总共 16,777,214 个地址,这对网络吞吐量没有任何(明显)影响。

只要您的 IP 列表能够以可行的方式生成 IP 范围,这可能对您有用。

答案4

还有另一项改进可以直接解决您的 3 Mb/s 问题:

iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

这样可以让已建立的连接遍历尽可能少的 iptables 规则,尽管使用 ipset 来提高 IP 地址查找速度仍然是必要的新连接更快地建立。

无论您有多少其他规则,这都是作为第一条规则部署的好规则。

相关内容