Сохраняем в файл скрипт: #!/bin/sh
# Защита от спамовских атак и от BRUTE-атак с помощью IPTABLES
# REJECT_BRUTERS v.1.0 Lev Zabudkin. zabudkin@mail.ru. http://zabudkin.ru
# 23.03.2010
#
# Описание:
# Данный скрипт позволяет Вам, используя iptables заблокировать
# дальнейшие попытки соединения от надоедливых хостов,
# которые пытались приконнектиться в течении определенного Вами времени
# и определенное Вами количество раз.
#
# Итак поехали:
#
# Мы создаём ниже переменную IPTABLES, дабы не указывать постоянно где он лежит
# Где у Вас лежит iptables? (подсказка: # whereis iptables)
IPTABLES="/sbin/iptables"
# На каком сетевом интерфейсе контролировать коннекты
CHECK_INT="ppp0"
# Сколько именно коннектов Вы разрешаете с одного хоста?
# В данном случае указано 2, чего вполне достаточно для SMTP.
MAXIMUM_CONNECTIONS_PER_PERIOD=2
# А в течение скольки секунд они разрешены?
PERIOD_SECONDS=60
# Пояснение: Если в течении Выше указанных секунд хост (в данном примере любой(!))
# попытается приконнектиться к Вам, то соединение будет отброшено (см. -j DROP)
# причем НАВСЕГДА, т.е ДО ТЕХ ПОР, пока Вы не обнулите цепочку BRUTE_CHECK
# ключём -F BRUTE_CHECK команды iptables
# Создаём цепочку BRUTE_CHECK
$IPTABLES -N BRUTE_CHECK
# Обнуляем правила цепочки BRUTE_CHECK
$IPTABLES -F BRUTE_CHECK
# В данном случае мы удаляем ранее сделанное "перенаправление" (см. чуть ниже)
# чтобы этот скрипт можно было вызывать многократно
$IPTABLES -D INPUT -j BRUTE_CHECK
# В данном случае мы "перенаправляем" для обработки входящие пакеты
# в нашу созданную цепочку
$IPTABLES -A INPUT -j BRUTE_CHECK
# А тут уже пошли наши правила, которые гласят:
# все входящие пакеты на сетевой интерфейс (мы его указали выше),
# которые являются для нас новыми (см. state) и которые соответствуют нашим
# параметрам (см. выше), мы отбрасываем.
$IPTABLES -A BRUTE_CHECK -i $CHECK_INT -p tcp -m state --state NEW -m recent --set --name BRUTE
# См. Ниже Пояснение, если понадобится, то раскоментируете нижеприведенную строку
# (просто уберите символ решетки - #)
#$IPTABLES -A BRUTE_CHECK -i $CHECK_INT -p tcp -m state --state NEW -m recent --update --seconds $PERIOD_SECONDS \
# --hitcount $MAXIMUM_CONNECTIONS_PER_PERIOD --rttl --name BRUTE -j LOG --log-level 4 --log-prefix '** BRUTE **'
$IPTABLES -A BRUTE_CHECK -i $CHECK_INT -p tcp -m state --state NEW -m recent --update --seconds $PERIOD_SECONDS \
--hitcount $MAXIMUM_CONNECTIONS_PER_PERIOD --rttl --name BRUTE -j DROP
Пояснение:
Для того, чтобы видеть, каких же успехов Вы добились, применив выше написанное, проделайте следующее:
откройте файл /etc/syslog.conf и добавьте в конец строку:
kern.warning /var/log/iptables.log
затем перезапустите syslog:
/etc/init.d/syslog restart
(если у Вас Ubuntu, то наверное это sysklogd)
События (про попытки) будут записываться в файл /var/log/iptables.log,
его и смотрите.
Да, и будет не лишним добавить данный скрипт в CRON (/etc/crontab),
скажем каждые 5 минут:
*/5 * * * * root Путь/ВашСкрипт
URL:
Обсуждается: http://www.opennet.dev/tips/info/2338.shtml