Спамеры обнаглели - вчера они умудрялись пропихивать к почтовику до 600 спам-соединений одномоментно. В общем, мне надоело, что, хоть спам и эффективно режется, но порядок энтропии во Вселенной возрастает, поэтому в фильтр spamass-milter я дописал три строчки в процедуру отброса сообщений с признаком "спам". Эти три строчки сохраняют IP-адрес, с которого пришло спам-письмо, в текстовой файл.

Затем я написал скриптик, который полученные адреса подставляет в iptables с правилом "послать на ...й" и держит их в этом режиме один час, после чего соединения с того адреса снова разрешаются. Для этого скрипт вызывается cron'ом ежеминутно.



Данное решение не претендует на универсальность.

=== патч spamass-milter ===

diff -Naur spamass-milter-0.2.0/spamass-milter.cpp spamass-milter-0.2.0-1/spamass-milter.cpp

--- spamass-milter-0.2.0/spamass-milter.cpp 2004-12-05 17:10:44.000000000 +0300

+++ spamass-milter-0.2.0-1/spamass-milter.cpp 2007-07-04 16:51:13.000000000 +0400

@@ -379,6 +379,11 @@

{

debug(D_MISC, "Rejecting");

smfi_setreply(ctx, "550", "5.7.1", "Blocked by SpamAssassin");

+/* Запись IP-адреса спамера в текстовой файл */

+ FILE *log=fopen("/var/spool/antispam/spamip.txt", "at");

+ fprintf(log, "%s\n", inet_ntoa(((context *)smfi_getpriv(ctx))->connect_ip));

+ fclose (log);

+

return SMFIS_REJECT;

}

}

=== конец патча ===



Скрипт, как было указано, должен вызываться как можно чаще, в идеале - сразу после получения IP, однако это уже тянет на полноценную программу. В переменной TEMP_VAR хранится размер очереди и. соответсвенно, время пребывания адреса в чёрном списке. Чем больше значение - больше времени.

=== текст скрипта ===

#!/bin/bash

BAD_IP_FILELIST_DIR=/var/spool/antispam

TEMP_VAR=60

for bad_spammer_ip in `cat $BAD_IP_FILELIST_DIR/spamip.txt.$TEMP_VAR`

do

iptables -D INPUT -s $bad_spammer_ip -j REJECT

done



rm -f $BAD_IP_FILELIST_DIR/spamip.txt.$TEMP_VAR



while [ $TEMP_VAR -gt 1 ]; do

let TEMP_VAR1=$TEMP_VAR-1

mv -f $BAD_IP_FILELIST_DIR/spamip.txt.$TEMP_VAR1 $BAD_IP_FILELIST_DIR/spamip.txt.$TEMP_VAR

let TEMP_VAR=$TEMP_VAR-1

done;



mv -f $BAD_IP_FILELIST_DIR/spamip.txt $BAD_IP_FILELIST_DIR/spamip.txt.1

touch $BAD_IP_FILELIST_DIR/spamip.txt



for bad_spammer_ip in `cat $BAD_IP_FILELIST_DIR/spamip.txt.1`

do

iptables -A INPUT -s $bad_spammer_ip -j REJECT

done

=== конец скрипта ===