如何阻止大约 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/
但我不知道如何使用它。:/(我真的不擅长编程)
这种方法有替代方案吗?
你应该看看
ipset
.来自官方网站:
要使用它,您需要创建一个
ipset
,添加IPs
并创建一个iptables
规则来匹配ipset
:可以在此处找到一个真实的使用示例。请注意,它使用
ipset restore
而不是在循环中遍历每个IP
,因为它更快。如果您的列表
IPs
有重叠,您可能需要对其进行预处理以IP ranges
尽可能转换为。这是执行此操作的工具的示例。它不会为您带来更好的性能,ipset
但会减少列表的大小。附带说明一下,就性能而言,它非常快并且可以扩展而不会受到惩罚。正如
Cloudflare
's blog 提到的,有更快的低级方法;但它要复杂得多,每秒只增加几个字节,除非你有云提供商的规模和雄心,否则不值得付出努力。帧挑战 - 较短的列表、授权或阻止地址是什么?
与其拒绝 140 万个,不如简单地允许大约十几个您想要允许的 IP,并默认拒绝一切。
如果 IP 地址在明确定义的范围内运行,那么您可以
ufw
像这样使用来阻止流量:上面的示例阻止了从
192.0.0.1
到的所有流量192.255.255.254
,计算结果为 16,777,214 个地址,这对网络吞吐量的影响为零(显着)。只要您的 IP 列表以可行的方式生成 IP 范围,这可能对您有用。
您可以通过对规则进行树结构来最小化查找以提高速度。例如,您可以根据 IP 的第一部分执行此操作,例如
/8
:还有另一个改进可以直接解决您的 3 Mb/s 问题:
这允许已建立的连接遍历尽可能少的 iptables 规则,尽管使用 ipset 来提高 IP 地址查找速度对于更快地建立新连接仍然是必要的。
无论您有多少其他规则,这都是作为第一条规则部署的好规则。
这不使用 iptables 而是使用 ip 内核路由表,可能值得尝试并检查性能:
ip route add blackhole IPv4/32
IIRC 它应该比使用 iptables 过滤更快,但我从未做过 140 万个 IP 的基准测试 :)
除非您计划以极高的数据包速度运行这些阻止列表(想想 >1mpps),否则 XDP_DROP 可能是矫枉过正。因此,如果您对代码没有那么丰富的经验,我会推荐 Cyrbil 的 anwser。
如果您仍然想尝试使用 XDP,您正在寻找一种称为布隆过滤器的东西,它能够快速检查 ip 是“可能在集合中”还是“绝对不在集合中”
C 语言中的布隆过滤器示例:这篇博文