如何使用 iptables 丢弃“空” HTTP 数据包?

如何使用 iptables 丢弃“空” HTTP 数据包?

我有一个 1GB VPS 托管的网站,运行在 Ubuntu 10.04 LTS 上。我使用 nginx 作为 Web 服务器。该网站在相对稳定的配置下运行了三年,每月处理约 400 万次页面浏览量。

在过去的 16 个小时里,我看到了我认为是“轻微”的 DDoS 攻击。传出流量增加了 5 倍,CPU 使用率增加了大约 3 倍。我看到我的 nginx 日志中每秒有一两个 IP 同时发送多个请求(每个 1-10 个)。这些请求似乎不是发往我的 URL,而是直接发往我的 IP 地址。由于我对 nginx.conf 比较熟悉,我在那里设置了一个单独的“默认”服务器块来捕获此流量并记录它。我已将其设置为记录该流量并向其返回错误代码 444。我还为该流量设置了 limit_req_zone 和 limit_conn_zone,但由于这些是发送请求的不同 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%,但传出流量仍然很高,并且 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: -

在我看来,这些请求都是“空”请求,所以我尝试配置 iptables 来丢弃这些请求,但我尝试过的几种方法都没有奏效。有什么想法可以定位和丢弃这些流量吗?

答案1

如果您确定 TCP 有效负载为 0,则可以尝试使用 iptables 的 --length 选项。此选项匹配第 3 层有效负载。此规则应该有效:

iptables -I INPUT -p tcp --dport 80 -m length --length 20 -j DROP

TCP 报头的大小通常为 20(可能更大,但请尝试使用 20 并查看结果)。因此,该规则会丢弃仅包含 TCP 报头且无有效负载的数据包。

相关内容