需要专家 iptables 帮助吗?

需要专家 iptables 帮助吗?

经过详细的分析,我收集了这些细节。

我正遭受 UDP 洪水攻击,这更多地取决于应用程序。我运行一个游戏服务器,攻击者用“getstatus”查询向我发送大量请求,这导致游戏服务器通过回复查询做出响应,从而导致攻击者 IP 的输出高达 30mb/s 并且服务器延迟。

以下是数据包的详细信息,

数据包以 4 个字节 0xff 开头,然后是 getstatus。
理论上,数据包类似于“\xff\xff\xff\xffgetstatus”

现在我已经尝试了很多 iptables 变体,例如状态和速率限制,但这些都没有用。速率限制工作正常,但仅在服务器未启动时才有效。一旦服务器启动,似乎没有 iptables 规则可以阻止它。

还有人有其他解决方案吗?有人让我联系提供商并在网络/路由器上完成此操作,但这看起来很奇怪,我相信他们可能不会这样做,因为这也会影响其他客户。


针对所有这些答案,我想说:

首先,这是一个 VPS,所以他们不能帮我做这件事。其次,我不在乎是否有东西进来,但既然它是由应用程序生成的,那么就必须有一个操作系统级别的解决方案来阻止传出的数据包。至少必须停止传出的数据包。

其次,这不是 Ddos,因为仅 400kb/s 的输入就会从我的 GameServer 产生 30mb/s 的输出。在 D-dos 中永远不会发生这种情况。在这种情况下,应该使用提供商/硬件级解决方案,但这个解决方案不同。是的,禁止他的 IP 可以阻止大量外发数据包,但他有更多的 IP 地址,因为他欺骗了他的原始 IP 地址,所以我只需要一些东西来自动阻止他。

甚至尝试了很多防火墙,但如您所知,它们只是 iptables 的前端,所以如果 iptables 上某些东西不起作用,防火墙会做什么?

这些是我尝试过的规则,

iptables -A INPUT -p udp -m state --state NEW -m recent --set --name DDOS --rsource
iptables -A INPUT -p udp -m state --state NEW -m recent --update --seconds 1 --hitcount 5 --name DDOS --rsource -j DROP

它对于未使用的端口的攻击有效,但是当服务器正在监听并响应攻击者的传入查询时,它永远不会起作用。


好的,Tom.H,当我像这样修改你的规则时,它们就可以正常工作了:

iptables -A INPUT -p udp -m length --length 1:1024 -m recent --set --name XXXX --rsource
iptables -A INPUT -p udp -m string --string "xxxxxxxxxx" --algo bm --to 65535 -m recent --update --seconds 1 --hitcount 15 --name XXXX --rsource -j DROP

它们工作了大约 3 天,效果非常好,其中字符串“xxxxxxxxx”的速率受到限制,如果有人入侵就会被阻止,并且不会影响客户端。但就在今天,我尝试更新链以尝试删除之前被阻止的 IP,因此我不得不刷新链并恢复此规则(iptables -X 和 iptables -F),一些客户端已经连接到服务器,包括我。因此,现在恢复规则也会完全阻止一些客户端字符串,而一些则不受影响。那么这是否意味着我需要重新启动服务器,或者为什么会发生这种情况,因为上次规则运行时没有人连接?

答案1

您几乎已经做到了,但您可能一直在盲目崇拜他人的工作成果,比如 ssh 速率限制,而没有真正理解它。请注意,我不是在批评您:在自由软件社区中,借鉴他人的工作成果是一个好主意;但您应该了解他们这样做的原因,这样您才不会无法正确使用它。

我设置了一个测试装置,使用nc(netcat)将 UDP 流量从一台名为 bill 的机器泛洪到一台名为 risby 的机器,内容如下:

risby% nc -l -u 12345
bill% seq 1 10000000 | nc -u risby 12345

这会在 risby 的 netcat 中产生一个非常快速增加的数字列表,就像您遇到的命令泛滥一样。

