Exim: избавляемся от спама за пол-часа. Часть 2 — результаты.

Итак, прошло немало времени с момента введения правил реджекта сообщенийspam(http://jroger.info/2009/11/01/23/).
Сегодня я поднял статистику exim за период с 31 июля по 16 ноября (три с половиной месяца)

Результаты очень радуют:

Top 50 mail rejection reasons by message count
----------------------------------------------
  Messages   Mail rejection reason
      3870   Rejected RCPT: Unknown user
      2351   RFC compliant date required.
      1421   HELO should be Fully Qualified Domain Name  Host.Domain.Tld  See RFC821
       807   Rejected RCPT: Sender verify failed
       403   RFC compliant to required.
       372   Message headers contain non ASCII chars.
       122   SMTP protocol synchronization error
       111   Rejected RCPT: relay not permitted
       105   HELO should be hostname.
        60   Unknown
        50   Rejected HELO/EHLO: syntactically invalid argument
        22   Closed connection in response to initial connection
        16   RFC 1918 IP address in HELO.
         5   Dropped: too many nonmail commands
         3   Rejected RCPT: Restricted characters in address
         2   Rejected RCPT: authentication required
         1   Closed connection in response to end of data

Из вставки видно, что несколько разумно сформированых правил отлупа срезали чуть больше пяти тысяч спам-сообщений.
Есть повод для гордости :-)

Sincerelly,
JRoger

Exim: избавляемся от спама за пол-часа

Надоело говно в ящиках и скотское количество smtp трафика?spam
Тогда приступим.

1. Конечно же exim!
2. Конечно же в исходнике!
3. Конечно же собираем ручками!
(сборку описывать не стану — этого добра в инетке не меньше, чем порнухи :)

После сборки-установки начинаем править конфиг. Прописываем свои домены.
По желанию собираем и подключаем avast антивирус (я использую).
Подключаем SMTP-аутентификацию юзеров (хоть mysql, хоть что-то другое)

Далее начинается самое интересное:

В acl_check_rcpt по дефолту присутствует следующее:

—————————————————

acl_check_rcpt:

[бла-бла-бла]

# Аутентифицированым везде у нас дорога
# Аутентифицированым везде у нас почет
  accept  authenticated = *

[бла-бла-бла]

—————————————————
это нам ничуть не мешает, а очень даже помогает

А далее начинаются проверки. В acl_check_data пихаем:
—————————————————

acl_check_data:

# Аутентифицированым везде у нас дорога
# Аутентифицированым везде у нас почет
#
# Приемлимо, если есть уверенность в отсутствии вирусни у юзеров, дабы не рассылали.
# Я юзаю на виндовых клиентах Thunderbird и никакого Бата или Некрофост Аутглюков (Экспресс)
#
  accept  authenticated = *

# Проверяем наличие RFC даты
# Немного спам-ботов балуют правильно оформленной датой. Режем.
#
  defer
    message   = RFC compliant date required.
    condition = ${if !match\
      {$h_date:}\
      {\N[0-9]\N}\
      {yes}{no}}

# Проверяем наличие RFC To
# Немного спам-ботов балуют правильно оформленным полем To. Режем.
#
  defer
    message   = RFC compliant to required.
    condition = ${if !match\
      {$h_to:}\
      {\N.+\N}\
    {yes}{no}}

# Проверяем наличие не ASCII символов, за исключением UTF-8
# Немного спам-ботов балуют правильно оформленной кодировкой. Режем.
#
# Тут надо с некоторой оглядкой - некоторые форумы и прочие самоделки рассылают как попало, без соблюдения кодировки.
#
  defer
    message   = Message headers contain non ASCII chars.
    condition = ${if !match\
      {${lc:$h_content-type:}}\
      {\Nutf-?8\N}\
    {yes}{no}}
    condition = \
      ${if \
        or {\
          {match{$rh_bcc:}{\N[\x80-\xff]\N}}\
          {match{$rh_cc:}{\N[\x80-\xff]\N}}\
          {match{$rh_date:}{\N[\x80-\xff]\N}}\
          {match{$rh_from:}{\N[\x80-\xff]\N}}\
          {match{$rh_reply-to:}{\N[\x80-\xff]\N}}\
          {match{$rh_sender:}{\N[\x80-\xff]\N}}\
          {match{$rh_subject:}{\N[\x80-\xff]\N}}\
          {match{$rh_to:}{\N[\x80-\xff]\N}}\
        }\
      {yes}{no}}

# Домен не может быть localhost или localdomain
# На "дурака" не проканает. Режем.
#
  defer
    message   = ${domain:$h_from:} is a wrong domain.
    hosts     = ! : !+relay_from_hosts
    condition = ${if match\
      {${domain:$h_from:}}\
      {\N^(localhost|localhost\.local(domain)?|local(domain)?)$\N}\
    {yes}{no}}

# Не принимаем почту с "голых" IP-адресов (RFC 1918)
# С "голых" IP посылаем нахуй. Это 100% спам!
#
  deny hosts   = !+relay_from_hosts
     message = RFC 1918 IP address in HELO.
     condition = ${if match\
     {$sender_helo_name}\
     {\N^(\[)?(10\.[0-9]{1,3}|172\.(1[6-9]|2[0-9]|31)|192\.168)\.[0-9]{1,3}\.[0-9]{1,3}(\])?$\N}\
     {yes}{no}}

# Удаленный хост должен резольвиться
# Не резольвишься? Иннах, спам-бот!
#
  deny hosts   = !+relay_from_hosts
     message = HELO should be hostname.
     condition = ${if !match\
     {$sender_helo_name}\
     {\N.*[A-Za-z].*\N}\
     {yes}{no}}

# Удаленный хост должен иметь FQDN
# Резольвишься как попало? Иннах, спам-бот!
#
  deny hosts   = !+relay_from_hosts
     message = HELO should be Fully Qualified Domain Name  Host.Domain.Tld  See RFC821
     condition = ${if !match\
     {$sender_helo_name}\
     {\N.*[A-Za-z].*\..*[A-Za-z].*\N}\
     {yes}{no}}

# Поврежденные аттачи - фтопку!
# Кривой MIME нам не нужен! Иннах, спам-бот!
#
  deny
    message   = This message contains malformed MIME $demime_reason.
    condition = ${if >\
      {$demime_errorlevel}{2}\
      {1}{0}}

# Виндово-исполняемое говно - фтопку!
# Иннах, инфицированя тачка и/или тупой юзер!
#
  deny
    message = Attachment has unsupported file format .$found_extension. try text, PDF or ODF instead.
    demime  = bat:btm:cmd:com:cpl:dat:dll:exe:lnk:msi:pif:prf:reg:scr:vb:vbs:url

# Проверяем на вирусы
# У меня подкдючен avast.
# Не забываем включить опцию demime в src/EDITME при сборке exim
#
  deny
    message = Message contains a virus or other harmful content ($malware_name)
    demime = *
    malware = *

—————————————————

Вот так, кратенько, с шутками и прибаутками мы срезаем до 99% всевозможного спама.

Проверить с этими правилами работу spamassassin или dspam у меня не было ни возможности, ни времени.
Хотя, все еще впереди :-)

Удачи и поменьше спама вашему хосту.

Sincerelly,
JRoger