netstatとiptablesによる最適なDDoS保護

良い一日!

最近では、DDoSのような問題に遭遇しました。 私はLinuxoidになったことは一度もありませんが、小さなプログラマーだということをすぐに言わなければなりません。したがって、以下はすべて、事実ではなく純粋に論理に基づいています。

多数の記事を掘り下げ、多くのオプションを試したが、防御に役立つものが見つかりませんでした。 記事「nginxとiptablesを使用して50mbからhttp DDoSを反映する簡単で効果的な方法」(D)DoS Deflateに 基づいて 、独自のスクリプトを作成することにしました。 まあ、私は本当に決めませんでしたが、タイピングと修正の方法によって彼は自分自身を明らかにしました。

アレクセイ・クズミンの記事は完璧ではない、と言わなければならない。 nginx`aログを掘り下げるだけでは不十分であり、ログ処理には多くのリソースが必要になる場合があります。 つまり、私の場合、50ギガ以上のログが作成され、リクエストは「GET / HTTP / 1.1」ではなく、「GET / HTTP / 1.0」であり、さらに、サーバー自体がリダイレクト(127.0.0.1)を受信しました。リクエストで表示されたログには表示されませんでした
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n 


スクリプトの本質は、一定の時間の後、スクリプトがクラウンから開始し、サーバーへのすべての接続、IP、およびファイルに書き込まれる接続の数をチェックすることです。 次に、接続が指定された数(20を持っている)を超えると、iptablesを介してこれらのIPをブロックするスクリプトが作成される別のスクリプトが起動します。

作業コース全体を個別に追跡するために個別のファイルを作成しました。自分の能力がなかったため、どこで何が機能しなかったかを簡単に見つけることができました。

今すぐ練習する:
スクリプトがあるディレクトリを作成します
 mkdir /usr/local/ddos 

その中でddos.shファイルを作成し、その権限を変更します。
 chmod 0755 /usr/local/ddos/ddos.sh 

それに書きます:

 #!/bin/sh #          ddos.iplist   tmp netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n > /tmp/ddos.iplist #     cat /dev/null > /tmp/iptables_ban.sh #  DROP   50    awk '{if ($1 > 20) {print "/sbin/iptables -I INPUT -p tcp --dport 80 -s " $2 " -j DROP" }}' /tmp/ddos.iplist >> /tmp/iptables_ban.sh #      ,        iptables echo "/sbin/iptables -L INPUT -v -n > /tmp/iptables.log" >> /tmp/iptables_ban.sh #     bash /tmp/iptables_ban.sh #    cat /dev/null > /var/log/ddos/error.log [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` 


それは基本的にそれです。 crontabを実行します。次のコマンドを使用します。
 EDITOR=mcedit crontab -e 

または単に
 crontab -e 

10分ごとに実行される新しいタスクを追加します。
 */10 * * * * /bin/sh /usr/local/ddos/ddos.sh 


また、マルチギガファイルが作成されないように、/ etc / logrotate.d / nginxファイルのログのローテーションをnginx`aから変更しました
 /var/log/nginx/*.log { daily size 20M missingok rotate 150 compress delaycompress notifempty create 640 root adm sharedscripts postrotate [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript } 


そして、1時間ごとに実行される別のタスクをクラウンに書き留めました
 0 * * * * /usr/sbin/logrotate /etc/logrotate.conf 


さて、より快適にするために、私は1日1回サーバーを再起動することにしました。
 0 4 * * * /sbin/reboot 


crontab -lを介した一般的なジョブリスト出力:
 */10 * * * * /bin/sh /usr/local/ddos/ddos.sh 0 * * * * /usr/sbin/logrotate /etc/logrotate.conf 0 4 * * * /sbin/reboot 


rootユーザーの下にすべてを書いたので、このユーザーの下にいない場合は、次のように各コマンドの前にrootを追加する必要があります。
 */10 * * * * root /bin/sh /usr/local/ddos/ddos.sh 


彼はすべての道を絶対にしました フルパスのないすべてのチームが機能したわけではありません。

この記事が誰かに役立つことを願っています。 コード自体で厳密に判断しないでください。 私はサーバー上で初めて自分で最初のことをしました)

Source: https://habr.com/ru/post/J204508/


All Articles