web-dev-qa-db-ja.com

iptablesを使用して「空の」HTTPパケットをドロップするにはどうすればよいですか?

Ubuntu 10.04LTSで実行されている1GB-VPSでホストされているサイトがあります。 Webサーバーとしてnginxを使用しています。このサイトは3年間比較的安定した構成で運営されており、月に約400万ページビューを処理します。

過去16時間、私は「軽度の」DDoS攻撃であると私が信じているものを見てきました。発信トラフィックは5倍になり、CPU使用率は約3倍になりました。 nginxログに毎秒1つまたは2つの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は通常の2倍を超えています。何らかの理由で、ログには、送信しようとしている444ではなく、400応答が送信されている要求が表示されます。例えば:

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を設定してそれらを削除しようとしていますが、試したいくつかのことがうまくいきませんでした。このトラフィックをターゲットにしてドロップする方法について何かアイデアはありますか?

2
Josh K

TCPペイロードが0であることが確実な場合は、iptablesの--lengthオプションを試してみてください。このオプションは、レイヤー3ペイロードと一致します。このルールは機能するはずです:

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

TCPヘッダーのサイズは通常20です(もっと大きくなる可能性がありますが、20で試して結果を確認してください)。したがって、そのルールは、TCPヘッダーを含み、ペイロードを含まないパケットのみを含むパケットをドロップします。

1
Diego Woitasen