exim + greylist + spf
lipiec 10th, 2007Dziś z cyklu “Dobre rady i inne porady”
odcinek pt. “Optymalizacja Grelistingu przy wykorzystaniu SPF”
Otóż grelisting jest OK ale selektywny greylisting jest jeszcze lepszy. Idealnie byłoby gdyby opóźniane/testowane były tylko podejrzane przesyłki. Podejrzane czyli z dość dużym scoringem spamu, podejrzanym helo lub też nadawców z RBL.
Ponieważ mam drakońskie regułki i “cenie” czas CPU więc nie skanuję antyspamowo na etapie połączenia (tylko skaner antywirusowy), mam bardzo restrykcyjna weryfikację HELO/EHLO i odrzucam wiadomości na podstawie błędów SPF. Selektywny grelisting okazał się koniecznością ponieważ np. gmail.com wysyła z wielu serwerów(a ma ich bardzo dużo) i w bazie grelistigu pojawiało się wiele rekordów a przesyłki często nie trafiały do właściciela. Zaimplementowałem najprostsze rozwiązanie. Nie są greylistowane przesyłki z domen/serwerów gdzie test SPF wypadł pomyślnie. Rozwiązanie to radykalnie poprawiło jakość usług i bardzo odciążyło backup MX.
Najpierw baza danych dla rekordów
CREATE TABLE mta_greylist (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
relay_ip VARCHAR(64) NOT NULL DEFAULT '',
from_domain VARCHAR(255) NOT NULL DEFAULT '',
block_expires DATETIME NOT NULL,
record_expires DATETIME NOT NULL,
origin_type enum('MANUAL','AUTO') NOT NULL DEFAULT 'AUTO',
create_time DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY mta_greylist_uidx(relay_ip,from_domain)
) Type=MyISAM;
Wycinek z exim.conf
MYSQL_Q_GREYLIST_TEST = SELECT CASE \
WHEN now() - block_expires > 0 \
THEN 2 ELSE 1 END \
FROM mta_greylist \
WHERE relay_ip = '${quote_mysql:$sender_host_address}' \
AND from_domain = '${quote_mysql:$sender_address_domain}'
#
MYSQL_Q_GREYLIST_ADD = INSERT INTO mta_greylist (relay_ip, from_domain, \
block_expires, record_expires, create_time) \
VALUES ( '${quote_mysql:$sender_host_address}', \
'${quote_mysql:$sender_address_domain}', \
DATE_ADD(now(), INTERVAL 6 MINUTE), \
DATE_ADD(now(), INTERVAL 31 DAY), \
now() )
oraz poniżej w sekcji acl_check_rcpt jako jeden z ostatnich warunków (wymagana znajomość konfiguracji aby dobrze umiejscowić wpisy)
warn set acl_m2 = ${lookup mysql{MYSQL_Q_GREYLIST_TEST}{$value}{0}}
#
defer message = Greylisted - sproboj za chwile. \n\
Greylisted - please try again a little later.
hosts = !+relay_from_hosts
!spf = pass
condition = ${if eq{$acl_m2}{0}{1}}
condition = ${lookup mysql{MYSQL_Q_GREYLIST_ADD}{yes}{no}}
delay = 5s
log_message = [GREYLIST] Greylisted - please try again a little later.
#
defer message = Serwer tymczasowo niedostepny. \n\
Requested action aborted.
hosts = !+relay_from_hosts
!spf = pass
condition = ${if eq{$acl_m2}{1}{1}}
delay = 5s
log_message = [GREYLIST] Greylisted - Requested action aborted.
Tutaj słówko komentarza. MTA exim musi być skompilowany z path’em (w PLD już od jakiegoś czasu), oraz warto powyżej dodać w sekcji acl_check_rcpt odrzucanie przesyłek jeśli test SPF wypadł niepomyślnie. A na koniec kwestia bardzo istotna … odchudzanie tabel z rekordami.
delete from mta_greylist where record_expires < now();
optimize table mta_greylist;
Powyższe czynności do cron i np. co tydzień.
lipiec 29th, 2007 at 9:20 pm
hmmm fajne i cwane
sierpień 1st, 2007 at 8:50 pm
Ta tylko to wszystko w oparciu o MySQL a moze szanowny kolega by opisal cos dla ludzi co nie maja MySQL-a
sierpień 2nd, 2007 at 12:23 pm
hmmm ale takich ludzi jest ułamek
greylisting i przechowywanie rekordow w plikach jest proszeniem sie wprost o klopoty, wystarczy ze wzrosnie obciazenie i juz zaczynaja sie problemy
czerwiec 13th, 2008 at 3:19 pm
> greylisting i przechowywanie rekordow w plikach jest proszeniem sie wprost o
> klopoty, wystarczy ze wzrosnie obciazenie i juz zaczynaja sie problemy
Co za bzdura. Próbowałeś robić to bez bazy, czy tylko naczytałeś się na sieci ?
Wszystko zależy od ruchu: przy 2000 połączeń na dobę i adresach IP przechowywanych w pliku cdb nie ma problemów. Poza tym można nie przechowywać IP w plikach. Istnieją ciekawe rozwiązania, np. rozbicie oktetu na 4 liczby i przechowywanie tego w strukturze drzewa katalogów.
czerwiec 13th, 2008 at 3:51 pm
otoz testowalem i od tego typu operacji wlasnie sa bazy danych
czy to mysql / pgsql / ldap …
Z calym szacunkiem dla przedmowcy ale kazda porzadna baza danych ma pewne mechanizmy optymalizujace oraz mozliwosc przechowywania wiekszosci danych w pamieci natomiast kazdorazowe przegladanie struktury drzewa katalogow (a moze jeszcze nawet otwieranie i przeladanie plikow) w momencie gdy zostanie nawiazana sesja STMP to dosc … specyficzna metoda zwiekszenia wydajnosci oraz zywotnosci podsystemu dyskowego