Я пытаюсь заставить 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 <ddos@yourfromdomain.foo>"
# Multiple accounts separated by commas
TO="admin@yourfromdomain.foo user@yourfromdomain.foo"
# 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"
В: А как насчет последней строчки? (rm -f ...)
A: Когда mod_evasive обнаруживает некоторые атаки, он создает файл (файл блокировки) в «DOSLogDir» с именем «dos- [sourceip]» (например, dos-8.8.8.8) и выполняет команду «DOSSystemCommand» один раз, пока этот файл не исчезнет. Поэтому, когда вы выполняете «iptables», вы должны удалить файл блокировки для следующей проверки.
Протестировано в Debian 7.
Удачи, привет.
Я попробовал подход из ответа Beast (спасибо !!), и мне пришлось изменить этот фрагмент, чтобы он работал:
/sbin/iptables -I INPUT -s $SOURCEIP -j DROP
echo "/sbin/iptables -D INPUT -s $SOURCEIP -j DROP" | at now + $BANNEDTIME
В основном мне пришлось добавить судо к командам / sbin / iptables и в внутри скрипта:
sudo /sbin/iptables -I INPUT -s $SOURCEIP -j DROP
echo "sudo /sbin/iptables -D INPUT -s $SOURCEIP -j DROP" | sudo at now + $BANNEDTIME
Мне потребовалось время, чтобы заметить это, поэтому я надеюсь, что публикация здесь может помочь другим попробовать это решение.
Мне удалось использовать приведенный выше ответ Beast, чтобы заставить его работать, но потребовались некоторые настройки.
В файл 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"
А также обновил скрипт, чтобы использовать этот путь.