经过详细的分析,我收集了这些细节。
我处于 UDP Flood 之下,它更依赖于应用程序。我运行了一个游戏服务器,一个攻击者用“getstatus”查询淹没了我,这使得 GameServer 通过对查询的回复做出响应,这导致输出到攻击者的 IP 高达 30mb/s 和服务器延迟。
这是包的详细信息,
数据包以 4 个字节 0xff 开始,然后是 getstatus。
理论上,数据包类似于“\xff\xff\xff\xffgetstatus”
现在我已经尝试了很多 iptables 变体,比如状态和速率限制,但这些都不起作用。速率限制工作良好,但仅当服务器未启动时。一旦服务器启动,似乎没有 iptables 规则阻止它。
其他人有更多解决方案吗?有人让我联系提供商并在网络/路由器上完成,但这看起来很奇怪,我相信他们可能不会这样做,因为这也会影响其他客户。
回应所有这些答案,我会说:
首先,它是一个 VPS,所以他们不能为我做。其次,我不在乎是否有东西进来,但由于它的应用程序生成,所以必须有一个操作系统级别的解决方案来阻止传出的数据包。至少必须停止传出的。
其次,它不是 Ddos,因为只有 400kb/s 的输入从我的 GameServer 生成 30mb/s 的输出。这在 D-dos 中永远不会发生。在这种情况下应该使用询问供应商/硬件级别的解决方案,但这个是不同的。是的,禁止他的 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
Run Code Online (Sandbox Code Playgroud)
它适用于对未使用端口的攻击,但是当服务器正在侦听和响应攻击者传入的查询时,它永远不会起作用。
好的 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
Run Code Online (Sandbox Code Playgroud)
他们工作了大约 3 天,非常好,其中字符串“xxxxxxxxx”将受到速率限制,如果有人进水就会被阻止并且不会影响客户端。但是就在今天,我尝试更新链以尝试删除以前被阻止的 IP,因此我必须刷新链并恢复此规则( iptables -X 和 iptables -F ),一些客户端已经连接到包括我在内的服务器。因此,现在恢复规则也会完全阻止某些客户端字符串,而有些则不受影响。那么这是否意味着我需要重新启动服务器,或者为什么会发生这种情况,因为上次规则起作用时,没有人连接?
Mad*_*ter 10
您已经快要实现了,但是您可能一直在对他人的工作进行大量研究,可能是在 ssh 速率限制上,而没有真正理解它。请注意,我不是在批评您:在自由软件社区中,以他人的工作为基础是一个绝妙的主意;但是你应该理解他们为什么做了他们已经做过的事情,这样你就不会没有正确使用它。
我设置了一个测试设备,使用nc
(netcat) 将 UDP 流量从名为 bill 的机器泛洪到名为 risby 的机器,并使用以下几行:
risby% nc -l -u 12345
bill% seq 1 10000000 | nc -u risby 12345
Run Code Online (Sandbox Code Playgroud)
这从 risby 的 netcat 中产生了一个非常快速增加的数字列表,就像你一直在使用的命令泛滥一样。
但是,当我为 risby 的 iptables 创建两个新规则时,它们仅将 UDP 流量过滤到端口 12345而不考虑 state,它工作正常:
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
Run Code Online (Sandbox Code Playgroud)
当我重新运行 netcats 时,来自 bill 的前几个数据包在 risby 上通过,并且数字迅速攀升至大约 1800,但随后它完全停止并且没有收到来自 bill 的进一步流量。
请注意,这些规则在 iptables INPUT 链的早期出现非常重要,这就是我将它们分别插入到第 1 行和第 2 行的原因。
编辑:
提高速率,并要求它持续更长时间;也许--seconds 10 --hitcount 50
?最终,您将达到一个阈值,很少有合法客户端受到影响,但 DDoS 仍然受到严重限制。请注意,在这种第 3 层节流中,友军总是有可能发生的;我自己的 ssh 服务器将每 60 秒窗口的新连接限制为两个,这使得重复的 scp 非常慢。但这是我愿意付出的代价,为了做得更好需要第 4 层节流,这意味着应用程序必须具有节流意识。iptables 不能帮助你。
我注意到--hitcount
不能取高于ip_pkt_list_tot
xt_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.
Run Code Online (Sandbox Code Playgroud)
但是这个值在模块插入时最多可以设置为 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]#
Run Code Online (Sandbox Code Playgroud)
请注意如何--hitcount 50
不再导致错误。您可能需要先冲洗INPUT
链条 ( iptables -F INPUT
) 和使用该recent
模块的任何其他链条,然后才能卸下和重新插入xt_recent
模块。
归档时间: |
|
查看次数: |
7792 次 |
最近记录: |