#!/usr/bin/perl use constant DB_CACHE_SIZE => 5242880; # Объем ОЗУ для кэшироавния доступа к DB файлам. use constant TIMEOUT => 10; # Максимальное время проверки в сек. $cfg_data_path="/var/lib/spam_check"; $cfg_block_dir="/etc/spam_check/blocklist"; # Путь к лог файлу почтового сервера: $cfg_maillog_file = "/var/log/maillog"; # Путь к файлу с хэшем для предотвращения двойной проверки IP. # Чистка от старых записей производится через отдельный скрипт. # В качестве ключа выступает IP, в качестве значения время проверки этого IP. # Если время проверки отрицательное - то результат проверки показал признак # хоста пересылающего спам. $cfg_checker_cache_file = "$cfg_data_path/checked_ip.db"; # Путь к файлу с логом проверок. Если вместо файла указано "-" - вывод в STDOUT $cfg_log_file = "/var/log/spam_check/spam_check.log"; # Путь к файлу с данными о незавершенных в прошлой итерации почтовых запросов. $cfg_active_mail_file = "$cfg_data_path/.active_mail"; # Уровень говорливости лога: 0 - в лог только ошибки, # 1 - в лог только спамовские хосты, # 2 - в лог все проверки. # 3 - debug $cfg_verbose_level = 2; # Файл в котором будет формираться список блокировки спамовских хостов. $cfg_blocklist_file = "$cfg_block_dir/block_list.txt"; # Режим работы с лог файлом: # 0 - cron, периодический запуск через cron # 1 - tail, запускается один раз, постоянно следит за изменением в логе и # осуществляет проверку сразу после соединения хоста (в cron # прописывать не нужно). $cfg_log_watch_mode = 0; # Команда которая будет вызываться в случае обновления файла блокировки. $cfg_blocklist_rebuild_cmd = "/usr/sbin/postmap -w $cfg_block_dir/block_list.txt"; # более правильный вариант. # $cfg_blocklist_rebuild_cmd = "/usr/sbin/postmap -w $cfg_block_dir/block_list.txt; mv -f $cfg_block_dir/block_list.txt.db $cfg_block_dir/block_list.db"; # вариант при экспорте на DNSBL сервер. # $cfg_blocklist_rebuild_cmd = "/bin/gzip -c $cfg_block_dir/block_list.txt > $cfg_block_dir/block_list.txt.gz.new;mv $cfg_block_dir/block_list.txt.gz.new $cfg_block_dir/block_list.txt.gz"; # Минамальное время в сек. между запуском процесса перегенерации файла блокировки, # необходимо только для "tail" режима работы скрипта (cfg_log_watch_mode=1) # Определяет в общем виде быстроту реакции на спам. $cfg_blocklist_rebuild_interval = 20; # Формат списка блокировки: # 0 - "access" - стандартный access файл для MTA Postfix # 1 - формат rbldnsd $cfg_blocklist_format = 0; # Путь к файлу с локом. $cfg_lock_file = "$cfg_data_path/.lock"; # Максимальное время жизни лока, после которого лок файл будет удален. $cfg_lock_timetolive = 3600; # 1 час. # Путь к файлу с последней просмотренной позицией лога. $cfg_seek_file = "$cfg_data_path/.seek"; # Описание весов для различных факторов определяющих вероятность спама. %cfg_spam_factor = ( # Обратная проверка на наличие открытых сетевых протов. "open_ports" => { "25" => -3.5, # Уменьшаем вероятность спама, так как может быть это нормаольный почтовый сервер. "80" => -3, # Уменьшение FP, для хостов без MTA "110" => -3, # Уменьшение FP, для хостов без MTA "1025" => 1, # Сигнализирует о Windows машине. "5000" => 1.5, # 5000 (UPNP) порт показывает на вероятно взломанную машину "2001" => 1.5, # Порты которые используют троянские программы. "1025" => 1.5, "1400" => 1.5, "9100" => 1.5, "3389" => 1.5, "4444" => 1, #"1000" => 2, "1058" => 2, "3000" => 2, "1024" => 2, "666" => 2, "50505" => 2, #"5001" => 2, "12345" => 2, "12346" => 2, "30303" => 2, "31337" => 2, "3128" => 0.8, # Вероятно рассылка через открытые прокси. "1080" => 0.8, "8080" => 0.8, }, # Вес уровня домена от которого поступила почта, 0 - домен не резолвится. # "domain_level" => { 0 => 3, 1 => 0, # test.com 2 => -0.5, # mail.test.com 3 => 1, # bzq-218-1-51.cable.test.com 4 => 1.6, # 23.dsl-1.cable.test.com 5 => 1.8, # 34.53.12.53.test.com "N" => 2, # если уровень не описан выше цифрами. }, # Regex маски слов встречающихся в имени домена. "domain_mask" => { '(client|dial|dsl|cable|pool|ppp|node)' => 2, '\-\d+\-\d+\-\d+' => 3, 'smtp|mail|relay' => -3, }, # Коэффициент умножения веса, для последующих соединений с данного IP за # за текущий день. # - Если равен 1, то пересчет не производится, блокирование в зависимости от числа запросов запрещено. # - Если равен 0, апдейт базы при повторных запросах не производится вообще. "reconnect_mul" => 1.0, # При каждом повторном коннекте в течении дня умножаем вес на 1.1 # Минимальный вес при котором блокируем IP как спамера. "block_weight" => 3 # Если суммарный вес получился >= 3, то считаем хост спамером. ); # Маска для выборки из почтового лога строк отражающих соедниение с почтовым сервером. # В первой скобке - имя хоста, во второй IP # Для postfix: $cfg_maillog_connect_mask=': connect from ([^\[]+)\[(\d+\.\d+\.\d+\.\d+)\]\s*'; $cfg_maillog_disconnect_mask=': disconnect from ([^\[]+)\[(\d+\.\d+\.\d+\.\d+)\]\s*'; # Формат анализируемого лога: # 0 - postfix # 1 - sendmail $cfg_log_format = 0; # Для sendamil (у sendmail нет connect/disconnect сообщений в логе) используется # только $cfg_maillog_disconnect_mask (раскомментируйте строку ниже): # $cfg_maillog_disconnect_mask=': from=<[^>]*>,.* relay=([^\[ ]+)\s*\[(\d+\.\d+\.\d+\.\d+)\]\s*'; # Маска для выборки из почтового лога строк по которым определяем уже отвергнутые соединения. # Чтобы не проверять лишний раз. В скобке IP. $cfg_maillog_reject_mask=': reject: RCPT from [^\[]+\[(\d+\.\d+\.\d+\.\d+)\]: 55.* (Client host rejected|Service unavailable)'; # Маска по имени домена, при совпадении которой будет производится проверка. #$cfg_block_mask='\d[\-\.](dsl|adsl|dial|cable)\.'; $cfg_block_mask=""; # Маска хостов для которых не выполняется проверка на спам (для .ru шлем abuse, а не блокирвем сгоряча). $cfg_ignore_mask='\.(ru|su|ua|by)$'; # Список IP адресов для которых не будет выполняться проверка (локальные IP) @cfg_local_ip_list = ("127.0.0.0/8", "192.168.0.0/16");