在 VPS 上阻止 140 万个 IP 地址

Kam*_*rut 14 server iptables firewall networking

如何阻止大约 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/

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

这种方法有替代方法吗?

Cyr*_*bil 32

你应该看看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
Run Code Online (Sandbox Code Playgroud)

可以在此处找到实际使用示例。请注意,它使用ipset restore而不是IP在循环中遍历每个,因为它更快。

如果您的列表IPs有重叠,您可能希望对其进行预处理以IP ranges在可能的情况下转换为。是执行操作的工具的示例。它不会让您获得更好的表现,ipset但会减少您的列表大小。


附带说明一下,就性能而言,它非常快速且可扩展而不会受到惩罚。正如Cloudflare的博客所提到的,有更快的低级方法;但它要复杂得多,而且每秒只增加几个字节,除非您具有云提供商的规模和雄心,否则不值得付出努力。

  • 将单个 IP 处理成范围绝对是必须的。然后你可以使用 `hash:net` 来获得更好的性能。 (3认同)

Cri*_*gie 20

帧挑战 - 较短的列表、授权地址或阻止地址是什么?

与其拒绝 140 万个,不如简单地允许大约十几个您想要允许的 IP,并默认拒绝一切。

  • 这听起来更像是他想阻止一组预定义的“坏 IP”。对于大多数应用程序,白名单系统可能没有用 (9认同)

mat*_*igo 15

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

sudo ufw deny from 192.0.0.0/8 to any
Run Code Online (Sandbox Code Playgroud)

上面的示例阻止了所有来自192.0.0.1to 的流量192.255.255.254,计算结果为 16,777,214 个地址,这对网络吞吐量的影响为零(显着)。

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

  • 为什么_更糟_?这不像 iptables 规则正在调用 ufw,它只是首先配置它们的前端。不过,显然它也不会_更好_。 (5认同)
  • 让我们假设 OP 想要阻止不在某个范围内的地址。 (2认同)

Raf*_*ffa 13

您可以通过树结构化规则来最小化查找以提高速度。例如,您可以根据 IP 的第一部分进行操作,/8例如:

iptables -N rule8_192_0_0_0
iptables -N rule8_172_0_0_0
iptables -N rule8_10_0_0_0

iptables -A INPUT -s 192.0.0.0/8 -j rule8_192_0_0_0
iptables -A INPUT -s 172.0.0.0/8 -j rule8_172_0_0_0
iptables -A INPUT -s 10.0.0.0/8 -j rule8_10_0_0_0

iptables -A rule8_192_0_0_0 -s 192.168.2.3 -j DROP
iptables -A rule8_172_0_0_0 -s 172.16.2.3 -j DROP
iptables -A rule8_10_0_0_0 -s 10.10.2.3 -j DROP
Run Code Online (Sandbox Code Playgroud)


iBu*_*Bug 5

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

iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

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

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