大量 IP 封锁会影响服务器性能吗?

大量 IP 封锁会影响服务器性能吗?

我有一个游戏服务器,有人用机器人向它发送垃圾邮件。 SpamBot 客户端使用 UDP 连接与我的服务器进行握手。它通过代理列表来完成此操作。基本上,Spambot 客户端会向我的服务器发送大量 UDP 数据包,并使用机器人向其发送垃圾邮件。

现在我有 6 个大代理列表,我知道向我发送垃圾邮件的人使用了它们。我可以编写一个 shell 脚本来阻止每个列表中的每个 IP。每个 IP 都在一个新行上,因此使用 for 循环很容易做到这一点。

问题是我担心我的服务器的性能。如果我阻止 15k 个 IP 地址,这会影响我的服务器的性能吗?

目前,我运行 CentOS 7。您能告诉我 IP 表是否是个好方法,或者我应该尝试其他哪些替代方案?请把命令也写出来。我只是希望我的服务器停止响应这些 IP 地址,不与它们建立任何连接。

答案1

对于如此大量的 IP,您应该使用ipsets模块。 ipset 创建 iptables 可以做出反应的数据集,它可以轻松处理 10 到 1000 个条目

确保您拥有EPEL 存储库启用然后通过以下方式安装 ipset:

yum install ipset

一个例子:

ipset -N blockedip iphash

创建一个名为“blockedip”的集合,格式为“iphash”(有不同的格式,这个仅适用于 IP)。

使用 ipset -A 您可以将数据(在本例中为 IP)添加到数据集中:

ipset -A blockedip 192.168.1.1
ipset -A blockedip 192.168.1.2

等等...

或者批量创建它,而不必ipset为每个 IP 地址运行一次调用,假设您big-file.list是一个 IPv4 地址列表,每行一个:

ipset -N blockedip iphash
sed 's/^/add blockedip /' < big-file.list | ipsec restore

使用以下 iptables 命令,您可以告诉内核丢弃来自该组中任何源的所有数据包:

iptables -A INPUT -m set --set blockedip src -j DROP

答案2

如果您谈论的是 15,000 个不同的 IP 地址,那么您确实不要希望iptables对每个地址使用单独的规则。这会降低您的网络吞吐量。

相反,您应该考虑使用单个IP设置然后把你的 15000 个地址放进去。

ipset create spambots iphash
iptables -A INPUT -m set --match-set spambots src -j DROP

while read ip; do ipset add spambots "$ip"; done < ip_addresses.txt

您可以del从 IP 集中(删除)单个地址、flush整个条目集或destroy完全删除 IP 集中。

答案3

给定以下格式的输入文件“ips.txt”:

1.2.3.4
2.3.4.5

然后这个脚本会将所有 ip 地址添加到 iptables 输入链中,目标为 DROP,因此匹配的数据包将被丢弃:

 cat ips.txt| while read a; do echo $a;  iptables -I INPUT -p udp -s $a -j DROP ; done

当您尝试添加大量 ip 时,请尝试累积它们,类似于下面的示例,以便

1.2.3.4
1.2.3.5

变成

1.2.3.0/28

或类似的。这种积累也可以通过脚本来完成。

答案4

另一种方法是使用所谓的路由黑洞来阻止此类 IP。 ip route add blackhole 8.8.8.8/32 这意味着您为上述地址设置了一条路由,该路由不会将数据发送到任何地方。它是否比常规 iptables 解决方案性能更好取决于您的服务器配置。我想您应该在部署到生产系统之前对这两种方法进行基准测试。

相关内容