Главная > Linux, Network, Новости > Противодействие флуду спамеров с помощью модуля iptables recent

Противодействие флуду спамеров с помощью модуля iptables recent

13 марта 2010

В начале 2009 года возникла проблема с почтовым сервером. Резко активизировались спамеры. Кризис на них что ли так подействовал?

Сотни тысяч подключений за сутки, более 100 одновременных подключений.

Поскольку у нас сервер один и для внутренних пользователей и для приёма почты извне, это препятствовало отправке почты внутренними пользователями.

Среднесрочные результаты включения фильтрации

Статистика Postfix за сутки (12 февраля 2009)

--------------------- Postfix Begin (detail=5) ------------------------

 ****** Summary *************************************************************************************

        3   *Fatal:   General fatal
        1   *Warning: Startup error
       30   *Warning: Connection concurrency limit reached
       16   *Warning: Connection overload
        3   Process exited
        6   SASL authentication failed
       61   Miscellaneous warnings 

  467.026M  Bytes accepted                       489,711,732
  585.803M  Bytes delivered                      614,258,585
 ========   ================================================

     2357   Accepted                                   2.41%
    95370   Rejected                                  97.59%
 --------   ------------------------------------------------
    97727   Total                                    100.00%
 ========   ================================================

       61   Reject relay denied                        0.06%
    73065   Reject unknown user                       76.61%
      504   Reject sender address                      0.53%
    21709   Reject client host                        22.76%
       31   Reject message size                        0.03%
 --------   ------------------------------------------------
    95370   Total Rejects                            100.00%
 ========   ================================================

      418   4xx Reject sender address                  0.11%
   393200   4xx Reject unknown reverse client host    99.89%
 --------   ------------------------------------------------
   393618   Total 4xx Rejects                        100.00%
 ========   ================================================
   157920   Connections made
   137931   Connections lost
   157913   Disconnections
     2341   Removed from queue
      990   Delivered
      400   Sent via SMTP
       17   Forwarded
        3   Resent
       54   Deferred
      312   Deferrals
     1528   Bounce (local)
      973   Bounce (remote)
        3   Notification sent: delivery 

Надо было что то придумать. Конечно правильнее всего было составлять список IP спамеров внутри Postfix или amavisd, но это сложнее. Решил обойтись одним файрволом.

Правила iptables. Закомментированные правила записи в лог использовались при отладке.

:SMTP_INPUT_LOCKED - [0:0]
:SMTP_INPUT_LOCK - [0:0]
:SMTP_INPUT_UNLOCK - [0:0]
:SMTP_INPUT - [0:0]

# Если хост подключился после 30 минут молчания разблокируем
-A SMTP_INPUT_LOCKED -m recent ! --rcheck --seconds 1800 --name SMTP_INPUT_LOCK -j SMTP_INPUT_UNLOCK
# Иначе пишем в журнал
#-A SMTP_INPUT_LOCKED -m recent --rcheck --name SMTP_INPUT_LOCK -j LOG --log-level info --log-prefix "Log smtp INPUT spma/virus DROP"
# Обновляем recent список и сбрасываем пакет
-A SMTP_INPUT_LOCKED -m recent --update --name SMTP_INPUT_LOCK -j DROP   

-A SMTP_INPUT_LOCK -m recent --set --name SMTP_INPUT_LOCK
#-A SMTP_INPUT_LOCK -j LOG --log-level warning --log-prefix "SMTP_INPUT_LOCK " -m comment --comment "Log smtp INPUT spam/virus lock"
-A SMTP_INPUT_LOCK -j SMTP_INPUT_LOCKED   

-A SMTP_INPUT_UNLOCK -m recent ! --rcheck --name SMTP_INPUT_LOCK -j RETURN
-A SMTP_INPUT_UNLOCK -m recent --remove --name SMTP_INPUT_LOCK
#-A SMTP_INPUT_UNLOCK -j LOG --log-level warning --log-prefix "SMTP_INPUT_UNLOCK " -m comment --comment "Log smtp INPUT spam/virus unlock"   

