我有一个游戏服务器,有人用机器人向它发送垃圾邮件。 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 解决方案性能更好取决于您的服务器配置。我想您应该在部署到生产系统之前对这两种方法进行基准测试。