如何阻止大约 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 地址查找速度仍然是必要的新连接更快地建立。
无论您有多少其他规则,这都是作为第一条规则部署的好规则。