# исключения для хостов которые могут интенсивно отправлять почту
-A SMTP_INPUT -i lo -j RETURN -m comment --comment "Dont filter loopback traffic"
#-A SMTP_INPUT -i eth0 -j RETURN -m comment --comment "Dont filter internal traffic"
-A SMTP_INPUT -s ___.___.___.___ -j RETURN -m comment --comment "Dont filter Backup MX"
-A SMTP_INPUT -s 172.16.11.103 -j RETURN -m comment --comment "Dont filter zabbix"
# Проверка установленной блокировки
-A SMTP_INPUT -m recent --rcheck --name SMTP_INPUT_LOCK -j SMTP_INPUT_LOCKED
# Обновление списка SMTP_INPUT_RECENT
-A SMTP_INPUT -m recent --set --name SMTP_INPUT_RECENT
# Критерии блокировки 5 раз за 20 секунд или 20 раз за 400 секунд
-A SMTP_INPUT -m recent --rcheck --seconds 20 --hitcount 5 --name SMTP_INPUT_RECENT -j SMTP_INPUT_LOCK
-A SMTP_INPUT -m recent --rcheck --seconds 400 --hitcount 20 --name SMTP_INPUT_RECENT -j SMTP_INPUT_LOCK
#-A SMTP_INPUT -j LOG --log-level debug --log-prefix "ipt_INPUT_SMTP_PASS "
# Обрабатваем все новые подключения к портам SMTP (по SSL спамеры пока не ломятся, но в принципе ничто не мешает, а мне не жалко)
-A INPUT -m conntrack --ctstate NEW -p tcp -m tcp --dport 25 -j SMTP_INPUT
-A INPUT -m conntrack --ctstate NEW -p tcp -m tcp --dport 465 -j SMTP_INPUT


Отладка работы кортокого фильтра

Отладка работы кортокого фильтра

Один фильтр не справляется. Не удается снизить число коннектов ниже 60. Некоторые спамеры ставят большой таймаут между попытками.


Подбор параметров для двух фильтров - промежуточный вариант

Подбор параметров для двух фильтров - промежуточный вариант

Попытка работать с двумя фильтрами.


Работа с двумя фильтрами 4/5 и 20/400

Работа с двумя фильтрами 4/5 и 20/400

Окончательный вариант с двумя фильтрами. (4 коннекта /20 секунд) и (20 коннектов / 400 секунд)

Видно быстрое срезание пика и всплесков и устойчивое падение до 40 коннектов.


Среднесрочные результаты включения фильтрации

Среднесрочные результаты включения фильтрации

Результат работы на графике за сутки. На левых 6 часах видна загрузка smtpd до внедрения филтров. Далее загрузка после внедрения фильтров.

Колличество коннектов почти никогда не достигает 100. Конечно можно бы было для заблокированных хостов использовать не DROP, а TARPIT. Но в CentOS этот модуль файрвола не входит. Так что и так не плохо.

Кстати за весь 2009 год активность спамеров упала.

TCP подключения на 25 порт, за 2009 год

TCP подключения на 25 порт, за 2009 год

На этом графике отображены все подключения, но поскольку спам составляет 90% почтового трафика. наличием тут полезной почты можно видимо принебреч.

Поделитесь информацией

Метки:, ,
Categories: Linux, Network, Новости Tags: , ,
  1. mmv
    12 Май 2010 в 10:15 | #1

    Кстати еще можно ограничить в файрволе количество одновременных smtp подключений извне. Это по крайней мере позволит отправлять почту изнутри сети. Но всё равно будет создавать проблемы внешним пользователям, пользующимся почтой через Интернет.

  2. mmv
    12 Август 2010 в 16:07 | #2

    Попалась очень интересная утилита, решающая аналогичную задачу.

    Fail2ban — www.fail2ban.org/wiki/index.php/Main_Page

    Добавляющая правила файрвола на основе анализа логов неудачных попыток авторизации. Возможно эту утилиту можно использовать и для детектирования большого количества неудачных попыток отправки спама.

Комментирование отключено.