Настройка фильтрации спама в связке Postfix и Spamassassin

В статье расскажу как быстренько настроить достаточно неплохую систему фильтрации спама в связке Postfix и Spamassassin. Любого пользователя наличие спама доводит просто до бешенства. Например, на мой основной почтовый ящик ежедневно приходит около 1500 спамерских писем. Разгребать такой ворох ненужного мусора просто нереально. Если бы на моем сервере небыло системы фильтрации спама, то наверное просто бы перестал пользоваться электронной почтой.

Настройка осуществляется на базе почтового сервера, процедура настройки которого была описана ранее в статье «Установка почтового сервера Linux Debian + Postfix + Dovecot + MySQL». К стати, в статью внес изменения 09.09.2012 с поправкой на последние версии программного обеспечения.

Установка программного обеспечения

Для работы нам потребуется сам spamassassin и клиент для работы с ним spamc. Устанавливаем программное обеспечение:

apt-get install spamassassin spamc

Фильтровать почту через spamassassin можно любым MTA. Могу однозначно сказать, что в связке с Postfix и Exim фильтрация работает прекрасно.

Настройка Spamassassin

С настройками по-умолчанию spamassassin отключен. Сейчас мы настроим параметры запуска и права, под которыми будет работать демон spamassassin. По-умолчанию, он работает с правами root. В большинстве случаев это не принципиально, но все же предпочитаю запускать под отдельными пользователями.

Для работы spamassassin создадим пользователя и группу spamd с GID и UID 5001, поскольку в статье ранее 5000 ид мы уже заняли.

# groupadd -g 5001 spamd
# useradd -u 5001 -g spamd -s /sbin/nologin -d /var/lib/spamassassin spamd

Наблюдательные товарищи заметили, что для пользователя указан каталог, которого не существует. В нашем случае — это общий рабочий каталог для spamassassin. Сейчас мы его создадим и назначим соответствующие права доступа:

# mkdir /var/lib/spamassassin
# chown spamd:spamd /var/lib/spamassassin

Теперь переходим к конфигурированию параметров запуска демона. Соответствующие строчки в файле /etc/default/spamassassin необходимо привести к виду:

ENABLED=1
SAHOME="/var/lib/spamassassin/"
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SAHOME} -s ${SAHOME}spamd.log"
PIDFILE="${SAHOME}spamd.pid"

Лог файл нашего spamassassin будет лежать не в /var/log, а в рабочем каталоге в /var/lib/spamassassin/spamd.log.

Конфигурирование параметров работы spamassassin

Даже с параметрами по-умолчанию наш фильтр уже вполне работоспособен, но для более эффективной работы все же стоит их несколько изменить. Открываем конфигурационный файл /etc/spamassassin/local.cf, и соответствующие строки приводим к виду:

rewrite_header Subject [ SPAM # _SCORE_ ]
required_score 2.0
report_safe 0
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1

Теперь наш фильтр будет менять темы писем, которые по его мнению относятся к спаму на [ SPAM # _SCORE_ ], где _SCORE_ — количество баллов отношения к спам рассылке. Чтобы разрешить использование _SCORE_ в параметре rewrite_header, мы должны установить директиву report_safe в положение 0. При этом в тело письма не будет вносится изменений, но к заголовку добавится флаг «X-Spam-«.

Теперь можно запустить демон:

# /etc/init.d/spamassassin start

После запуска проверьте Лог на предмет ошибок.

Настройка связки Postfix и Spamassassin для фильтрации писем через последнего

Открываем конфигурационный файл /etc/postfix/master.cf. Находим строку:

smtp inet n - - - - smtpd

И меняем ее на строку следующего вида:

smtp inet n - - - - smtpd
  -o content_filter=spamassassin

Строки в моем случае и в вашем могут несколько отличаться, но это уже зависит от того на работу по какому алгоритму вы настраивали свой Postfix. Если первая часть строки у вас отличается, то лучше отталкиваться от того, что написано у вас, а не копировать тупо то, что написано в статье. Linux тем и отличается от Windows, что мозги иногда все же стоит включать.

Наконец в самый конец файла добавляем строку:

spamassassin unix - n n - - pipe
    user=spamd argv=/usr/bin/spamc -f -e
    /usr/sbin/sendmail -oi -f ${sender} ${recipient}

В слове spamassassin в количестве букв s для первой и второй инструкции не промахнитесь. Сам из-за этого как-то час потратил на поиск причины сообщения в логах mail transport unavailable.

Теперь перезапускаем Postfix:

# postfix reload

И наслаждаемся работой.

Если что-то не работает, читайте внимательно логи. Там все написано человеческим языком!

Для любителей мне звонить: Бесплатных консультаций по телефону я не оказываю. Могу давать небольшие подсказки на вопросы в комментариях к статьям. Помощь с настройкой вашего сервера может быть оказана только платно!

6 комментария(ев) для “Настройка фильтрации спама в связке Postfix и Spamassassin

  1. Доброе утро!
    настраиваю связку POSTFIX+DOVECOT на UBUNTU 10
    не получается заставить проверять письма, в mail.log нету логов что spamassassin проверил письмо.

    ov 16 09:57:38 mail postfix/master[1228]: reload — version 2.7.0, configuration /etc
    /postfix
    Nov 16 09:57:50 mail postfix/smtpd[1552]: connect from unknown[192.168.100.81]
    Nov 16 09:57:50 mail postfix/smtpd[1552]: setting up TLS connection from unknown[192.1
    68.100.81]
    Nov 16 09:57:50 mail postfix/smtpd[1552]: Anonymous TLS connection established from un
    known[192.168.100.81]: TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)
    Nov 16 09:57:51 mail postfix/smtpd[1552]: 52E9620AED: client=unknown[192.168.100.81],
    sasl_method=PLAIN, sasl_username=test@el.vrn.ru
    Nov 16 09:57:51 mail postfix/cleanup[1561]: 52E9620AED: message-id=
    Nov 16 09:57:51 mail postfix/qmgr[1551]: 52E9620AED: from=, size=225
    4, nrcpt=1 (queue active)
    Nov 16 09:57:51 mail postfix/smtpd[1552]: disconnect from unknown[192.168.100.81]
    Nov 16 09:57:51 mail clamsmtpd: 100000: accepted connection from: 127.0.0.1
    Nov 16 09:57:51 mail postfix/smtpd[1564]: connect from localhost[127.0.0.1]
    Nov 16 09:57:51 mail postfix/smtpd[1564]: 9DDB320AF1: client=unknown[192.168.100.81]
    Nov 16 09:57:52 mail postfix/cleanup[1561]: 9DDB320AF1: message-id=
    Nov 16 09:57:52 mail postfix/qmgr[1551]: 9DDB320AF1: from=, size=229
    1, nrcpt=1 (queue active)
    Nov 16 09:57:52 mail clamsmtpd: 100000: from=test@el.vrn.ru, to=test2@el.vrn.ru, s
    tatus=CLEAN
    Nov 16 09:57:52 mail postfix/smtp[1562]: 52E9620AED: to=, relay=127
    .0.0.1[127.0.0.1]:10025, delay=0.9, delays=0.17/0.06/0.1/0.57, dsn=2.0.0, status=sent
    (250 2.0.0 Ok: queued as 9DDB320AF1)
    Nov 16 09:57:52 mail postfix/smtpd[1564]: disconnect from localhost[127.0.0.1]
    Nov 16 09:57:52 mail postfix/qmgr[1551]: 52E9620AED: removed
    Nov 16 09:57:52 mail postfix/pipe[1570]: 9DDB320AF1: to=, relay=dov
    ecot, delay=1, delays=0.57/0.04/0/0.39, dsn=2.0.0, status=sent (delivered via dovecot
    service)
    Nov 16 09:57:52 mail postfix/qmgr[1551]: 9DDB320AF1: removed

    spamassassin запущен,
    Fri Nov 16 09:54:49 2012 [713] info: logger: removing stderr method
    Fri Nov 16 09:54:57 2012 [778] info: spamd: server started on port 783/tcp (running ve
    rsion 3.3.1)
    Fri Nov 16 09:54:57 2012 [778] info: spamd: server pid: 778
    Fri Nov 16 09:54:57 2012 [778] info: spamd: server successfully spawned child process,
    pid 779
    Fri Nov 16 09:54:57 2012 [778] info: spamd: server successfully spawned child process,
    pid 781
    Fri Nov 16 09:54:57 2012 [778] info: prefork: child states: IS
    Fri Nov 16 09:54:57 2012 [778] info: prefork: child states: II

    Подскажите где я совершил оплошность?

    1. Во-первых логи spamassasin пишутся в spamd.log. По крайней мере так должно быть, если действовали по инструкции.

      Во-вторых, если проверки не происходит, то нет обращения к spamassasin вообще. Соответственно курим конфиг /etc/postfix/master.cf, вероятно там ошибка закралась. ))

  2. Здравствуйте!
    Устанавливал почту в 2011 году, еще со старой версии вашего сайта. Работает все нормально. Недавно заметил вашу статью «Настройка фильтрации спама в связке Postfix и Spamassassin» и захотел применить у себя. Установка прошла как по маслу. И заработала вроде нормально, в логах все проверялось. Но! После перезагрузки MySQL не включается. Видимо что то поменялось во время установки. Подскажите что нужно исправить?

    Nov 15 10:05:31 mail /etc/init.d/mysql[1988]: 0 processes alive and ‘/usr/bin/mysqladmin —defaults-file=/etc/mysql/debian.cnf ping’ resulted in
    Nov 15 10:05:31 mail /etc/init.d/mysql[1988]: #007/usr/bin/mysqladmin: connect to server at ‘localhost’ failed
    Nov 15 10:05:31 mail /etc/init.d/mysql[1988]: error: ‘Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)’
    Nov 15 10:05:31 mail /etc/init.d/mysql[1988]: Check that mysqld is running and that the socket: ‘/var/run/mysqld/mysqld.sock’ exists!
    Nov 15 10:05:31 mail /etc/init.d/mysql[1988]:.

    1. Из куска логов следует только то, что MySQL не запустился. По какой причине — нужно копать в логах MySQL.

      1. Проблема решилась так:
        Попробовал вручную стартануть Mysql выдала ошибку:

        MSERVER:/var/log# mysqld —defaults-file=/etc/mysql/my.cnf
        141120 15:06:36 [ERROR] mysqld: unknown variable ‘lc-messages-dir=/usr/share/mysql’

        удалил строку с lc-messages-dir из файла настроек my.conf и повторил:

        MSERVER:/etc/init.d# /etc/init.d/mysql start
        Starting MySQL database server: mysqld.
        Checking for corrupt, not cleanly closed and upgrade needing tables..
        MSERVER:/etc/init.d#

        Получилось!

        1. А так всегда. После внимательного прочтения логов в голову приходят гениальные мысли о том, как решить проблему! 🙂

Комментарии запрещены.