但是当我为 risby 的 iptables 创建两个新规则时,只过滤到端口 12345 的 UDP 流量不考虑国家,效果很好:

iptables -I INPUT 1 -p udp --dport 12345 -m recent --set --name ddos
iptables -I INPUT 2 -p udp --dport 12345 -m recent --rcheck  --seconds 1 --hitcount 5 --name ddos -j DROP

当我重新运行 netcats 时,来自 bill 的最初几个数据包通过了 risby,并且数量迅速攀升至约 1800,但随后它完全停滞并且没有收到来自 bill 的进一步流量。

请注意,这些规则非常重要早期的在你的 iptables INPUT 链中,这就是我分别将它们插入到第 1 行和第 2 行的原因。

编辑

提高速率,并要求它持续更长时间;也许--seconds 10 --hitcount 50?最终,您将达到一个阈值,其中很少有合法客户端受到影响,但 DDoS 仍然受到很大限制。请注意,在这种第 3 层限制中,友军误伤始终是可能的;我自己的 ssh 服务器将新连接限制为每 60 秒窗口 2 个,这使得重复的 scp 非常慢。但这是我愿意付出的代价,要做得更好需要第 4 层限制,这意味着应用程序必须具有限制意识。iptables 无法帮助您。

我注意到--hitcount不能采用高于ip_pkt_list_totxt_recent 内核模块的参数的值,并且如果超过该值,则会在规则创建时引发错误:

[root@risby scratch]# iptables -A INPUT -p udp -m recent --rcheck  --seconds 1 --hitcount 50 --name ddos -j DROP 
iptables: Invalid argument. Run `dmesg' for more information.

但模块插入时,此值最多可设置为 255。按照建议在这篇博文中,可以重新加载模块,并明确设置参数:

[root@risby scratch]# rmmod xt_recent
[root@risby scratch]# modprobe xt_recent ip_pkt_list_tot=100
[root@risby scratch]# iptables -A INPUT -p udp -m recent --rcheck  --seconds 1 --hitcount 50 --name ddos -j DROP 
[root@risby scratch]# 

请注意--hitcount 50不再导致错误。您可能需要刷新INPUT链 ( iptables -F INPUT) 和使用该模块的任何其他链,recent然后才能移除并重新插入xt_recent模块。

答案2

使用 tcpdump 对流量进行数据包转储。

tcpdump -s0 -w somefile.tcp proto udp and port NN and host www.xxx.yyy.zzz

检查 wireshark 中的数据包中是否存在您想要匹配的字节字符串;

创建一个带有字符串匹配的 iptables 规则来查找应用程序协议字符串,以允许每秒一定数量的数据包,然后丢弃其余的数据包

iptables -I INPUT -p udp --dport NN -m string  --algo bm \
 --hex-string "|ff ff ff ff 67 65 74 73 74 61 74 75 73|" \
 -m limit --limit 1/second -j ACCEPT

iptables -I INPUT -p udp --dport NN -m string  --algo bm \
 --hex-string "|ff ff ff ff 67 65 74 73 74 61 74 75 73|" -j DROP 

幸运的是这是 udp,因为在 netfilter 模块上进行匹配所需的资源较少......

需要注意的是,你将阻止所有 getstatus 请求,除非你能找到其他只针对此源的过滤器,并且你将不得不做一些维基百科工作来找出匹配字符串的正确十六进制表示形式

答案3

联系您的提供商并要求他们在路由器上阻止流量。
这不会影响其他客户端,因为他们会考虑数据包的目的地(=您的服务器)。

每个 iptables 或其他本地方法都不是解决方案,因为无论如何都需要处理数据包,因此它们会影响您的服务器。

答案4

您是否考虑过禁止他的 IP(如果他没有欺骗 IP)?您遇到的情况称为拒绝服务。我建议您尝试 OSSEC。它可能有助于阻止攻击者正在使用的 IP。

相关内容