http サーバーへの DDOS 攻撃と iptables は役に立ちません (access_log があります)

http サーバーへの DDOS 攻撃と iptables は役に立ちません (access_log があります)

私は http サーバーをターゲットにした DDOS 攻撃を受けています。iptables やその他の手段を試しましたが、何も機能していないようです。以下は access_log の一部です。

https://pastebin.com/6JFKmUi8

接続は多いが、iptables では攻撃を阻止できない。iptables ルールは次の通り。

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 147.135.37.113 -j ACCEPT

iptables -A INPUT -f -j DROP
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

iptables -N LOG_AND_DROP

iptables -N PORT21
iptables -A PORT21 -m recent --set --name lp21
iptables -A PORT21 -m recent --update --seconds 30 --hitcount 3 --name lp21 -j DROP
iptables -A PORT21 -m recent --update --seconds 300 --hitcount 10 --name lp21 -j LOG_AND_DROP

iptables -N PORT22
iptables -A PORT22 -m recent --set --name lp22
iptables -A PORT22 -m recent --update --seconds 30 --hitcount 3 --name lp22 -j DROP
iptables -A PORT22 -m recent --update --seconds 300 --hitcount 10 --name lp22 -j LOG_AND_DROP

iptables -N PORT80
iptables -A PORT80 -m recent --set --name lp80
iptables -A PORT80 -m recent --update --seconds 30 --hitcount 20 --name lp80 -j LOG_AND_DROP

iptables -N PORT443
iptables -A PORT443 -m recent --set --name lp433
iptables -A PORT443 -m recent --update --seconds 30 --hitcount 20 --name lp443 -j LOG_AND_DROP

iptables -N PORT10000
iptables -A PORT10000 -m recent --set --name lp10000
iptables -A PORT10000 -m recent --update --seconds 30 --hitcount 20 --name lp10000 -j LOG_AND_DROP

iptables -N PORT6900
iptables -A PORT6900 -m recent --set --name lp6900
iptables -A PORT6900 -m recent --update --seconds 30 --hitcount 10 --name lp6900 -j LOG_AND_DROP
iptables -A PORT6900 -m recent --update --seconds 50 --hitcount 20 --name lp6900 -j LOG_AND_DROP

iptables -N PORT6121
iptables -A PORT6121 -m recent --set --name lp6121
iptables -A PORT6121 -m recent --update --seconds 30 --hitcount 10 --name lp6121 -j LOG_AND_DROP
iptables -A PORT6121 -m recent --update --seconds 50 --hitcount 20 --name lp6121 -j LOG_AND_DROP

iptables -N PORT5121
iptables -A PORT5121 -m recent --set --name lp5121
iptables -A PORT5121 -m recent --update --seconds 30 --hitcount 10 --name lp5121 -j LOG_AND_DROP
iptables -A PORT5121 -m recent --update --seconds 50 --hitcount 20 --name lp5121 -j LOG_AND_DROP

iptables -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name pings --hashlimit-mode srcip --hashlimit 10/min --hashlimit-burst 10 --hashlimit-htable-expire 30000 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/min -j LOG --log-prefix "[Pings]"
iptables -A INPUT -p icmp -j DROP

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j PORT21
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j PORT22
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j PORT80
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j PORT443
iptables -A INPUT -p tcp --dport 10000 -m state --state NEW -j PORT10000

iptables -A INPUT -p tcp --dport 6900 -m state --state NEW -j PORT6900
iptables -A INPUT -p tcp --dport 6121 -m state --state NEW -j PORT6121
iptables -A INPUT -p tcp --dport 5121 -m state --state NEW -j PORT5121

iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-name p80 --hashlimit-mode srcip --hashlimit 50/min --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m hashlimit --hashlimit-name p443 --hashlimit-mode srcip --hashlimit 50/min --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ACCEPT
iptables -A INPUT -p tcp --dport 10000 -m hashlimit --hashlimit-name p10000 --hashlimit-mode srcip --hashlimit 50/min --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ACCEPT

iptables -A INPUT -p tcp --dport 6900 -j ACCEPT
iptables -A INPUT -p tcp --dport 6121 -j ACCEPT
iptables -A INPUT -p tcp --dport 5121 -j ACCEPT

iptables -A LOG_AND_DROP -m limit --limit 10/min -j LOG --log-prefix "[Log]"
iptables -A LOG_AND_DROP -j DROP

#iptables -A INPUT -m limit --limit 10/min -j LOG --log-prefix "[Default]"
iptables -A INPUT -d 147.135.37.113 -j DROP

アドバイスがあれば歓迎します。あらゆることを試しましたが、何も機能しません。

答え1

プロバイダ(OVH のような)に、システム上の DDoS 対策について問い合わせてください。すべてではありませんが、評判の良いプロバイダのほとんどが、この件であなたを助ける方法を持っています。それとは別に、フォーラム URL にアクセスするクライアントの Web サーバー ログを監視し、IPTables ルールを自動的に追加する、高度な fail2ban ルールの作成を検討することもできます。それとは別に、そこに何かを置くこともできます... おそらく非常に小さな 1 バイトのファイルでしょうか? または、Web サーバーを cloudflare などの CDN サービスの背後に置くこともできます。そのトラフィックのほとんどは、いくつかの方法で対処でき、サーバーやあなたにそれほどの負担をかけることはないはずです。ただし、ログ ファイルがファイル システムをいっぱいにしないように注意してください。これは、誰も望まないまったく別の問題を引き起こす可能性があります。

fail2ban を使用して Apache を DoS 攻撃から保護する方法の詳細については、こちらをご覧ください。https://apache.tutorials24x7.com/blog/protect-apache-from-brute-force-and-ddos-attacks-using-fail2ban

答え2

この単純な iptables で問題は解決しました (他のルールが複雑すぎたのかもしれません)

iptables -A INPUT -i eno1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eno1 -m state --state INVALID -j DROP
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p icmp -j ACCEPT
iptables -A INPUT -i eno1 -j DROP

攻撃は継続しますが、サーバーがダウンすることはありません。

答え3

いくつか思い浮かぶことがあります:

  1. Iptables で文字列一致を使用できます:

iptables -A INPUT -m 文字列 --algo bm --string "GET /foro" -j DROP

または、システムで可能な場合はTARPITを使用

iptables -A INPUT -m 文字列 --algo bm --string "GET /foro" -j TARPIT

  1. fail2ban を使用する代わりに、たとえばログの最後の 1000 行をスキャンし、ipset に一致するものをブロックする独自のスクリプトを作成します。これを iptables スクリプトに追加します。
  • ipset トイレを破壊する
  • ipset -N トイレ iphash
  • ipset 水洗トイレ

次に、スクリプトを使用して、ブロックする IP アドレスをテキスト ファイルに追加します。最終的には、すべての IP アドレスをそのトイレ リストにループするだけです。

  • ipset -A トイレ "$ipaddress"

ipset と特にマスクを使用すると、IP アドレスをブロックするよりもはるかに効率的です。約 20,000 個のアドレスと約 200 個のネットワークがブロックされています。

私の非常に乱雑なスクリプトからいくつかのアイデアが得られるかもしれません。 https://pastebin.com/4v5se0kh

面倒なのは承知していますが、私にとっては fail2ban よりはるかに高速で簡単です。このスクリプトには suc2ban という名前を付けました。ログファイルに合ったものを見つける必要があります (auth.log を使用する私の例ではなく、apache access.log を使用している可能性があります)。

関連情報