Спамеры обнаглели - вчера они умудрялись пропихивать к почтовику до 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
=== конец скрипта ===