Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Сергей Супрунов
Защита от спама на сервере провайдера по сравнению с «корпоративным» почтовым сервером имеет свои особенности.
Во-первых, здесь нет жёстких правил документооборота, позволяющих быть уверенным, что никто не ждёт писем в одной из японских кодировок или идущих с израильских доменов.
Во-вторых, среднестатистический абонент обычно не настолько владеет компьютером, чтобы эффективно осуществлять «обучение» различных систем контентной фильтрации, а сисадмину заниматься анализом карантина негоже (в том числе и по этическим соображениям). Всё это делает системы типа Spamassassin или DSPAM не очень эффективными либо требующими повышенного внимания со стороны администратора.
К тому же контентная фильтрация совсем не способствует экономии трафика. Более того, если значительная часть писем будет «рубиться» на сервере после загрузки и не попадёт к конечным пользователям, то этот трафик приходится рассматривать как прямые убытки компании (то есть компания «покупает» спам, но клиенту уже не «перепродаёт»).
Из методов же, позволяющих трафик экономить, более-менее безопасно можно использовать разве что грейлистинг. Хотя в моей практике встречались клиенты, головные офисы которых оказывались не в состоянии обеспечить должную работу почтового сервера (а виноват, как обычно, провайдер, поскольку «в другие районы всё отправляется»).
Эффективность грейлистинга сравнительно высока (на моём сервере он отсекал до 95% «мусора»), тем не менее есть и некоторые недостатки:
n его не так уж сложно обойти;
n каждое соединение отнимает определённое время, поскольку решение принимается лишь после этапа «RCPT TO» SMTP-диалога (а то и после команды «DATA», если включены опции, призванные обеспечить взаимодействие с серверами, использующими конкурирующий алгоритм защиты от спама – callback);
n затрачиваются определённые ресурсы на ведение базы триплетов.
К тому же используемый мною milter-greylist (в связке с Sendmail) под нагрузкой иногда переставал вовремя отвечать на запросы, что приводило к тому, что соединения ещё дольше оставались открытыми, увеличивая число одновременно работающих экземпляров sendmail до максимально возможного, нарушая тем самым обслуживание клиентов.
Когда ресурсы сервера оказались практически исчерпаны, было принято решение о дополнительной фильтрации на первой линии обороны, призванной снизить нагрузку на milter-greylist и используемый для проверки на вирусы ClamAV, пусть даже и ценой «разумного риска» ложных срабатываний. От «чёрных списков» на основе DNSBL я почти отказался – слишком уж часто какой-то из «клиентских» серверов куда-нибудь попадает, и приходится разбираться с тамошними админами и клиентами. Поэтому я решил-таки залезть в дебри sendmail.cf и воспользоваться способностью Sendmail выполнять фильтрацию сообщений на основе регулярных выражений.
Sendmail позволяет «вмешаться» в процесс приёма сообщения на различных этапах (см. рисунок). Поскольку наша задача – отсечь вероятный спам как можно раньше, то интерес для нас представляет в первую очередь набор правил check_relay, получающий в качестве параметра выражение вида «<hostname> $| <ip-address>», где hostname – имя хоста, ip-address – IP-адрес источника соединения. (Наборы check_mail и check_rcpt срабатывают после SMTP-команд «MAIL FROM» и «RCPT TO», получая в качестве параметра соответственно адрес отправителя или адрес получателя. Также опцией FEATURE(`compat_check') в mc-файле можно подключить не показанный на рисунке «общий» набор check_compat, принимающий в качестве параметра и адрес отправителя, и адрес получателя и выполняющийся после приёма всего сообщения. Сейчас эти наборы нам не столь интересны.) По умолчанию check_relay (точнее, Basic_check_relay) отвечает за «прогон» соединений по базе access и за работу «чёрных списков» (dnsbl) и выполняется до того, как в работу включатся внешние фильтры (работающие через milter-интерфейс). Определять свои правила обработки лучше всего в наборе правил Local_check_relay (по умолчанию наборы Local_check_* пусты), который будет вызываться первым, до Basic_check_relay. Синтаксис рассмотрим ниже, после того как определимся с общими правилами фильтрации.