Mod_evasiveを取得してスクリプトを起動し、問題のあるホストを拒否するiptablesルールを追加しようとしています。私は両方の答えからの提案を試しました ここ しかし私はまだそれを機能させることができません。リンクされている投稿とは別に、私は概説されているようにスクリプトを実行しようとしています この記事で 。
私のApache設定にはこれがあります
_DOSSystemCommand "Sudo -u root /root/scripts/ban_ip.sh %s"
_
スクリプトにはこれがあります
_#!/bin/sh
IP=$1
IPTABLES=/sbin/iptables
$IPTABLES -A banned -s $IP -p TCP -j DROP
echo "$IPTABLES -D banned -s $IP -p TCP -j DROP" | at now + 5 minutes
_
「禁止された」チェーンを作成しました(これをINPUTチェーンに追加しようとしましたが無駄になりました)
私の/ etc/sudoersは次のようになります:
Apache ALL=(root) NOPASSWD: /root/scripts/ban_ip.sh *
SELinuxを無効にして、邪魔にならないようにしました。 _su Apache --Shell=/bin/bash
_と_Sudo /root/scripts/ban_ip.sh 10.10.10.10
_を実行できますが、問題なく動作します。
しかし、ソースがmod_evasionで悪意のあるものとしてフラグが立てられると、403でホストを拒否しますが、スクリプトを実行することはないため、ここでは実際には何の利点も得られません。
これを機能させるために他に何を試みることができますか?
私のシステムは動作します! :)
必要条件:
注:他のメールエージェントを使用して、スクリプトを変更できます。
今私の設定:
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 10
DOSSiteCount 150
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
DOSSystemCommand "Sudo /usr/local/bin/ddos_system.sh %s"
DOSLogDir "/tmp"
</IfModule>
www-data ALL=NOPASSWD: /sbin/iptables *, /usr/bin/at *
#!/bin/bash
#set -x
[ -z $1 ] && (echo "Usage: $0 <sourceip>"; exit 1)
[ -x /usr/bin/at ] || (echo "Please, install 'at'"; exit 1)
#############
## OPTIONS
#
SOURCEIP="$1"
HOSTNAME=$(/bin/hostname -f)
BODYMAIL="/tmp/bodymailddos"
MODEVASIVE_DOSLogDir="/tmp"
FROM="Anti DDOS System <[email protected]>"
# Multiple accounts separated by commas
TO="[email protected] [email protected]"
# Time-units can be minutes, hours, days, or weeks
BANNEDTIME="1 minute"
#
##
############
# Custom mail message
{
echo "Massive connections has been detected from this source IP: $SOURCEIP
The system has blocked the IP in the firewall for $BANNEDTIME. If the problem persist you should block that IP permanently.
- Anti DDOS System -"
} > $BODYMAIL
/sbin/iptables -I INPUT -s $SOURCEIP -j DROP
echo "/sbin/iptables -D INPUT -s $SOURCEIP -j DROP" | at now + $BANNEDTIME
cat $BODYMAIL | /usr/bin/mail -r "$FROM" -s "DDOS Attack Detected - $HOSTNAME" $TO
rm -f "$MODEVASIVE_DOSLogDir/dos-$SOURCEIP"
Q:最後の行はどうですか? (rm -f ...)
A:mod_evasiveが攻撃を検出した場合「DOSLogDir」に「dos- [sourceip]」(例:dos-8.8.8.8)という名前のファイル(ロックファイル)を作成し、そのファイルが消えるまで「DOSSystemCommand」を1回実行します。したがって、「iptables」を実行するときは、次のチェックのためにロックファイルを削除する必要があります。
Debian7でテスト済み。
頑張ってください。
私はビーストレスポンスからのアプローチを試しました(ありがとう!!)そしてそれを機能させるためにこのフラグメントを変更しなければなりませんでした:
/sbin/iptables -I INPUT -s $SOURCEIP -j DROP
echo "/sbin/iptables -D INPUT -s $SOURCEIP -j DROP" | at now + $BANNEDTIME
基本的に、スクリプト内でコマンドにSudoを追加する必要がありました/ sbin/iptablesおよびat:
Sudo /sbin/iptables -I INPUT -s $SOURCEIP -j DROP
echo "Sudo /sbin/iptables -D INPUT -s $SOURCEIP -j DROP" | Sudo at now + $BANNEDTIME
これに気付くのに少し時間がかかりましたので、ここに投稿することで他の人がこの解決策を試すのに役立つことを願っています。
私はそれを機能させるためにビーストによる上記の答えをなんとか使用しましたが、いくつかの調整が必要でした。
Sudoersファイル(/ etc/sudoers)にこの行を追加する必要があります。そうしないと、スクリプトが実行されませんでした。
www-data ALL=NOPASSWD: /usr/local/bin/ddos_system.sh *
これらのコマンドは、適切なアクセス許可を与えてスクリプトを保護するためにも必要です。
mkdir /var/log/mod_evasive
chown www-data /var/log/mod_evasive
chown root /usr/local/bin/ddos_system.sh
chmod 700 /usr/local/bin/ddos_system.sh
また、Sudoコマンドを追加するためにスクリプトを変更する必要はありませんでした。
使った
DOSLogDir "/var/log/mod_evasive"
また、このパスを使用するようにスクリプトを更新しました。