Pull to refresh

Дёшево и сердито блокируем 85% спама: greysmtpd

Reading time3 min
Views3K
Пока я не стал фрилансером, я не знал, что такое спам. У меня хватало ума не светить свой email где попало, а для регистраций на сайтах использовать временные email. И я привык к тому, что вся почта у меня бегает очень быстро, письма никогда не теряются, и никто не жалуется что мой сервер отказался принимать его письмо. Став фрилансером, я оказался вынужден опубликовать свой email, причём на многих сайтах — ведь новые клиенты должны иметь возможность легко со мной связаться. И спам полился… сначала небольшим ручейком, но в последнее время он уже напоминает скорее полноводную реку, чем ручеёк.

Использование традиционных спам-фильтров (RBL, GMail, SpamAssassin, etc.) меня не устроило: все они время от времени ошибаются, и принимают за спам нормальные письма. И не важно, они их давят, возвращают отправителю, или складируют в отдельную папку чтобы я их периодически просматривал — в любом случае есть ненулевая вероятность потерять важное письмо.

Несколько лет проблема решалась с помощью утилитки deliver, которую я написал для удобства фильтрации почты. Perl-программистам использующим qmail она должна понравится: фактически фильтрация осуществляется с помощью регулярных выражений Perl, удобно применяемых к нужным частям письма (фильтр — это Perl-скрипт :)). Я глазками анализировал получаемый спам, и аккуратно писал под него регулярные выражения, которые 100% не совпали бы с нормальными письмами.

Но в последнее время спам адаптируется к моим интересам, и маскируется под IT-тематику. И хорошо, собака, маскируется — настолько хорошо, что я уже не могу уверенно написать regexp, который даже случайно не совпадёт с нормальным письмом. (Заметьте, я чётко отличить конкретный спам ручным regexp-ом, фактически даже специализированным Perl-скриптом, уже не в состоянии, как же это может сделать SpamAssassin сотоварищи?)

Пришлось искать альтернативный подход к этой проблеме… и он был найден, это greylisting! К сожалению, найти реализацию greylisting для qmail оказалось не просто. В принципе их есть несколько штук, но они либо требуют патчить qmail, либо написаны на коленке, либо сильно перегружены дополнительной функциональностью. А я это сильно не люблю, предпочитаю простой, надёжный и безопасный софт — например такой, какой пишет D. J. Bernstein.

В результате я сначала поставил qgreylistrbl — потестировать эффективность greylisting. А потом, восхищённый результатом работы (но не реализацией) qgreylistrbl, написал greysmtpd.

Установить greysmtpd очень просто — это штука из тех, которые «воткнул и забыл», даже настраивать ничего не нужно. Большой плюс этого подхода в том, что спама моментально станет примерно на 85% меньше, и при этом вы гарантированно не потеряете нормальное письмо. А если (когда) спамеры адаптируются к greylisting, то эффективность его упадёт, но вреда от него по-прежнему не будет. В общем, это штука из разряда must have!

Надо отметить, что greysmtpd оптимизирован для того, чтобы свести задержки при доставке нормальной почты к минимуму — в абсолютном большинстве случаев нормальная почта будет доставляться вообще без задержек, как будто greysmtpd вообще не используется. Достигается это использованием RBL и встроенного определителя динамических хостов (DSL, dial-up, etc.): если IP отправителя почты не заблокирован в RBL и домен отправителя (PTR) не похож на динамический хост — почта от него пропускается сразу, без использования greylisting. (Да, я использую RBL, но не для блокирования почты, а всего лишь для форсирования greylisting. Ибо все мы, время от времени, попадаем в RBL.) В общем, получается эдакий «мягкий greylisting» — минимум помех нормальной работе при отличном проценте блокируемого спама.

Сам скрипт я постарался сделать надёжным, простым и эффективным. Например, если в скрипте возникает какая-либо ошибка, он просто пропускает текущее письмо, как если бы greysmtpd вообще небыл установлен. Реализация SMTP слизана один-в-один с djb'шной утилиты rblsmtpd. А для эффективности DNS-запросы выполняются асинхронно. Ну и плюс все возможные оптимизации, позволяющие вообще избежать запросов в RBL, т.к. RBL штука тормознутая. Размер скрипта — 200 строк, 5.5KB.

Лицензия, как обычно, public domain.

Скачать: greysmtpd, deliver.

Критика и code review приветствуются. :)
Tags:
Hubs:
Total votes 54: ↑50 and ↓4+46
Comments56

Articles