我有一个运行在Ubuntu 10.04 LTS上的1GB-VPS托pipe站点。 我正在使用nginx作为Web服务器。 该网站已经运行了三年的相对稳定的configuration,每个月处理约400万的综合浏览量。
在过去的16个小时里,我一直在看到我认为是一个“温和”的DDoS攻击。 传出stream量已经乘以5,CPU使用率大约增加了三倍。 我在我的nginx日志中看到一个或两个IP每秒同时发送多个请求(每个1-10个)。 这些请求似乎没有去我的url,但我的IP地址直接。 由于我对nginx.conf有一定的了解,因此我在这里设置了一个单独的“默认”服务器模块来捕获这个stream量并logging下来。 我有它设置为logging该stream量,并返回错误代码444。 我也为这个stream量设置了limit_req_zone和limit_conn_zone,尽pipe因为这些是不同的IP发送请求,所以影响不大。 这里是nginx.conf的相关部分:
limit_req_zone $binary_remote_addr zone=ddos:25m rate=1r/m; limit_conn_zone $binary_remote_addr zone=blockedfuckers:20m; server { listen 80 default_server; server_name _; access_log /var/log/nginx/a2.log hackers; limit_req zone=ddos nodelay; limit_conn blockedfrakers 1; return 444; }
这个CPU使用率下降了30%左右,但是输出stream量仍然很高,CPU仍然超过了一倍。 出于某种原因,日志显示请求正在发送一个400响应,而不是我试图发送的444。 例如:
109.198.195.28 [12/Mar/2013:22:49:24 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: - 107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: - 107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: - 107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: - 107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: - 107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
这些看起来像“空”的要求,所以我想configurationiptables只是放弃这些,但我已经尝试了几件事情没有奏效。 任何想法如何我可以目标和放弃这种stream量?
如果你确定TCP有效载荷是0,你可以尝试使用iptables的-length选项。 该选项与第3层有效负载匹配。 这个规则应该工作:
iptables -I INPUT -p tcp --dport 80 -m length --length 20 -j DROP
一个TCP头的大小通常是20(可能更大,但尝试20并查看结果)。 所以,该规则丢弃只包含一个TCP报头,没有有效载荷的数据包。