经过详细的分析,我收集了这些细节。
我在一个UDP Flood,这是更多的应用程序依赖。 我运行一个游戏服务器,一个攻击者用“getstatus”查询来驱使我,使得GameServer响应查询,使得输出到攻击者的IP高达30mb / s,服务器滞后。
这里是包的细节,
数据包以4字节0xff开始,然后是getstatus。
理论上,数据包就像“\ xff \ xff \ xff \ xffgetstatus”
现在,我已经尝试了许多iptables的变化,如状态和速度限制,但没有奏效。 速率限制工作正常,但只有当服务器没有启动。 一旦服务器启动,没有iptables规则似乎阻止它。
任何人有更多的解决scheme? 有人要求我联系提供商并在networking/路由器上完成,但看起来很奇怪,我相信他们可能不会这样做,因为这也会影响到其他客户。
回答所有这些答案,我会说:
首先,它是一个VPS,所以他们不能为我做。 其次,我不在乎是否有东西进来,但自从生成它的应用程序以来,必须有一个操作系统级别的解决scheme来阻止传出的数据包。 至less外派人员必须停止。
其次,它不是多米诺骨牌,因为只有400kb / s的input,从我的GameServer产生30mb / s的输出。 这从来没有发生在D – DOS中。 在这种情况下,应该使用提供商/硬件级解决scheme,但是这个scheme是不同的。 是的,禁止他的IP阻止了stream出数据包的泛滥,但他有更多的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天左右,string“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 但就在今天,我试图更新链来尝试删除以前阻止的IP,所以我不得不刷新链条并恢复这个规则(iptables -X和iptables -F),一些客户端已经连接到包括我在内的服务器。 所以现在恢复规则也会阻塞一些客户端string,而有些则不受影响。 那么这是否意味着我需要重新启动服务器,否则为什么会发生这种情况,因为上次规则工作时,没有人连接?
你已经差不多在那里了,但是你可能已经在考虑别人的工作了,可能在ssh限速的情况下,却没有真正理解它。 请注意,我不是在批评你:在自由软件社区build立他人的工作是一个很好的主意; 但你应该明白为什么他们已经做了他们所做的事情,所以你不会错误地使用它。
我build立了一个testing平台,使用nc (netcat)将UDPstream量从名为bill的计算机发送到名为risby的计算机,命令如下:
risby% nc -l -u 12345 bill% seq 1 10000000 | nc -u risby 12345
这就产生了来自risby的netcat的非常迅速增长的数字列表,就像您一直在使用命令泛滥一样。
但是,当我为risby的iptables创build了两条新规则,它们只将UDPstream量过滤到端口12345 而不考虑状态 ,它工作正常:
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
当我重新运行networking通信时,来自账单的头几个数据包就通过了,然后数字迅速上升到了1800左右,但是这个数据完全停顿了,没有进一步的话务量。
请注意,这些规则在iptables INPUT链中很早就到位了,这就是为什么我分别在第1行和第2行插入它们的原因。
编辑 :
提高利率,并要求持续更长时间; 也许 – --seconds 10 --hitcount 50 ? 最终,您将达到极less数合法客户受到影响的阈值,但是DDoS仍然受到严重限制。 请注意,在这种三层节stream中,友善之火永远是可能的。 我自己的ssh服务器将每60秒的新连接数限制为两个,这使得重复的scps非常慢。 但是,这是我愿意付出的代价,要做得更好,需要第4层节stream,这意味着应用程序必须受到节stream感知。 iptables不能帮你。
我注意到--hitcount值不能高于xt_recent内核模块的ip_pkt_list_tot参数,并且如果在规则创build时抛出的值超出了错误:
[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。 按照此博客条目中的build议,可以重新加载模块,并明确设置参数:
[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如何不再导致错误。 在删除并重新插入xt_recent模块之前,可能需要刷新INPUT链( iptables -F INPUT )和其他使用recent模块的链。
使用tcpdump来获取stream量的数据包转储。
tcpdump -s0 -w somefile.tcp proto udp and port NN and host www.xxx.yyy.zzz
在wireshark中检查你想匹配的字节串的数据包;
创build一个带有string匹配的iptables规则来查找应用程序协议string,以便每秒允许一定数量的数据包,然后丢弃这些数据包的其余部分
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模块上进行匹配的资源更less。
需要注意的是,你将要阻止所有的getstatus请求,除非你可以find一些其他的filter来源,你将不得不做一点维基百科的工作,以找出匹配string的正确的hex表示
联系你的provier,并要求他们阻止路由器的stream量。
这不会影响其他客户端,因为他们会将数据包的目的地(=您的服务器)考虑在内。
每个iptables或其他本地方法将不会是一个解决scheme,因为数据包需要处理,所以他们会影响你的服务器。
你有没有考虑过禁止他的知识产权(如果他不欺骗)? 您所遇到的是拒绝服务。 我build议你试试OSSEC。 这可能有助于阻止攻击者正在使用的IP。