exim + greylist + spf

lipiec 10th, 2007

Dziś 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ń.

5 Responses to “exim + greylist + spf”

  1. 1 czytacz
    lipiec 29th, 2007 at 9:20 pm

    hmmm fajne i cwane

  2. 2 bioly
    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

  3. 3 daniel
    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

  4. 4 osama
    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.

  5. 5 daniel
    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

Leave a Reply